Tumpukan Pengaturan
-XMX3550M: Atur memori heap maksimum JVM ke 3550m.
-XMS3550M: Atur memori tumpukan awal JVM ke 3550m. Nilai ini dapat diatur sama dengan -xmx untuk menghindari memori realokasi JVM setiap kali pengumpulan sampah selesai.
-XSS128K: Atur ukuran tumpukan setiap utas. Setelah JDK5.0, setiap ukuran tumpukan utas akan 1m, dan sebelum itu, setiap ukuran tumpukan utas akan 256K. Itu harus disesuaikan sesuai dengan ukuran memori yang diperlukan dari utas aplikasi. Dalam memori fisik yang sama, mengurangi nilai ini dapat menghasilkan lebih banyak utas. Namun, sistem operasi masih memiliki batas jumlah utas dalam suatu proses dan tidak dapat dihasilkan secara tak terbatas, dengan nilai pengalaman mulai dari sekitar 3000 hingga 5.000.
-Xmn2g: Atur ukuran Heap Memory Young Generasi ke 2G. Seluruh ukuran memori heap = ukuran generasi muda + ukuran generasi lama + ukuran generasi persisten. Generasi permanen umumnya ditetapkan dalam ukuran 64m, jadi setelah meningkatkan generasi muda, ukuran generasi yang lebih tua akan berkurang. Nilai ini memiliki dampak besar pada kinerja sistem, dan Sun secara resmi merekomendasikan konfigurasi sebagai 3/8 dari seluruh tumpukan.
-Xx: Permsize = 256m: Tetapkan nilai awal dari generasi persisten memori heap ke 256m. (Tampaknya menjadi parameter inisialisasi IDE seperti Eclipse)
-Xx: maxNewSize = size: Nilai maksimum yang dapat dihasilkan oleh objek yang baru dihasilkan.
-Xx: maxpermSize = 512m: Tetapkan nilai maksimum generasi persisten ke 512m.
-Xx: newRatio = 4: Tetapkan rasio heap memori generasi muda (termasuk Eden dan dua daerah yang selamat) ke heap memori generasi tua (tidak termasuk generasi yang persisten). Jika diatur ke 4, rasio generasi muda terhadap generasi yang lebih tua adalah 1: 4.
-Xx: Survivorratio = 4: Tetapkan rasio area Eden ke area yang selamat di generasi muda memori heap. Ditetapkan ke 4, rasio antara dua area yang selamat (JVM Heap Memory Generation Young Generation memiliki 2 area yang selamat secara default) dan satu area Eden adalah 2: 4, dan satu area yang selamat menyumbang 1/6 dari seluruh generasi muda.
-Xx: maxtenuringthreshold = 7: berarti suatu objek ditempatkan pada lansia jika bergerak 7 kali di ruang penyelamatan (area survivor) dan belum didaur ulang.
Jika diatur ke 0, objek generasi muda tidak melewati area yang selamat dan langsung memasuki generasi lama. Untuk lebih banyak aplikasi dalam generasi lama, ini dapat meningkatkan efisiensi.
Jika nilai ini diatur ke nilai yang lebih besar, objek generasi muda akan disalin beberapa kali di area yang selamat, yang dapat meningkatkan waktu kelangsungan hidup objek pada generasi muda dan meningkatkan probabilitas bahwa objek akan didaur ulang pada generasi muda.
Pemilihan pendaur ulang
JVM memberikan tiga opsi: pengumpul serial, kolektor paralel, dan kolektor bersamaan, tetapi pengumpul seri hanya cocok untuk volume data kecil, sehingga pilihan di sini terutama untuk kolektor paralel dan kolektor bersamaan.
Secara default, JDK5.0 menggunakan kolektor serial sebelumnya. Jika Anda ingin menggunakan kolektor lain, Anda perlu menambahkan parameter yang sesuai saat startup. Setelah JDK5.0, JVM akan membuat penilaian cerdas berdasarkan konfigurasi sistem saat ini.
Kolektor Serial
-Xx:+UseRerialGC: Atur kolektor serial
Kolektor paralel (prioritas throughput)
-Xx:+useparallelgc: Pilih kolektor sampah sebagai kolektor paralel. Konfigurasi ini hanya berlaku untuk generasi muda. Yaitu, di bawah konfigurasi di atas, generasi muda menggunakan koleksi bersamaan, sedangkan generasi yang lebih tua masih menggunakan koleksi serial.
-Xx: paralelgcthreads = 20: Konfigurasikan jumlah utas kolektor paralel, yaitu berapa banyak utas yang dikumpulkan pada saat yang sama. Nilai ini paling baik dikonfigurasi sama dengan jumlah prosesor.
-Xx:+useparalleloldgc: Konfigurasikan metode pengumpulan sampah generasi lama untuk koleksi paralel. JDK6.0 mendukung koleksi paralel untuk generasi yang lebih tua.
-Xx: maxgcpausemillis = 100: Mengatur waktu maksimum (dalam milidetik) untuk setiap koleksi sampah generasi muda. Jika waktu ini tidak dapat dipenuhi, JVM akan secara otomatis menyesuaikan ukuran generasi muda untuk memenuhi nilai ini.
-Xx:+UseAdaptiveSizePolicy: Setelah mengatur opsi ini, kolektor paralel akan secara otomatis memilih ukuran area generasi muda dan rasio area selamat yang sesuai untuk mencapai waktu respons minimum atau frekuensi pengumpulan yang ditentukan oleh sistem target.
Parameter ini disarankan untuk dihidupkan saat menggunakan kolektor paralel.
Kolektor bersamaan (waktu respons lebih disukai)
-Xx:+USEPARNEWGC: Set Generasi Muda ke Koleksi Bersamaan. Dapat digunakan secara bersamaan dengan koleksi CMS. JDK5.0 atau di atas, JVM akan mengaturnya dengan sendirinya sesuai dengan konfigurasi sistem, jadi tidak perlu mengatur nilai ini lagi.
CMS, nama lengkap ConcurrentLowPauseCollector, adalah algoritma GC baru yang diperkenalkan dalam versi selanjutnya dari JDK1.4. Telah ditingkatkan lebih lanjut di JDK5 dan JDK6. Skenario utamanya yang sesuai adalah bahwa pentingnya waktu respons lebih besar dari persyaratan untuk throughput, dapat menahan utas pengumpulan sampah dan utas aplikasi berbagi sumber daya prosesor, dan ada relatif banyak objek seumur hidup dalam aplikasi. CMS digunakan untuk mendaur ulang generasi tenur, yaitu daur ulang lansia. Tujuannya adalah untuk meminimalkan waktu jeda aplikasi, mengurangi kemungkinan kejadian penuh, dan menggunakan utas pengumpulan sampah bersamaan dengan utas aplikasi untuk menandai dan membersihkan lansia.
-Xx:+useconcmarksweepgc: Setel generasi lama ke koleksi bersamaan. Setelah mengkonfigurasi ini dalam tes, konfigurasi -xx: newRatio = 4 tidak valid. Oleh karena itu, yang terbaik adalah mengatur ukuran generasi muda dengan -xmn saat ini.
-Xx: cmsfullgcsbeforecompaction =: karena kolektor bersamaan tidak memompres atau mengatur ruang memori, "fragmen" akan dihasilkan setelah berjalan untuk jangka waktu tertentu, yang akan mengurangi efisiensi operasi. Parameter ini mengatur ruang memori untuk dikompresi dan diatur setelah menjalankan fullgc.
-Xx:+usecmscompactatfullcollection: Nyalakan kompresi untuk generasi yang lebih tua. Dapat mempengaruhi kinerja, tetapi dapat menghilangkan fragmentasi memori.
-Xx:+cmsincrementalmode: Setel ke mode koleksi tambahan. Umumnya berlaku untuk situasi CPU tunggal.
-XX: CMSInITiatateCupancyFraction = 70: berarti bahwa ketika ruang generasi lama mencapai 70%, CMS akan mulai dieksekusi untuk memastikan bahwa generasi lama memiliki ruang yang cukup untuk menerima objek dari generasi muda.
Catatan: Jika Anda menggunakan dua pengumpul sampah, ThroughutCollector dan ConcurrentLowPausecollector, Anda harus memiliki ukuran memori tinggi yang tepat untuk mempersiapkan multi-threading.
lainnya
-Xx:+scavengebeforefullgc: Generasi GC berikutnya lebih diutamakan daripada fullgc.
-Xx: -disablexplicitgc: menghambat System.gc (), tetapi GC JVM masih valid.
-Xx:+maxfdlimit: Maksimalkan batas jumlah deskriptor file.
-Xx:+usethreadpriority: Aktifkan API prioritas utas lokal, bahkan jika java.lang.thread.setPriority () berlaku, itu akan tidak valid.
-Xx: softreflrupolicymspermb = 0: Objek "referensi lunak" dapat bertahan 0 milidetik setelah akses terakhir (default adalah 1 detik).
-XX: TargetSurvivorratio = 90: Memungkinkan 90% ruang Survivor ditempati (default adalah 50%). Tingkatkan Tingkat Penggunaan Survivor - Jika Anda melebihi, Anda akan mencoba pengumpulan sampah.
Informasi tambahan
-Xx: -Citime: Pencetakan mengkonsumsi waktu dalam kompilasi JIT
-Xx: errorFile =./Hs_err_pid.log: simpan log kesalahan atau data ke dalam file yang ditentukan
-Xx: -ExtendedDtraceprobes: Nyalakan probe dtrace khusus Solaris
-Xx: heapduppath =./Java_pid.hprof: Menentukan jalur atau nama file saat mengekspor informasi heap
-Xx: -HeapDumponoutOfMemoryError: Ekspor Informasi yang relevan di tumpukan saat ini ketika overflow memori pertama kali ditemui.
-Xx: onError = ";": Jalankan perintah khusus setelah kesalahan fatal muncul
-Xx: OnOutOfMemoryError = ";": Jalankan perintah khusus saat bertemu memori overflow untuk pertama kalinya
-Xx: -printclasshistogram: Cetak informasi kolom dari instance kelas setelah bertemu ctrl-break, sama seperti fungsi jmap-histo
-Xx: -printconcurrentlocks: Cetak informasi terkait tentang kunci bersamaan setelah bertemu-break Ctrl, sama seperti fungsi JStack-L
-Xx: -printCommandlineflags: tanda cetak yang muncul di baris perintah
-Xx: -printCompilation: Cetak informasi yang relevan saat metode dikompilasi
-Xx: -printgc: Cetak informasi yang relevan setiap kali GC
-Xx: -printgcdetails: cetak detail setiap kali gc
-Xx: -printgcTimestamps: Cetak waktu setiap GC
-Xx: -traceclassloading: Lacak informasi pemuatan kelas
-Xx: -traceclassloadingpreorder: melacak informasi pemuatan semua kelas yang dirujuk ke
-Xx: -traceclassResolution: pelacakan kumpulan konstan
-Xx: -traceclassunloading: Pelacakan kelas pembongkaran kelas
-Xx: -TraceloaderConstraints: Melacak Informasi Terkait Tentang Kelas Loader Kelas
Praktik Tuning Layanan JVM
Server: 8cup, 8gmem
misalnya
JAVA-XMX3550M-XMS3550M-XSS128K-XX: newRatio = 4-xx: Survivorratio = 4-xx: maxpermsize = 16m-xx: maxtenuringthreshold = 0
Rencana Tuning:
-Xmx5g: Atur memori maksimum yang tersedia dari JVM ke 5G.
-Xms5g: Atur memori JVM awal ke 5G. Nilai ini dapat diatur sama dengan -xmx untuk menghindari memori realokasi JVM setiap kali pengumpulan sampah selesai.
-Xmn2g: Atur ukuran generasi muda menjadi 2G. Seluruh ukuran memori heap = ukuran generasi muda + ukuran generasi lama + ukuran generasi persisten. Generasi permanen umumnya ditetapkan dalam ukuran 64m, jadi setelah meningkatkan generasi muda, ukuran generasi yang lebih tua akan berkurang. Nilai ini memiliki dampak besar pada kinerja sistem, dan Sun secara resmi merekomendasikan konfigurasi sebagai 3/8 dari seluruh tumpukan.
-Xx:+USEPARNEWGC: Atur Generasi Muda ke Koleksi Paralel. Dapat digunakan secara bersamaan dengan koleksi CMS. JDK5.0 atau di atas, JVM akan mengaturnya dengan sendirinya sesuai dengan konfigurasi sistem, jadi tidak perlu mengatur nilai ini lagi.
-Xx: paralelgcthreads = 8: Jumlah utas untuk mengonfigurasi kolektor paralel, yaitu berapa banyak utas yang dikumpulkan pada saat yang sama. Nilai ini paling baik dikonfigurasi sama dengan jumlah prosesor.
-Xx: Survivorratio = 6: Mengatur rasio ukuran area Eden dan area yang selamat di generasi muda. Menurut pengalaman, rasio dua zona yang selamat terhadap satu zona Eden adalah 2: 6, dan satu zona yang selamat menyumbang 1/8 dari seluruh generasi muda.
-Xx: maxtenuringthreshold = 30: Tetapkan usia maksimum sampah (berapa kali). Jika diatur ke 0, objek generasi muda akan langsung memasuki generasi yang lebih tua tanpa melalui area yang selamat. Untuk lebih banyak aplikasi pada generasi yang lebih tua, efisiensi dapat ditingkatkan. Jika nilai ini diatur ke nilai yang lebih besar, objek generasi muda akan menyalin beberapa kali di area yang selamat, yang dapat meningkatkan waktu kelangsungan hidup objek dan generasi muda dan meningkatkan probabilitas bahwa itu akan didaur ulang pada generasi muda. Ditetapkan ke 30 berarti bahwa suatu objek ditempatkan di generasi lama jika bergerak 30 kali di ruang Survivor dan belum didaur ulang.
-Xx:+useconcmarksweepgc: Setel generasi lama ke koleksi bersamaan. Setelah menguji dan mengonfigurasi parameter ini, parameter -xx: newRatio = 4 akan tidak valid. Oleh karena itu, yang terbaik adalah mengatur ukuran generasi muda dengan -xmn, jadi parameter ini tidak disarankan.
Referensi - Generasi memori tumpukan JVM
Memori tumpukan mesin virtual dibagi menjadi tiga generasi: generasi muda, generasi tua dan generasi permanen. Di antara mereka, generasi yang gigih terutama menyimpan informasi kelas Java, yang tidak ada hubungannya dengan benda -benda Java yang akan dikumpulkan oleh pengumpul sampah. Oleh karena itu, pembagian antara generasi muda dan generasi yang lebih tua memiliki dampak yang lebih besar pada pengumpulan sampah.
Generasi muda
Semua objek yang baru dihasilkan pertama kali ditempatkan di generasi muda. Tujuan generasi muda adalah untuk mengumpulkan benda -benda dengan siklus hidup pendek secepat mungkin. Generasi muda dibagi menjadi tiga bidang. Satu area Eden, dua area yang selamat (umumnya).
Sebagian besar objek dihasilkan di area Eden. Ketika area Eden penuh, benda -benda yang masih bertahan akan disalin ke daerah yang selamat (salah satu dari keduanya). Ketika satu area yang selamat penuh, benda -benda yang masih hidup di daerah ini akan disalin ke daerah yang selamat lainnya. Ketika area yang selamat lainnya juga penuh, benda -benda yang disalin dari daerah yang selamat sebelumnya dan masih bertahan pada saat ini akan disalin ke "area bertenor".
Perlu dicatat bahwa kedua area yang selamat bersifat simetris dan tidak memiliki hubungan secara berurutan, sehingga mungkin ada objek yang disalin dari area Eden dan objek yang disalin dari area korban lainnya di daerah yang selamat yang sama pada saat yang sama; dan hanya benda yang disalin ke area lama (relatif). Selain itu, selalu ada satu di area yang selamat yang kosong. Dalam kasus khusus, menurut kebutuhan program, area yang selamat dapat dikonfigurasi dalam beberapa (lebih dari dua), yang dapat meningkatkan waktu keberadaan objek di generasi muda dan mengurangi kemungkinan ditempatkan pada generasi yang lebih tua.
Generasi yang lebih tua
Objek yang masih bertahan setelah koleksi sampah N (dapat dikonfigurasi) di generasi muda akan ditempatkan pada generasi yang lebih tua. Oleh karena itu, dapat dipertimbangkan bahwa orang tua menyimpan benda -benda dengan siklus hidup yang lebih lama.
Generasi gigih
Digunakan untuk menyimpan data statis, seperti javaclass, metode, dll. Generasi persisten tidak memiliki dampak signifikan pada pengumpulan sampah, tetapi beberapa aplikasi dapat secara dinamis menghasilkan atau memanggil beberapa kelas, seperti hibernate, dll. Pada saat ini, ruang generasi persisten yang relatif besar perlu diatur untuk menyimpan jenis ini yang meningkat secara dinamis selama operasi. Ukuran generasi persisten diatur oleh -xx: maxpermsize =.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang mengoptimalkan Java Virtual Machine (tuning JVM). Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!