Alat Baris Perintah untuk Mencari Ukuran Tumpukan Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan membiasakan diri dengan beberapa cara untuk mendapatkan ukuran aplikasi Java yang sedang berjalan.

2. jcmd

Untuk mencari maklumat berkaitan heap dan metaspace dari aplikasi Java yang sedang berjalan, kita dapat menggunakan utiliti baris perintah jcmd :

jcmd GC.heap_info

Pertama, mari cari id proses aplikasi Java tertentu menggunakan arahan jps :

$ jps -l 73170 org.jetbrains.idea.maven.server.RemoteMavenServer36 4309 quarkus.jar 12070 sun.tools.jps.Jps

Seperti yang ditunjukkan di atas, id proses untuk aplikasi Quarkus kami adalah 4309. Sekarang setelah kami mempunyai id proses, mari lihat maklumat timbunan:

$ jcmd 4309 GC.heap_info 4309: garbage-first heap total 206848K, used 43061K region size 1024K, 43 young (44032K), 3 survivors (3072K) Metaspace used 12983K, capacity 13724K, committed 13824K, reserved 1060864K class space used 1599K, capacity 1740K, committed 1792K, reserved 1048576K

Aplikasi ini menggunakan algoritma G1 atau GC pertama sampah:

  • Baris pertama melaporkan ukuran timbunan semasa sebagai 202 MB (206848 K) - juga, 42 MB (43061 K) sedang digunakan
  • Kawasan G1 adalah 1 MB, ada 43 wilayah yang ditandai sebagai muda, dan 3 sebagai ruang selamat
  • Kapasiti metaspace semasa adalah sekitar 13.5 MB (13724 K). Dari 13.5 MB itu, sekitar 12.5 MB (12983 K) digunakan. Kita juga dapat memiliki metaspace hingga 1 GB (1048576 K). Lebih-lebih lagi, 13842 KB dijamin tersedia untuk digunakan oleh mesin maya Java, juga dikenal sebagai memori komited
  • Baris terakhir menunjukkan berapa banyak metaspace digunakan untuk menyimpan maklumat kelas

Output ini mungkin berubah bergantung pada algoritma GC . Sebagai contoh, jika kita menjalankan aplikasi Quarkus yang sama dengan ZGC melalui "-XX: + UnlockExperimentalVMOptions -XX: + UseZGC" :

ZHeap used 28M, capacity 200M, max capacity 1024M Metaspace used 21031K, capacity 21241K, committed 21504K, reserved 22528K

Seperti yang ditunjukkan di atas, kami menggunakan 28 MB timbunan dan sekitar 20 MB metaspace. Pada penulisan ini, Intellij IDEA masih menggunakan CMS GC dengan maklumat timbunan berikut:

par new generation total 613440K, used 114299K eden space 545344K, 18% used from space 68096K, 16% used to space 68096K, 0% used concurrent mark-sweep generation total 1415616K, used 213479K Metaspace used 423107K, capacity 439976K, committed 440416K, reserved 1429504K class space used 55889K, capacity 62488K, committed 62616K, reserved 1048576K

Kami dapat melihat sifat generasi klasik CMS GC dalam konfigurasi timbunan.

3. jstat

Selain jcmd , kita dapat menggunakan jstat untuk mengetahui maklumat yang sama dari menjalankan aplikasi. Sebagai contoh, kita boleh menggunakan jstat -gc untuk melihat statistik timbunan:

$ jstat -gc 4309 S0C S1C S0U S1U EC EU OC OU MC 0.0 0.0 0.0 0.0 129024.0 5120.0 75776.0 10134.6 20864.0 MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCTGCT 19946.2 2688.0 2355.0 2 0.007 1 0.020 0 0.000 0.027

Setiap lajur menunjukkan kapasiti memori atau penggunaan kawasan memori tertentu:

  • S0C - Kapasiti untuk ruang selamat pertama
  • S1C - Kapasiti untuk ruang selamat kedua
  • S0U - Ruang terpakai yang pertama selamat
  • S1U - Ruang bekas mangsa kedua
  • EC - Kapasiti ruang Eden
  • EU - Ruang terpakai dari Eden
  • OC - ‚Äč‚ÄčKapasiti generasi lama
  • OU - Ruang terpakai dari generasi Lama
  • MC - Kapasiti Metaspace
  • MU - Ruang terpakai dari Metaspace
  • CCSC - Kapasiti ruang kelas termampat
  • CCSU - Ruang terpakai untuk kelas termampat
  • YGC - Bilangan GC kecil
  • YGCT - Masa yang dihabiskan untuk GC kecil
  • FGC - Bilangan GC penuh
  • FGCT - Masa yang dihabiskan untuk GC penuh
  • CGC - Bilangan GC serentak
  • CGCT - Masa yang dihabiskan untuk GC serentak
  • GCT - Masa yang dihabiskan untuk semua GC

Terdapat pilihan lain yang berkaitan dengan memori untuk jstat seperti:

  • The -gccapacity untuk melaporkan kapasiti yang berbeza untuk kawasan memori yang berbeza
  • The -gcutil hanya menunjukkan peratusan penggunaan setiap wilayah
  • The -gccause sama dengan -gcutil tetapi menambah punca GC terakhir dan kemungkinan peristiwa GC semasa

4. Arg-Line Perintah

Sekiranya kita menjalankan aplikasi Java dengan pilihan konfigurasi timbunan (misalnya, -Xms dan -Xmx ), maka ada beberapa trik lain untuk mencari nilai yang ditentukan.

Contohnya, inilah cara jps melaporkan nilai-nilai tersebut:

$ jps -lv 4309 quarkus.jar -Xms200m -Xmx1g

Dengan pendekatan ini, kita hanya dapat mencari nilai statik ini. Oleh itu, tidak ada cara untuk mengetahui tentang, katakanlah, ingatan komitmen semasa .

Selain jps , beberapa alat lain akan melaporkan perkara yang sama. Sebagai contoh, "jcmd VM.command_line" juga akan melaporkan butiran ini:

$ jcmd 4309 VM.command_line 4309: VM Arguments: jvm_args: -Xms200m -Xmx1g java_command: quarkus.jar java_class_path (initial): quarkus.jar Launcher Type: SUN_STANDARD

Juga, pada kebanyakan sistem berasaskan Unix kita dapat menggunakan ps dari pakej procps :

$ ps -ef | grep quarkus ... java -Xms200m -Xmx1g -jar quarkus.jar

Akhirnya, di Linux, kita dapat menggunakan sistem fail maya / proc dan fail pidnya:

$ cat /proc/4309/cmdline java -Xms200m -Xmx1g -jar quarkus.jar

The CmdLine fail, direktori bernama selepas pid Quarkus, mengandungi kemasukan baris arahan untuk aplikasi.

5. Kesimpulan

Dalam tutorial ringkas ini, kami melihat beberapa cara yang berbeda untuk mendapatkan ukuran timbunan aplikasi Java yang sedang berjalan.