Panduan untuk Parameter JVM Paling Penting

1. Ikhtisar

Dalam tutorial singkat ini, kita akan menjelajahi opsi paling terkenal yang dapat digunakan untuk mengonfigurasi Java Virtual Machine.

2. Memori Heap Eksplisit - Opsi Xms dan Xmx

Salah satu praktik terkait performa yang paling umum adalah menginisialisasi memori heap sesuai dengan persyaratan aplikasi.

Itulah mengapa kita harus menentukan ukuran heap minimal dan maksimal. Parameter di bawah ini dapat digunakan untuk mencapainya:

-Xms[unit] -Xmx[unit]

Di sini, unit menunjukkan unit tempat memori (ditunjukkan dengan ukuran heap ) akan diinisialisasi. Unit dapat ditandai sebagai 'g' untuk GB, 'm' untuk MB dan 'k' untuk KB.

Misalnya, jika kita ingin menetapkan minimal 2 GB dan maksimal 5 GB ke JVM, kita perlu menulis:

-Xms2G -Xmx5G

Dimulai dengan Java 8, ukuran Metaspace tidak ditentukan. Setelah mencapai batas global, JVM secara otomatis meningkatkannya, Namun, untuk mengatasi ketidakstabilan yang tidak perlu, kita dapat mengatur ukuran Metaspace dengan:

-XX:MaxMetaspaceSize=[unit]

Di sini, ukuran metaspace menunjukkan jumlah memori yang ingin kita tetapkan ke Metaspace .

Sesuai pedoman Oracle, setelah total memori yang tersedia, faktor kedua yang paling berpengaruh adalah proporsi heap yang disediakan untuk Generasi Muda. Secara default, ukuran minimum YG adalah 1310 MB , dan ukuran maksimum tidak terbatas .

Kami dapat menetapkannya secara eksplisit:

-XX:NewSize=[unit] -XX:MaxNewSize=[unit]

3. Pengumpulan Sampah

Untuk stabilitas aplikasi yang lebih baik, pemilihan algoritma Pengumpulan Sampah yang tepat sangat penting.

JVM memiliki empat jenis implementasi GC :

  • Serial Pengumpul Sampah
  • Pengumpul Sampah Paralel
  • Pengumpul Sampah CMS
  • G1 Pengumpul Sampah

Implementasi ini dapat dideklarasikan dengan parameter di bawah ini:

-XX:+UseSerialGC -XX:+UseParallelGC -XX:+USeParNewGC -XX:+UseG1GC

Detail lebih lanjut tentang penerapan Pengumpulan Sampah dapat ditemukan di sini.

4. GC Logging

Untuk memantau kesehatan aplikasi secara ketat, kita harus selalu memeriksa kinerja Pengumpulan Sampah JVM . Cara termudah untuk melakukannya adalah dengan mencatat aktivitas GC dalam format yang dapat dibaca manusia.

Dengan menggunakan parameter berikut, kita dapat mencatat aktivitas GC :

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles= -XX:GCLogFileSize=[ unit ] -Xloggc:/path/to/gc.log

UseGCLogFileRotation menentukan kebijakan bergulir file log, seperti log4j, s4lj, dll. NumberOfGCLogFiles menunjukkan jumlah maksimal file log yang dapat ditulis untuk satu siklus hidup aplikasi. GCLogFileSize menentukan ukuran maksimal file. Terakhir, loggc menunjukkan lokasinya.

Poin yang perlu diperhatikan di sini adalah bahwa, ada dua parameter JVM lagi yang tersedia ( -XX: + PrintGCTimeStamps dan -XX: + PrintGCDateStamps ) yang dapat digunakan untuk mencetak cap waktu berdasarkan tanggal di log GC .

Misalnya, jika kita ingin menetapkan maksimal 100 file log GC , masing-masing memiliki ukuran maksimum 50 MB dan ingin menyimpannya di lokasi ' / home / user / log /' , kita dapat menggunakan sintaks di bawah ini:

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Xloggc:/home/user/log/gc.log

Namun, masalahnya adalah satu utas daemon tambahan selalu digunakan untuk memantau waktu sistem di latar belakang. Perilaku ini dapat membuat beberapa hambatan kinerja; itulah mengapa selalu lebih baik untuk tidak bermain-main dengan parameter ini dalam produksi.

5. Menangani Memori

Sangat umum bagi aplikasi besar untuk menghadapi kesalahan memori yang, pada gilirannya, mengakibatkan aplikasi macet. Ini adalah skenario yang sangat kritis dan sangat sulit untuk ditiru untuk memecahkan masalah.

