Rumah >Peranti teknologi >industri IT >Apa yang dilakukan oleh mesin maya Java sepanjang hari?

Apa yang dilakukan oleh mesin maya Java sepanjang hari?

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌asal
2025-02-08 10:02:08271semak imbas

What Does the Java Virtual Machine Do All Day?

Artikel ini pada asalnya diterbitkan oleh pengkomputeran ampere

Saya melihat catatan blog baru -baru ini mengenai GPROFNG, alat analisis prestasi GNU baru. Blog ini menggunakan program pendaraban vektor matriks yang ditulis dalam bahasa C sebagai contoh. Saya seorang pengaturcara Java ™ dan menggunakan alat yang direka untuk pengaturcaraan C yang disusun secara statik sering sukar untuk menganalisis aplikasi Java kerana program Java disusun semasa runtime. Dalam catatan blog ini, saya akan menunjukkan bahawa GPROFNG mudah digunakan dan sangat berguna untuk menyelidiki tingkah laku dinamik aplikasi Java.

Langkah pertama ialah menulis program pendaraban matriks. Saya menulis program matriks pendaraban matriks lengkap kerana ia tidak lebih sukar daripada vektor pendaraban matriks. Terdapat tiga kaedah utama: satu kaedah mengira operasi pendaraban dan tambahan yang paling dalam, satu kaedah menggabungkan operasi pendaraban dan penambahan ke dalam satu elemen hasil, dan satu kaedah melangkah ke atas setiap elemen hasilnya.

Saya membungkus pengiraan dalam program ujian mudah untuk berulang kali mengira produk matriks untuk memastikan bahawa masa itu berulang. (Lihat Nota 1.) Program ini mencetak masa apabila setiap pendaraban matriks bermula (berbanding dengan masa apabila mesin maya Java dimulakan), dan masa yang diperlukan untuk setiap pendaraban matriks. Di sini saya menjalankan program ujian untuk membiak dua matriks 8000 × 8000. Program ujian mengulangi pengiraan 11 kali, dan untuk lebih baik menyerlahkan tingkah laku berikutnya, tidur untuk 920 milisaat antara pengulangan:

<code class="language-bash">$ numactl --cpunodebind=0 --membind=0 -- \
java -XX:+UseParallelGC -Xms31g -Xmx31g -Xlog:gc -XX:-UsePerfData \
  MxV -m 8000 -n 8000 -r 11 -s 920</code>

What Does the Java Virtual Machine Do All Day? Rajah 1: Menjalankan program pendaraban matriks

Sila ambil perhatian bahawa pengulangan kedua mengambil 92% masa pengulangan pertama, sementara pengulangan terakhir hanya mengambil 89% dari masa pengulangan pertama. Perubahan dalam masa pelaksanaan mengesahkan bahawa program Java memerlukan sedikit masa untuk memanaskan badan.

Persoalannya ialah: Bolehkah saya menggunakan GPROFNG untuk melihat apa yang berlaku antara pengulangan pertama dan terakhir, mengakibatkan peningkatan prestasi?

Salah satu cara untuk menjawab soalan ini adalah untuk menjalankan program ini dan mempunyai gprofng mengumpul maklumat berjalan. Nasib baik, ini mudah: Saya hanya perlu awalan baris arahan untuk mengumpul maklumat "Eksperimen" GPROFNG:

<code class="language-bash">$ numactl --cpunodebind=0 --membind=0 -- \
gprofng collect app \
    java -XX:+UseParallelGC -Xms31g -Xmx31g -Xlog:gc --XX:-UsePerfData \
        MxV -m 8000 -n 8000 -r 11 -s 920</code>

Rajah 2: Menjalankan program pendaraban matriks di bawah gprofng What Does the Java Virtual Machine Do All Day?

Perkara pertama yang perlu diperhatikan ialah, seperti mana -mana alat analisis prestasi, mengumpul maklumat analisis prestasi boleh menelan kos permohonan. Berbanding dengan larian unanalysed sebelumnya, GPROFNG tidak kelihatan menyebabkan overhead yang ketara. Saya kemudian boleh bertanya bagaimana masa dibelanjakan dalam gprofng keseluruhan permohonan. (Lihat Nota 2.) Untuk keseluruhan larian, 24 kaedah GPROFNG yang paling popular adalah:

Rajah 3: 24 cara untuk menunjukkan gprofng yang paling hangat

Paparan fungsi yang ditunjukkan di atas memberikan masa CPU eksklusif dan kemasukan untuk setiap kaedah, yang dinyatakan dalam peratusan saat dan jumlah masa CPU. Fungsi yang dinamakan adalah fungsi pseudo yang dihasilkan oleh GPROFNG, dengan jumlah nilai pelbagai petunjuk. Dalam kes ini, saya melihat bahawa jumlah masa CPU keseluruhan permohonan adalah 1.201 saat.

