1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita akan meneroka pilihan yang paling terkenal yang boleh digunakan untuk mengkonfigurasi Mesin Maya Java.
2. Memori Heap Eksplisit - Pilihan Xms dan Xmx
Salah satu amalan yang berkaitan dengan prestasi yang paling biasa adalah dengan menginisialisasi memori timbunan sesuai dengan keperluan aplikasi.
Itulah sebabnya kita harus menentukan ukuran timbunan minimum dan maksimum. Parameter di bawah boleh digunakan untuk mencapainya:
-Xms[unit] -Xmx[unit]
Di sini, unit menunjukkan unit di mana memori (ditunjukkan dengan ukuran timbunan ) akan diinisialisasi. Unit boleh ditandakan sebagai 'g' untuk GB, 'm' untuk MB dan 'k' untuk KB.
Sebagai contoh, jika kita ingin memberikan minimum 2 GB dan maksimum 5 GB ke JVM, kita perlu menulis:
-Xms2G -Xmx5G
Bermula dengan Java 8, ukuran Metaspace tidak ditentukan. Setelah mencapai had global, JVM secara automatik meningkatkannya, Namun, untuk mengatasi ketidakstabilan yang tidak perlu, kita dapat menetapkan ukuran Metaspace dengan:
-XX:MaxMetaspaceSize=[unit]
Di sini, ukuran metaspace menunjukkan jumlah memori yang ingin kita tetapkan kepada Metaspace .
Menurut garis panduan Oracle, setelah jumlah memori yang tersedia, faktor kedua yang paling berpengaruh adalah bahagian timbunan yang diperuntukkan untuk Generasi Muda. Secara lalai, ukuran minimum YG ialah 1310 MB , dan saiz maksimum tidak terhad .
Kami dapat memberikannya secara jelas:
-XX:NewSize=[unit] -XX:MaxNewSize=[unit]
3. Pengumpulan Sampah
Untuk kestabilan aplikasi yang lebih baik, memilih algoritma Pengumpulan Sampah yang betul adalah penting.
JVM mempunyai empat jenis pelaksanaan GC :
- Pemungut Siri Bersiri
- Pemungut Sampah Selari
- Pemungut Sampah CMS
- Pemungut Sampah G1
Pelaksanaan ini dapat dinyatakan dengan parameter berikut:
-XX:+UseSerialGC -XX:+UseParallelGC -XX:+USeParNewGC -XX:+UseG1GC
Maklumat lanjut mengenai pelaksanaan Koleksi Sampah boleh didapati di sini.
4. Pembalakan GC
Untuk memantau kesihatan aplikasi dengan ketat, kita harus selalu memeriksa prestasi Pengumpulan Sampah JVM . Cara termudah untuk melakukan ini adalah mencatat aktiviti GC dalam format yang boleh dibaca oleh manusia.
Dengan menggunakan parameter berikut, kita dapat mencatat aktiviti GC :
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles= -XX:GCLogFileSize=[ unit ] -Xloggc:/path/to/gc.log
UseGCLogFileRotation menentukan polisi penggulingan fail log, seperti log4j, s4lj, dll. NumberOfGCLogFiles menunjukkan bilangan maksimum fail log yang boleh ditulis untuk satu kitaran hayat aplikasi. GCLogFileSize menentukan ukuran maksimum fail. Akhirnya, loggc menunjukkan lokasinya.
Yang perlu diperhatikan di sini ialah, ada dua lagi parameter JVM yang tersedia ( -XX: + PrintGCTimeStamps dan -XX: + PrintGCDateStamps ) yang dapat digunakan untuk mencetak cap waktu sesuai tarikh di log GC .
Sebagai contoh, jika kita ingin memberikan maksimum 100 fail log GC , masing-masing mempunyai ukuran maksimum 50 MB dan ingin menyimpannya di lokasi ' / home / user / log /' , kita dapat menggunakan sintaks di bawah:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Xloggc:/home/user/log/gc.log
Namun, masalahnya ialah satu utas daemon tambahan selalu digunakan untuk memantau waktu sistem di latar belakang. Tingkah laku ini mungkin menimbulkan sedikit masalah; sebab itu selalu lebih baik untuk tidak bermain dengan parameter ini dalam pengeluaran.
5. Mengendalikan Memori
Sangat biasa bagi aplikasi yang besar untuk menghadapi ralat ingatan yang seterusnya mengakibatkan aplikasi hancur. Ini adalah senario yang sangat kritikal dan sukar ditiru untuk menyelesaikan masalah tersebut.
Itulah sebabnya JVM dilengkapi dengan beberapa parameter yang membuang memori timbunan ke dalam fail fizikal yang boleh digunakan kemudian untuk mengetahui kebocoran:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid.hprof -XX:OnOutOfMemoryError=";" -XX:+UseGCOverheadLimit
Beberapa perkara yang perlu diperhatikan di sini:
- HeapDumpOnOutOfMemoryError mengarahkan JVM untuk membuang timbunan ke dalam fail fizikal sekiranya berlaku OutOfMemoryError
- HeapDumpPath menunjukkan jalan di mana fail hendak ditulis; sebarang nama fail boleh diberikan; namun, jika JVM menemui atag pada nama, id proses dari proses semasa yang menyebabkan kehabisan memori akan ditambahkan ke nama fail dengan format .hprof
- OnOutOfMemoryError digunakan untuk mengeluarkan arahan kecemasan yang akan dilaksanakan sekiranya terdapat kesilapan memori; perintah yang betul harus digunakan di ruang cmd args. Sebagai contoh, jika kita mahu memulakan semula pelayan sebaik sahaja kehabisan memori berlaku, kita dapat menetapkan parameter:
-XX:OnOutOfMemoryError="shutdown -r"
- UseGCOverheadLimit adalah polisi yang mengehadkan bahagian masa VM yang dihabiskan di GC sebelumkesalahan OutOfMemory dilemparkan
6. 32/64 Bit
Dalam persekitaran OS di mana kedua-dua pakej 32 dan 64-bit dipasang, JVM secara automatik memilih pakej persekitaran 32-bit.
Sekiranya kita ingin menetapkan persekitaran ke 64 bit secara manual, kita dapat melakukannya menggunakan parameter di bawah:
-d
Bit OS boleh menjadi 32 atau 64 . Maklumat lebih lanjut mengenai ini boleh didapati di sini.
7. Pelbagai
- -server : membolehkan "Server Hotspot VM"; parameter ini digunakan secara lalai dalam JVM 64 bit
- -XX: + UseStringDeduplication : Java 8u20 telah memperkenalkan parameter JVM ini untuk mengurangkan penggunaan memori yang tidak perlu dengan membuat terlalu banyak contoh String yang sama ; ini mengoptimumkan memori timbunan dengan mengurangkannilai String penduakepada array char global tunggal
- -XX: + UseLWPS Synchronization : menetapkandasar penyegerakan berdasarkan LWP ( Ringan Proses ) dan bukannya penyegerakan berasaskan utas
- -XX: LargePageSizeInBytes : menetapkan ukuran halaman besar yang digunakan untuk timbunan Java; ia memerlukan hujah dalam GB / MB / KB; dengan saiz halaman yang lebih besar kita dapat memanfaatkan sumber perkakasan memori maya dengan lebih baik; namun, ini dapat menyebabkan ukuran ruang lebih besar untuk PermGen , yang pada gilirannya dapat memaksa untuk mengurangkan ukuran ruang timbunan Java
- -XX: MaxHeapFreeRatio : menetapkan peratusan maksimum timbunan bebas selepas GC untuk mengelakkan penyusutan.
- -XX: MinHeapFreeRatio : menetapkan peratusan minimum timbunan percuma selepas GC untuk mengelakkan pengembangan; untuk memantau penggunaan timbunan anda boleh menggunakan VisualVM yang dihantar bersama JDK.
- -XX: SurvivorRatio : Nisbah saiz ruang eden / survivor - sebagai contoh, -XX: SurvivorRatio = 6 menetapkan nisbah antara setiap ruang yang selamat dan ruang eden menjadi 1: 6,
- -XX: + UseLargePages : gunakan memori halaman besar jika disokong oleh sistem; harap maklum bahawa OpenJDK 7 cenderung mogok jika menggunakan parameter JVM ini
- -XX: + UseStringCache : membolehkan cache rentetan yang diperuntukkan biasanya terdapat dikolam String
- -XX: + UseCompressedStrings : gunakan jenis byte [] untukobjek String yang dapat diwakili dalam format ASCII tulen
- -XX: + OptimizeStringConcat : ia mengoptimumkanoperasi gabungan String jika mungkin
8. Kesimpulannya
Dalam artikel ringkas ini, kami mempelajari beberapa parameter penting JVM - yang dapat digunakan untuk menyesuaikan dan meningkatkan prestasi aplikasi umum.
Sebahagian daripadanya juga dapat digunakan untuk tujuan debugging.
Sekiranya anda ingin meneroka parameter rujukan dengan lebih terperinci, anda boleh bermula di sini.