Itulah mengapa JVM hadir dengan beberapa parameter yang membuang memori heap ke dalam file fisik yang nantinya dapat digunakan untuk mengetahui kebocoran:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid.hprof -XX:OnOutOfMemoryError=";" -XX:+UseGCOverheadLimit

Beberapa hal yang perlu diperhatikan di sini:

  • HeapDumpOnOutOfMemoryError menginstruksikan JVM untuk membuang heap ke file fisik jika terjadi OutOfMemoryError
  • HeapDumpPath menunjukkan jalur tempat file akan ditulis; nama file apa pun dapat diberikan; namun, jika JVM menemukan filedalam nama, id proses dari proses saat ini yang menyebabkan kesalahan kehabisan memori akan ditambahkan ke nama file dengan format .hprof
  • OnOutOfMemoryError digunakan untuk mengeluarkan perintah darurat yang akan dijalankan jika terjadi kesalahan memori; perintah yang tepat harus digunakan di ruang cmd args. Misalnya, jika kita ingin me-restart server segera setelah terjadi kehabisan memori, kita dapat mengatur parameter:
-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit adalah kebijakan yang membatasi proporsi waktu VM yang dihabiskan di GC sebelumkesalahan OutOfMemory dilemparkan

6. 32/64 Bit

Dalam lingkungan OS di mana paket 32 ​​dan 64-bit diinstal, JVM secara otomatis memilih paket lingkungan 32-bit.

Jika kita ingin mengatur lingkungan ke 64 bit secara manual, kita dapat melakukannya dengan menggunakan parameter di bawah ini:

-d

Bit OS bisa berupa 32 atau 64 . Informasi lebih lanjut tentang ini dapat ditemukan di sini.

7. Lain-lain

  • -server : mengaktifkan "Server Hotspot VM"; parameter ini digunakan secara default di 64 bit JVM
  • -XX: + UseStringDeduplication : Java 8u20 telah memperkenalkan parameter JVM ini untuk mengurangi penggunaan memori yang tidak perlu dengan membuat terlalu banyak instance dari String yang sama ; ini mengoptimalkan memori heap dengan menguranginilai String duplikatmenjadi satu larik char [] global
  • -XX: + UseLWPSynchronization : menetapkankebijakan sinkronisasi berbasis LWP ( Light Weight Process ), bukan sinkronisasi berbasis thread
  • -XX: LargePageSizeInBytes : menyetel ukuran halaman besar yang digunakan untuk heap Java; dibutuhkan argumen dalam GB / MB / KB; dengan ukuran halaman yang lebih besar kita dapat memanfaatkan sumber daya perangkat keras memori virtual dengan lebih baik; namun, hal ini dapat menyebabkan ukuran ruang yang lebih besar untuk PermGen , yang pada gilirannya dapat memaksa untuk mengurangi ukuran ruang heap Java
  • -XX: MaxHeapFreeRatio : menyetel persentase maksimum bebas heap setelah GC untuk menghindari penyusutan.
  • -XX: MinHeapFreeRatio : menyetel persentase minimum heap gratis setelah GC untuk menghindari perluasan; untuk memantau penggunaan heap, Anda dapat menggunakan VisualVM yang dikirimkan dengan JDK.
  • -XX: SurvivorRatio : Rasio ukuran ruang eden / survivor - misalnya, -XX: SurvivorRatio = 6 menetapkan rasio antara setiap ruang survivor dan ruang eden menjadi 1: 6,
  • -XX: + UseLargePages : gunakan memori halaman besar jika didukung oleh sistem; perlu diketahui bahwa OpenJDK 7 cenderung crash jika menggunakan parameter JVM ini

  • -XX: + UseStringCache : mengaktifkan caching untuk string yang dialokasikan secara umum yang tersedia dikumpulan String

  • -XX: + UseCompressedStrings : gunakan tipe [] byte untukobjek String yang dapat direpresentasikan dalam format ASCII murni
  • -XX: + OptimizeStringConcat : ini mengoptimalkanoperasi penggabungan String jika memungkinkan

8. Kesimpulan

Dalam artikel singkat ini, kami mempelajari tentang beberapa parameter JVM yang penting - yang dapat digunakan untuk menyesuaikan dan meningkatkan kinerja aplikasi secara umum.

Beberapa di antaranya juga dapat digunakan untuk tujuan debugging.

Jika Anda ingin menjelajahi parameter referensi secara lebih detail, Anda dapat memulai di sini.