kaedah aplikasi (yang berasal dari kelas MXV) semuanya di dalamnya, menduduki sebahagian besar masa CPU, tetapi terdapat beberapa kaedah lain, termasuk pengkompil runtime JVM (kompilasi :: kompilasi), dan fungsi lain yang bukan sebahagian daripada Program pendaraban matriks. Paparan keseluruhan pelaksanaan program ini menangkap kod peruntukan (mxv.allocate) dan inisialisasi (mxv.initialize), yang saya tidak begitu berminat kerana mereka adalah sebahagian daripada program ujian, hanya digunakan semasa permulaan, dan didarabkan Dengan matriks ia tidak penting.

Saya boleh menggunakan gprofng untuk mengikuti bahagian -bahagian aplikasi yang saya minati. Ciri hebat GPROFNG ialah selepas mengumpul eksperimen, saya boleh menggunakan penapis pada data yang dikumpulkan. Sebagai contoh, lihat apa yang berlaku semasa selang masa tertentu, atau apa yang berlaku apabila kaedah tertentu berada pada timbunan panggilan. Untuk tujuan demonstrasi dan membuat penapisan lebih mudah, saya menambah panggilan strategik ke Thread.Sleep (MS) untuk memudahkan menulis penapis berdasarkan fasa program (dibahagikan dengan satu selang kedua). Inilah sebabnya output program dalam Rajah 1 di atas adalah kira -kira satu saat antara setiap pengulangan, walaupun setiap pendaraban matriks hanya mengambil masa kira -kira 0.1 saat.

gprofng boleh ditulis, jadi saya menulis skrip untuk mengekstrak satu saat dari eksperimen GPROFNG. Yang kedua adalah mengenai permulaan mesin maya Java.

What Does the Java Virtual Machine Do All Day?

Rajah 4: Kaedah paling hangat untuk menapis detik pertama. Dalam kedua ini, pendaraban matriks telah ditangguhkan secara manual supaya saya dapat menunjukkan permulaan JVM

Saya dapat melihat bahawa pengkompil bermula pada runtime (mis. Penyusunan :: COMPILE_JAVA_METHOD, 16% masa CPU), walaupun mana -mana kaedah aplikasi belum berjalan lagi. (Panggilan pendaraban matriks ditangguhkan oleh panggilan tidur yang saya masukkan.)

yang kedua adalah satu saat, di mana kaedah peruntukan dan permulaan yang dijalankan dengan pelbagai kaedah JVM, tetapi kod pendaraban matriks belum dimulakan lagi.

What Does the Java Virtual Machine Do All Day?

Rajah 5: Kaedah paling hangat pada detik kedua. Peruntukan matriks dan permulaan bersaing dengan permulaan JVM

