Matlamat paling asas pengurusan memori automatik dalam sistem teknologi Java adalah untuk menyelesaikan dua masalah secara automatik: memperuntukkan memori secara automatik kepada objek dan mengitar semula memori yang diperuntukkan kepada objek secara automatik.
1. Gambaran Keseluruhan
Secara konsep, peruntukan memori objek harus diperuntukkan pada timbunan (malah, ia juga boleh dibongkar kepada jenis skalar selepas penyusunan tepat pada masanya dan diperuntukkan secara tidak langsung pada timbunan). 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.
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.
1. Apabila kawasan Eden mempunyai ruang yang mencukupi
Parameter mesin maya
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
Penerangan parameter
Cuba peruntukkan tiga Objek 2MB dan satu 4MB, pada masa jalan, saiz timbunan Java dihadkan kepada 20MB melalui tiga parameter -Xms20M, -Xmx20M dan -Xmn10M, yang tidak boleh dikembangkan 10MB diperuntukkan kepada generasi baharu dan baki 10MB diperuntukkan kepada generasi lama. -XX: Survivor-Nisbah=8 menentukan bahawa nisbah ruang antara kawasan Eden dan kawasan Survivor dalam generasi baharu ialah 8:1.
package com.xiao.test.Test; public class test { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] byte1,byte2,byte3; byte1 = new byte[2 * _1MB]; byte2 = new byte[2 * _1MB]; byte3 = new byte[2 * _1MB]; } }
2 Apabila kawasan Eden tidak mempunyai ruang yang mencukupi
Parameter mesin maya adalah sama
package com.xiao.test.Test; public class test { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] byte1,byte2,byte3,byte4; byte1 = new byte[2 * _1MB]; byte2 = new byte[2 * _1MB]; byte3 = new byte[2 * _1MB]; byte4 = new byte[3 * _1MB]; } }
Jelasnya Minor GC
1.
Objek besar merujuk kepada objek Java yang memerlukan sejumlah besar ruang memori berterusan Objek besar yang paling tipikal ialah rentetan atau tatasusunan yang sangat panjang dengan sejumlah besar elemen.
2 Sebab mengapa objek besar harus dielakkan dalam mesin maya Java
Apabila memperuntukkan ruang, ia boleh menyebabkan pengumpulan sampah dicetuskan terlebih dahulu apabila terdapat banyak ruang di dalam ingatan untuk mendapatkan cukup Hanya ruang berterusan boleh digunakan untuk meletakkannya. Apabila menyalin objek, objek besar bermakna overhed salinan memori tinggi.
3. Kelebihan objek besar yang memasuki generasi lama secara langsung
Elakkan menyalin berulang-alik antara kawasan Eden dan dua kawasan Survivor, mengakibatkan sejumlah besar operasi penyalinan memori (HotSpot mesin maya menyediakan -XX : Parameter PretenureSizeThreshold, menyatakan bahawa objek yang lebih besar daripada nilai yang ditetapkan diperuntukkan secara langsung dalam generasi lama).
1. Bagaimanakah mesin maya menentukan sama ada objek itu masih hidup untuk jangka panjang?
Apabila mengitar semula ingatan, anda mesti boleh memutuskan objek yang masih hidup harus diletakkan dalam generasi baharu dan objek yang masih hidup harus diletakkan pada generasi lama. Untuk melakukan ini, mesin maya mentakrifkan pembilang umur objek (Umur) untuk setiap objek, yang disimpan dalam pengepala objek.
2. Proses peningkatan umur objek dan promosi kepada generasi lama
Objek biasanya dilahirkan di kawasan Eden Jika masih bertahan selepas GC Minor pertama dan boleh ditampung oleh Survivor, objek akan Objek akan dialihkan ke ruang Survivor dan umur objeknya akan ditetapkan kepada 1 tahun. Setiap kali objek bertahan dalam GC Kecil di kawasan Survivor, 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.
3. Sebab objek tahan lama akan memasuki generasi lama
Kita semua tahu bahawa algoritma kutipan sampah generasi baharu adalah algoritma mark-copy masih disimpan dalam generasi baru Jika ya, ia akan membawa masalah peningkatan overhed salinan. Oleh itu, kami meletakkan objek yang lebih besar daripada ambang umur tertentu ke dalam generasi lama, yang boleh mengurangkan tekanan ke atas generasi baharu semasa kutipan sampah.
Untuk menyesuaikan dengan lebih baik kepada keadaan memori program yang berbeza, mesin maya HotSpot tidak selalu memerlukan umur objek mesti mencapai -XX :MaxTenuringThreshold sebelum ia boleh dinaikkan pangkat Pada generasi lama, jika jumlah saiz semua objek pada umur yang sama dalam ruang Survivor adalah lebih daripada separuh daripada 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.
1
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 baharu Jika keadaan ini benar, maka kali ini GC Minor boleh dijamin selamat. Jika ia tidak ditubuhkan, mesin maya akan terlebih dahulu menyemak sama ada nilai tetapan parameter -XX: HandlePromotionFailure membenarkan kegagalan jaminan jika ia dibenarkan, ia akan terus menyemak sama ada ruang berterusan maksimum yang tersedia dalam generasi lama adalah lebih besar daripada saiz purata objek yang dipromosikan kepada generasi lama Jika lebih besar, A Minor GC akan dicuba, walaupun kali ini Minor GC berisiko jika kurang daripada, atau tetapan HandlePromotionFailure tidak membenarkan risiko; maka GC Penuh akan dilakukan sebaliknya.
2. Apakah risiko "pengembaraan"
Seperti yang dinyatakan sebelum ini, generasi baharu menggunakan algoritma pengumpulan salinan, tetapi untuk penggunaan memori, hanya satu ruang Survivor digunakan sebagai sandaran berputar , jadi apabila sebilangan besar objek masih bertahan selepas Minor GC - kes yang paling ekstrem ialah semua objek dalam generasi baharu bertahan selepas kitar semula memori, generasi lama perlu melaksanakan jaminan peruntukan dan objek yang tidak dapat ditampung oleh Survivor dihantar terus kepada generasi lama, yang serupa dengan jaminan pinjaman dalam kehidupan. Untuk membuat jaminan sedemikian pada generasi lama, premisnya ialah generasi lama itu sendiri masih mempunyai ruang yang tinggal untuk menampung objek ini Namun, berapa banyak objek yang akan bertahan dari kitar semula ini tidak dapat diketahui dengan jelas sebelum kitar semula memori sebenar selesai, jadi kami. hanya boleh mengambil Saiz purata kapasiti objek yang dipromosikan kepada generasi lama dalam setiap kitar semula sebelumnya digunakan sebagai nilai pengalaman Ia dibandingkan dengan ruang yang tinggal dalam generasi lama untuk memutuskan sama ada untuk melaksanakan GC Penuh untuk membebaskan lebih banyak ruang generasi lama.
3. Adakah kita perlu membuka jaminan?
Membandingkan purata sejarah masih merupakan penyelesaian berdasarkan pertaruhan pada kebarangkalian, maksudnya, jika bilangan objek selepas GC Kecil tertentu bertahan secara tiba-tiba, yang jauh lebih tinggi daripada purata sejarah, ia akan tetap. membawa kepada Jaminan gagal. Jika terdapat kegagalan jaminan, maka anda perlu memulakan semula GC Penuh dengan jujur, jadi masa jeda akan menjadi sangat lama. Walaupun bulatan adalah yang terbesar apabila jaminan gagal, suis -XX: HandlePromotionFailure biasanya dihidupkan untuk mengelakkan GC Penuh terlalu kerap.
Atas ialah kandungan terperinci Contoh analisis peruntukan memori dan strategi kitar semula dalam mesin maya Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!