Jadual 3-4 Parameter biasa yang berkaitan dengan pengumpulan sampah tambah -XX: + UseSerialGC
Peruntukan memori objek harus secara konseptual diperuntukkan pada timbunan (sebenarnya, ia juga mungkin dibongkar selepas penyusunan tepat dalam masa) adalah jenis skalar dan diperuntukkan secara tidak langsung pada tindanan[1]). Di bawah reka bentuk generasi klasik, objek baharu biasanya diperuntukkan dalam generasi muda Dalam kes yang jarang berlaku (contohnya, saiz objek melebihi ambang tertentu), ia juga boleh diperuntukkan secara langsung dalam generasi lama. Peraturan untuk peruntukan objek tidak tetap "Spesifikasi Mesin Maya Java" tidak menetapkan butiran penciptaan dan penyimpanan objek baharu. Ini bergantung pada pengumpul sampah yang sedang digunakan oleh mesin maya dan fungsi berkaitan memori dalam mesin maya Tetapan parameter.
Objek diperuntukkan di Eden dahulu
Dalam kebanyakan kes, objek diperuntukkan dalam kawasan Eden generasi baharu. Apabila kawasan Eden tidak mempunyai ruang yang mencukupi untuk peruntukan, mesin maya akan memulakan GC Kecil.
Objek besar memasuki generasi lama secara langsung
Objek besar merujuk kepada objek Java yang memerlukan sejumlah besar ruang memori berterusan Objek besar yang paling tipikal adalah aksara yang sangat panjang . Rentetan, atau tatasusunan dengan sejumlah besar elemen Tatasusunan bait[] dalam contoh dalam bahagian ini ialah objek besar biasa. Objek besar adalah berita buruk langsung untuk peruntukan memori mesin maya. Berita yang lebih buruk daripada menemui objek besar ialah menemui sekumpulan "objek besar jangka pendek" yang "hidup dan mati" Kami menulis program yang perlu dielakkan ini.
Sebab mengapa objek besar harus dielakkan dalam mesin maya Java ialah apabila memperuntukkan ruang, ia boleh menyebabkan pengumpulan sampah dengan mudah dicetuskan terlebih dahulu apabila ingatan jelas masih mempunyai banyak ruang, untuk dapatkan ruang berterusan yang mencukupi untuk meletakkannya dengan betul , dan apabila menyalin objek, objek besar bermakna overhed salinan memori tinggi. Mesin maya HotSpot menyediakan parameter -XX: PretenureSizeThreshold, yang menyatakan bahawa objek yang lebih besar daripada nilai yang ditetapkan diperuntukkan secara langsung dalam generasi lama Tujuannya adalah untuk mengelakkan penyalinan berulang-alik antara kawasan Eden dan dua kawasan Survivor. mengakibatkan sejumlah besar operasi penyalinan memori.
-XX: Parameter PretenureSizeThreshold hanya sah untuk dua pengumpul generasi baharu, Serial dan ParNew pengumpul generasi baharu HotSpot, seperti Parallel Scavenge, tidak menyokong parameter ini. Jika anda mesti menggunakan parameter ini untuk penalaan, pertimbangkan gabungan pengumpul ParNew dan CMS.
Objek yang masih hidup jangka panjang akan memasuki generasi lamaMesin maya mentakrifkan pembilang umur objek (Umur) untuk setiap objek, yang disimpan dalam pengepala objek Selepas GC Minor, umurnya meningkat 1 tahun Apabila umurnya mencapai tahap tertentu (lalai ialah 15), ia akan dinaikkan pangkat kepada generasi lama. Ambang umur untuk objek yang akan dinaikkan pangkat kepada generasi lama boleh ditetapkan melalui parameter -XX: MaxTenuringThreshold.
Penentuan umur objek dinamik
Untuk menyesuaikan diri dengan keadaan memori program yang berbeza, mesin maya HotSpot tidak selalu memerlukan umur objek mesti capaian -XX: MaxTenuringThreshold Untuk dinaikkan pangkat kepada generasi lama, jika jumlah saiz semua objek yang sama umur dalam ruang Survivor adalah lebih besar daripada separuh ruang Survivor, objek yang umurnya lebih besar daripada atau sama dengan umur ini boleh terus memasuki generasi lama tanpa menunggu umur yang diperlukan dalam -XX: MaxTenuringThreshold.
Jaminan peruntukan ruang
Sebelum GC Minor berlaku, mesin maya mesti terlebih dahulu menyemak sama ada ruang berterusan maksimum yang tersedia dalam generasi lama lebih besar daripada jumlah ruang semua objek dalam generasi baru Jika ini Jika syarat dipenuhi, maka Minor GC boleh memastikan keselamatan kali ini. Jika ia tidak diwujudkan, mesin maya akan terlebih dahulu menyemak sama ada nilai tetapan parameter -XX: HandlePromotionFailure membenarkan kegagalan jaminan (Handle Promotion Failure jika ia dibenarkan, ia akan terus menyemak sama ada ruang berterusan maksimum yang tersedia dalam generasi lama adalah lebih besar daripada purata bilangan objek yang dipromosikan kepada generasi lama Jika saiz lebih besar daripada saiz, GC Kecil akan dicuba, walaupun GC Kecil ini berisiko jika ia kurang daripada saiz, atau -. XX: Tetapan HandlePromotionFailure tidak membenarkan risiko, maka GC Penuh akan dilakukan sebaliknya. Selepas Kemas Kini JDK 6 24, keputusan ujian adalah berbeza Parameter -XX: HandlePromotionFailure tidak akan menjejaskan strategi jaminan peruntukan ruang mesin maya Perhatikan perubahan kod sumber dalam OpenJDK (lihat penyenaraian kod 3 -12), walaupun parameter -XX: HandlePromotionFailure juga ditakrifkan dalam kod sumber, ia tidak lagi digunakan dalam mesin maya sebenar. Peraturan selepas Kemas Kini JDK 6 24 menjadi bahawa selagi ruang berterusan generasi lama lebih besar daripada jumlah saiz objek generasi baharu atau saiz purata promosi sebelumnya, GC Kecil akan dilakukan, jika tidak GC Penuh akan dilakukan .
Atas ialah kandungan terperinci Pengurusan memori Java: penerangan terperinci tentang strategi peruntukan dan kitar semula. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!