Alat Baris Perintah untuk Menemukan Ukuran Heap Java

1. Ikhtisar

Dalam tutorial singkat ini, kita akan mempelajari beberapa cara berbeda untuk mendapatkan ukuran heap dari aplikasi Java yang sedang berjalan.

2. jcmd

Untuk menemukan info terkait heap dan metaspace dari aplikasi Java yang sedang berjalan, kita dapat menggunakan utilitas baris perintah jcmd :

jcmd GC.heap_info

Pertama, mari kita temukan id proses dari aplikasi Java tertentu menggunakan perintah 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 kita adalah 4309. Sekarang kita memiliki id proses, mari kita lihat info heap:

$ 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 G1 atau algoritma GC yang mengutamakan sampah:

  • Baris pertama melaporkan ukuran heap saat ini sebagai 202 MB (206848 K) - juga, 42 MB (43061 K) sedang digunakan
  • Wilayah G1 berukuran 1 MB, ada 43 wilayah yang tergolong muda, dan 3 wilayah sebagai survivor
  • Kapasitas metaspace saat ini sekitar 13,5 MB (13724 K). Dari 13,5 MB itu, sekitar 12,5 MB (12983 K) digunakan. Selain itu, kami dapat memiliki metaspace hingga 1 GB (1048576 K). Selain itu, 13842 KB dijamin akan tersedia untuk digunakan oleh mesin virtual Java, juga dikenal sebagai memori yang berkomitmen
  • Baris terakhir menunjukkan berapa banyak metaspace yang digunakan untuk menyimpan informasi kelas

Output ini dapat berubah tergantung pada algoritma GC . Misalnya, 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 heap dan sekitar 20 MB metaspace. Sampai tulisan ini dibuat, Intellij IDEA masih menggunakan CMS GC dengan info heap 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

Kita dapat melihat sifat generasi klasik CMS GC dalam konfigurasi heap.

3. jstat

Selain jcmd , kita dapat menggunakan jstat untuk mengetahui informasi yang sama dari aplikasi yang sedang berjalan. Misalnya, kita dapat menggunakan jstat -gc untuk melihat statistik heap:

$ 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 kolom mewakili kapasitas memori atau pemanfaatan area memori tertentu:

  • S0C - Kapasitas ruang penyintas pertama
  • S1C - Kapasitas ruang penyintas kedua
  • S0U - Ruang bekas orang yang selamat pertama
  • S1U - Ruang bekas korban kedua
  • EC - Kapasitas ruang Eden
  • EU - Ruang bekas pakai dari Eden
  • OC - ​​Kapasitas generasi lama
  • OU - Ruang bekas pakai dari generasi lama
  • MC - Kapasitas metaspace
  • MU - Ruang yang digunakan dari Metaspace
  • CCSC - Kapasitas ruang kelas terkompresi
  • CCSU - Ruang yang digunakan untuk kelas yang dikompresi
  • YGC - Jumlah GC minor
  • YGCT - Waktu yang dihabiskan untuk GC minor
  • FGC - Jumlah GC penuh
  • FGCT - Waktu yang dihabiskan untuk GC penuh
  • CGC - Jumlah GC serentak
  • CGCT - Waktu yang dihabiskan untuk GC bersamaan
  • GCT - Waktu yang dihabiskan untuk semua GC

Ada opsi terkait memori lainnya untuk jstat seperti:

  • The -gccapacity melaporkan kapasitas yang berbeda untuk daerah memori yang berbeda
  • The -gcutil hanya menunjukkan persentase pemanfaatan masing-masing daerah
  • -Gccause sama dengan -gcutil tetapi menambahkan penyebab GC terakhir dan kemungkinan kejadian GC saat ini

4. Baris Perintah Arg

Jika kita menjalankan aplikasi Java dengan pilihan konfigurasi tumpukan (misalnya, -Xms dan Xmx ), maka ada beberapa trik lain untuk menemukan nilai-nilai yang ditetapkan.

Misalnya, berikut ini cara jps melaporkan nilai tersebut:

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

Dengan pendekatan ini, kami hanya dapat menemukan nilai-nilai statis ini. Jadi, tidak ada cara untuk mengetahui, katakanlah, memori yang berkomitmen saat ini .

Selain jps , beberapa alat lain akan melaporkan hal yang sama. Misalnya, "jcmd VM.command_line" juga akan melaporkan detail berikut:

$ 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

Selain itu, pada kebanyakan sistem berbasis Unix kita dapat menggunakan ps dari paket procps :

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

Terakhir, di Linux, kita dapat menggunakan sistem file virtual / proc dan file pidnya:

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

File cmdline , dalam direktori yang dinamai setelah Quarkus pid, berisi entri baris perintah untuk aplikasi tersebut.

5. Kesimpulan

Dalam tutorial singkat ini, kami melihat beberapa cara berbeda untuk mendapatkan ukuran heap dari aplikasi Java yang sedang berjalan.