Sekarang bahawa permulaan JVM dan peruntukan dan permulaan array telah selesai, terdapat pengulangan pertama kod pendaraban matriks pada kedua kedua, seperti yang ditunjukkan dalam Rajah 6. Tetapi ambil perhatian bahawa kod pendaraban matriks bersaing dengan pengkompil runtime Java (mis.

Walaupun demikian, kod pendaraban matriks (mis., "Termasuk" masa dalam kaedah MXV.Main, 91%) masih memperoleh sebahagian besar masa CPU. Masa kemasukan menunjukkan bahawa pendaraban matriks (mis., MXV.Multiply) mengambil masa 0.100 cpu, yang selaras dengan masa sebenar yang dilaporkan oleh aplikasi dalam Rajah 2. .

What Does the Java Virtual Machine Do All Day? Rajah 6: Kaedah paling hangat pada kedua kedua, menunjukkan bahawa pengkompil runtime bersaing dengan kaedah pendaraban matriks

Dalam contoh ini, pendaraban matriks tidak benar -benar bersaing untuk masa CPU, kerana ujian dijalankan pada sistem multiprossor yang mempunyai sejumlah besar kitaran terbiar dan pengkompil runtime berjalan sebagai benang yang berasingan. Dalam kes yang lebih ketat, seperti pada mesin yang dikongsi dengan beban berat, 8% masa yang dibelanjakan oleh pengkompil runtime boleh menjadi masalah. Sebaliknya, masa yang dibelanjakan dalam pengkompil runtime menghasilkan pelaksanaan kaedah yang lebih efisien, jadi jika saya mengira banyak pendaraban matriks, ia akan menjadi pelaburan yang saya bersedia buat.

Pada detik kelima, kod pendaraban matriks mempunyai mesin maya Java.

Rajah 7: Semua kaedah yang dijalankan semasa kedua kelima, menunjukkan bahawa hanya kaedah pendaraban matriks aktif What Does the Java Virtual Machine Do All Day?

Sila perhatikan peruntukan 60%/30%/10%antara MXV.onecell, MXV.Multiplyadd dan MXV.Multiply dari segi detik CPU eksklusif. Kaedah mxv.multiplyadd hanya mengira pendaraban dan penambahan: tetapi ia adalah kaedah paling dalam dalam pendaraban matriks. Mxv.onecell mempunyai gelung untuk memanggil mxv.multiplyadd. Saya dapat melihat bahawa overhead gelung dan panggilan (keadaan penilaian dan pemindahan kawalan) berfungsi lebih tinggi daripada operasi aritmetik langsung di mxv.multiplyadd. (MXV.Onecell mempunyai masa eksklusif 0.060 CPU saat, manakala MXV.MultiplyAdd adalah 0.030 CPU saat, mencerminkan perbezaan ini.) Kekerapan pelaksanaan gelung luar dalam MXV.Multiply tidak cukup tinggi sehingga penyusun runtime belum disusun. , tetapi kaedah itu menggunakan 0.010 CPU saat. pendaraban matriks terus kedua kesembilan, apabila pengkompil runtime JVM bermula lagi dan mendapati bahawa MXV.Multiply telah menjadi sangat panas.

Dalam pengulangan terakhir, kod pendaraban matriks memanfaatkan sepenuhnya mesin maya Java.

What Does the Java Virtual Machine Do All Day?

Rajah 9: Pengulangan terakhir program pendaraban matriks, menunjukkan konfigurasi akhir kod

Kesimpulan

Saya telah menunjukkan kemudahan mudah untuk mendapatkan aplikasi Java dengan menggunakan GPROFNG untuk analisis prestasi. Menggunakan fungsi penapisan GPROFNG untuk memeriksa eksperimen dengan slice masa, saya dapat menyemak peringkat program yang menarik. Sebagai contoh, tidak termasuk fasa peruntukan dan permulaan aplikasi dan hanya menunjukkan satu pengulangan program apabila pengkompil runtime menjalankan sihirnya membolehkan saya menyerlahkan prestasi yang bertambah baik apabila kod panas secara beransur -ansur disusun.

bacaan selanjutnya

Bagi pembaca yang ingin mengetahui tentang GPROFNG, di sini adalah catatan blog dengan video pengenalan mengenai GPROFNG, termasuk arahan mengenai cara memasangnya di Oracle Linux.

Penghargaan

terima kasih kepada Ruud van der Pas, Kurt Goebel dan Vladimir Mezentsev atas nasihat dan sokongan teknikal mereka, dan kepada Elena Zannoni, David Banman, Craig Hardy dan Dave Neary kerana menggalakkan saya menulis postingan blog ini.

nota

  1. Motivasi komponen baris perintah program adalah:
  • numActl --cpUnodeBind = 0 --MBind = 0 -. Hadkan memori yang digunakan oleh mesin maya Java ke teras dan ingatan node NUMA. Mengehadkan JVM ke satu nod dapat mengurangkan perbezaan antara program yang dijalankan.
  • java. Saya menggunakan versi OpenJDK JDK-17.0.4.1 dari AARCH64.
  • -xx: useParallelgc. Dayakan pemungut sampah selari kerana ia melakukan kerja latar belakang yang minimum dalam pengumpul yang ada.
  • -xms31g -xmx31g. Menyediakan ruang tumpukan objek Java yang cukup dan tidak memerlukan pengumpulan sampah.
  • -xlog: gc. Rekod aktiviti GC untuk mengesahkan bahawa tidak perlu dikumpulkan. ("Percayalah tetapi sahkan.")
  • -xx: -USEPERFDATA. Kurangkan overhead mesin maya Java.
  1. Penjelasan pilihan gprofng adalah:
  • -Limit 24. Hanya 24 kaedah pertama yang dipaparkan (disusun mengikut masa CPU eksklusif di sini). Saya dapat melihat bahawa menunjukkan 24 kaedah memberi saya idea yang baik tentang mereka yang tidak menggunakan masa. Kemudian, saya akan menggunakan had 16 di beberapa tempat, di mana 16 kaedah dapat dikurangkan kepada mereka yang menyumbang masa CPU remeh. Dalam beberapa contoh, GPROFNG sendiri mengehadkan paparan, kerana tidak ada banyak kaedah yang mengumpul masa.
  • -ViewMode Expert. Kaedah -kaedah yang memaparkan semua masa CPU kumulatif, bukan hanya kaedah Java, termasuk JVM itu sendiri. Menggunakan bendera ini membolehkan saya melihat kaedah pengkompil runtime, dll.

Atas ialah kandungan terperinci Apa yang dilakukan oleh mesin maya Java sepanjang hari?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn