Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 12807|Jawab: 0

[JavaSE] Dapatkan pemahaman mendalam tentang mekanisme pengumpulan sampah Java

[Salin tautan]
Diposting pada 04/12/2017 20.26.51 | | |
1. Pentingnya mekanisme daur ulang sampah  
Fitur penting dari bahasa Java adalah pengenalan mekanisme pengumpulan sampah, yang memecahkan masalah manajemen memori yang paling merepotkan bagi pemrogram C++, sehingga pemrogram Java tidak perlu lagi mempertimbangkan manajemen memori saat menulis program. Karena mekanisme pengumpulan sampah, objek di Java tidak lagi memiliki konsep "scope", hanya referensi objek yang memiliki "scope".Pengumpulan sampah dapat secara efektif mencegah kebocoran memori dan secara efektif menggunakan memori idle.

ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2. Algoritma dalam mekanisme pengumpulan sampah  
Spesifikasi bahasa Java tidak secara eksplisit menentukan algoritma pengumpulan sampah mana yang akan digunakan dalam JVM, tetapi algoritma pengumpulan sampah apa pun umumnya perlu melakukan dua hal dasar: (1) menemukan objek informasi yang tidak berguna; (2) Rekam kembali ruang memori yang ditempati oleh benda-benda yang tidak berguna, sehingga ruang tersebut dapat digunakan kembali oleh program.
1. Kolektor Penghitungan Referensi
1.1 Analisis algoritma

Penghitungan referensi adalah strategi awal dalam pengumpul sampah. Dalam pendekatan ini, ada jumlah referensi untuk setiap instans objek dalam tumpukan. Ketika objek dibuat dan instans objek ditetapkan ke variabel, jumlah variabel diatur ke 1. Ketika variabel lain ditetapkan sebagai referensi ke objek ini, hitungan ditambahkan dengan 1 (a = b, maka penghitung instans objek yang direferensikan oleh b adalah +1), tetapi ketika referensi ke instans objek telah melebihi masa pakainya atau diatur ke nilai baru, penghitung referensi instans objek dikurangi dengan 1. Setiap instans objek dengan penghitung referensi 0 dapat dikumpulkan sebagai sampah. Ketika instans objek dikumpulkan sampah, penghitung referensi dari instans objek apa pun yang direferensikannya adalah minus 1.
1.2 Kelebihan dan kekurangan
Merit:

Pengumpul hitungan referensi dapat dieksekusi dengan sangat cepat, terjalin ke dalam eksekusi program. Ini menguntungkan untuk lingkungan real-time di mana program tidak perlu terganggu untuk jangka waktu yang lama.
Kekurangan:

Referensi melingkar tidak dapat dideteksi. *Jika objek induk memiliki referensi ke objek turunan, objek turunan pada gilirannya mereferensikan objek induk. Dengan cara ini, jumlah kutipan mereka tidak akan pernah bisa 0.
1.3 Algoritma penghitungan referensi tidak dapat memecahkan masalah referensi melingkar, misalnya:
/** * Java学习交流QQ群:589809992 我们一起学Java! */public class Main {    public static void main(String[] args) {        MyObject object1 = new MyObject();        MyObject object2 = new MyObject();        object1.object = object2;        object2.object = object1;        object1 = null;        object2 = null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  
Dua kalimat terakhir menetapkan object1 dan object2 ke null, yang berarti bahwa objek yang ditunjuk oleh object1 dan object2 tidak dapat lagi diakses, tetapi karena mereka merujuk satu sama lain, penghitung referensinya bukan 0, sehingga pengumpul sampah tidak akan pernah mendaur ulangnya.
2. Tracer Collector atau algoritma mark and sweep
2.1 Algoritma pencarian root


Algoritma pencarian akar diperkenalkan dari teori grafik dalam matematika diskrit, program menganggap semua hubungan referensi sebagai grafik, mulai dari simpul GC ROOT, mencari simpul referensi yang sesuai, setelah menemukan simpul ini, terus mencari simpul referensi simpul ini, ketika semua simpul referensi dicari, simpul yang tersisa dianggap sebagai simpul yang tidak direferensikan, yaitu simpul yang tidak berguna.
java yang dapat digunakan sebagai GC Root
1. Objek yang direferensikan dalam tumpukan komputer virtual (tabel variabel lokal)
2. Objek yang direferensikan oleh atribut statis di area metode
3. Objek yang direferensikan oleh konstanta di area metode
4. Objek yang Direferensikan dalam Tumpukan Metode Lokal (Objek Asli)
2.2 Diagram skematik algoritma pelacakan

2.3 Analisis algoritma pembersihan penanda

Algoritma pembersihan tag memindai dari koleksi root, menandai objek yang masih ada, lalu memindai seluruh ruang untuk objek yang tidak diberi tag untuk didaur ulang, seperti yang ditunjukkan pada gambar di atas. Algoritma pembersihan tag tidak perlu memindahkan objek, dan hanya memproses objek yang tidak bertahan, yang sangat efisien ketika ada banyak objek yang masih ada, tetapi karena algoritma pembersihan tag secara langsung mendaur ulang objek yang tidak bertahan, itu akan menyebabkan fragmentasi memori.
3. Algoritma pemadatkan atau algoritma finishing label


Algoritma tag-finish menggunakan metode yang sama dengan algoritma tag-clear untuk memberi label pada objek, tetapi berbeda saat membersihkan, setelah merebut kembali ruang yang ditempati oleh objek yang tidak bertahan, algoritma akan memindahkan semua objek yang masih ada ke ruang kosong di ujung kiri dan memperbarui penunjuk yang sesuai. Algoritma tag-finish didasarkan pada algoritma pembersihan tag dan memindahkan objek, sehingga lebih mahal, tetapi memecahkan masalah fragmentasi memori. Dalam implementasi kolektor berdasarkan algoritma Compacting, tabel handle dan handle umumnya ditambahkan.
4. Algoritma Penyalinan (Compacting Collector)


Algoritma ini diusulkan untuk mengatasi overhead pegangan dan menyelesaikan pengumpulan sampah puing-puing timbunan. Ketika objek penuh, pengumpulan sampah berdasarkan algoritma penyalinan memindai objek aktif dari himpunan akar, dan menyalin setiap objek aktif ke wajah bebas (sehingga tidak ada lubang kosong di antara memori yang ditempati oleh objek aktif), sehingga permukaan bebas menjadi wajah objek, wajah objek asli menjadi wajah bebas, dan program mengalokasikan memori di wajah objek baru. Pengumpulan sampah khas berdasarkan algoritma koping adalah algoritma stop-and-copy, yang membagi tumpukan menjadi wajah objek dan wajah area bebas, dan program menjeda eksekusi selama peralihan antara wajah objek dan wajah area bebas.
5. Kolektor Generasi


Strategi daur ulang sampah generasi didasarkan pada fakta bahwaSiklus hidup objek yang berbeda berbeda。 Oleh karena itu, objek dengan siklus hidup yang berbeda dapat mengadopsi algoritme daur ulang yang berbeda untuk meningkatkan efisiensi daur ulang.
Generasi Muda
1. Semua objek yang baru dihasilkan ditempatkan di generasi muda terlebih dahulu. Tujuan generasi muda adalah untuk mengumpulkan benda-benda dengan siklus hidup pendek secepat mungkin.

2. Memori generasi baru dibagi menjadi satu wilayah Eden dan dua zona penyintas (survivor0, survivor1) sesuai dengan rasio 8:1:1. Satu zona Eden, dua zona Survivor (secara umum). Sebagian besar objek muncul di daerah Eden. Ketika area survivor0 juga penuh, area eden dan area survivor 0 disalin ke area survivor1 lain, lalu area eden dan survivor0 dikosongkan, lalu area survivor0 kosong, lalu area survivor0 dan area survivor1 ditukar. Artinya, jaga agar area survivor1 tetap kosong, dan seterusnya.

3. Ketika area survivor1 tidak cukup untuk menyimpan benda-benda eden dan survivor0 yang masih hidup, benda yang masih hidup disimpan langsung ke era lama. Jika usia tua juga penuh, itu akan memicu GC penuh, yaitu generasi baru dan generasi lama akan didaur ulang

4. GC generasi baru juga disebut GC Minor, dan frekuensi MinorGC relatif tinggi (belum tentu dipicu saat area Eden penuh)
Generasi Lama

1. Benda yang masih hidup setelah mengalami daur ulang sampah N pada generasi muda akan ditempatkan pada generasi yang lebih tua. Oleh karena itu, dapat dianggap bahwa generasi lama disimpan di beberapa benda dengan siklus hidup yang panjang.

2. Memori juga jauh lebih besar daripada generasi baru (perkiraan rasio adalah 1:2), ketika memori usia tua penuh, GC Mayor dipicu, yaitu GC Penuh, frekuensi GC Penuh relatif rendah, waktu bertahan hidup objek usia tua relatif lama, dan tanda tingkat kelangsungan hidup tinggi.
Generasi Permanen
Digunakan untuk menyimpan file statis, seperti kelas Java, metode, dll. Generasi persisten tidak memiliki dampak yang signifikan pada pengumpulan sampah, tetapi beberapa aplikasi dapat secara dinamis menghasilkan atau memanggil beberapa kelas, seperti Hibernasi, dll., dan dalam hal ini, ruang pembuatan persisten yang relatif besar perlu diatur untuk menyimpan kelas baru ini selama runtime.
3. GC (Pengumpul Sampah)Kolektor yang digunakan oleh kolektor generasi baru: Serial, PraNew, Parallel Scavenge
Kolektor yang digunakan oleh Kolektor Usia Tua: Serial Old, Parallel Old, CMS

Kolektor serial (algoritma replikasi)
Generasi baru kolektor berulir tunggal, penandaan dan pembersihan berulir tunggal, dengan keunggulan sederhana dan efisien.
Kolektor Lama Serial (Algoritma Label-Finish)
Kolektor Benang Tunggal Usia Tua, Kolektor Serial versi Usia Tua.
Kolektor ParNew (algoritma penghentian salinan)
Kolektor generasi baru dapat dianggap sebagai versi multi-thread dari kolektor Serial, yang memiliki kinerja lebih baik daripada Serial di lingkungan CPU multi-core.
Pemulung Paralel (Algoritma Stop-Copy)
Kolektor paralel untuk throughput tinggi dan pemanfaatan CPU yang efisien. Throughput umumnya 99%, dan throughput = waktu utas pengguna / (waktu utas pengguna + waktu utas GC). Sangat cocok untuk skenario seperti aplikasi latar belakang yang tidak memerlukan interaksi tinggi secara sesuai.
Kolektor Lama Paralel (Algoritma Stop-Copy)
Versi lama dari kolektor Parallel Scavenge, kolektor paralel, dengan prioritas throughput
Kolektor CMS (Sapuan Tanda Bersamaan) (Algoritma Tanda-Bersih)
Konkurensi tinggi, jeda rendah, mengejar waktu jeda pemulihan GC terpendek, penggunaan CPU tinggi, waktu respons cepat, waktu jeda singkat, dan CPU multi-inti mengejar waktu respons yang tinggi
4. Mekanisme implementasi GCKarena objek telah diproses dalam generasi yang berbeda, area dan waktu pengumpulan sampah juga berbeda. Ada dua jenis GC: Scavenge GC dan Full GC.
Mengais GC
Biasanya, ketika objek baru dihasilkan dan gagal mendaftar untuk ruang di Eden, GC Pemulung akan dipicu, yang akan GC area Eden, menghapus objek yang tidak bertahan, dan memindahkan objek yang masih hidup ke area Survivor. Kemudian sortir dua zona Survivor. GC dengan cara ini dilakukan pada daerah Eden generasi muda dan tidak mempengaruhi generasi yang lebih tua. Karena sebagian besar objek dimulai dari daerah Eden, dan daerah Eden tidak terlalu dialokasikan, GC daerah Eden sering dilakukan. Oleh karena itu, umumnya perlu menggunakan algoritme yang cepat dan efisien di sini untuk membuat Eden bebas sesegera mungkin.
GC Penuh
Atur seluruh tumpukan, termasuk Young, Tenured, dan Perm. GC Penuh lebih lambat daripada GC Pemulung karena membutuhkan daur ulang seluruh tumpukan, sehingga jumlah GC Penuh harus dikurangi sebanyak mungkin. Sebagian besar proses penyetelan JVM adalah penyetelan FullGC. GC penuh dapat disebabkan oleh alasan berikut:
1. Tenured ditulis penuh
2. Perm ditulis penuh  
3. System.gc() ditampilkan sebagai panggilan  
4. Strategi alokasi domain Heap berubah secara dinamis setelah GC terakhir
5. Java dengan GC juga akan mengalami masalah kebocoran memori1. Penggunaan kelas koleksi statis seperti HashMap, Vector, dll. adalah yang paling rentan terhadap kebocoran memori, dan siklus hidup variabel statis ini sama dengan aplikasi, dan semua objek tidak dapat dirilis, karena akan selalu diterapkan oleh Vector dan lainnya.
Vektor Statis v = Vektor baru(); untuk (int i = 1; i<100; i++) { Object o = new Object();     v.tambah(o);     o = nol; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  
Dalam contoh ini, ada referensi v untuk objek Vektor dan referensi o untuk objek Objek dalam tumpukan kode. Dalam perulangan For, kita terus menghasilkan objek baru, lalu menambahkannya ke objek Vektor, dan kemudian membatalkan referensi o. Pertanyaannya adalah, ketika referensi o dibatalkan, jika GC terjadi, dapatkah objek Object yang kita buat didaur ulang oleh GC? Jawabannya tidak. Karena ketika GC melacak referensi dalam tumpukan kode, GC menemukan referensi v, dan jika Anda terus melacak, Anda akan menemukan bahwa ada referensi ke objek Object di ruang memori yang ditunjuk oleh referensi v. Artinya, meskipun referensi o telah dikosongkan, masih ada referensi lain ke objek Object yang dapat diakses, sehingga GC tidak dapat membebaskannya. Jika setelah loop ini, objek Object tidak berpengaruh pada program, maka kita berasumsi bahwa program Java mengalami kebocoran memori.
2. Berbagai koneksi, koneksi database, koneksi jaringan, koneksi IO, dll. tidak menunjukkan panggilan mendekati tutup, dan tidak didaur ulang oleh GC, mengakibatkan kebocoran memori.
3. Penggunaan pendengar juga dapat menyebabkan kebocoran memori ketika pendengar tidak dihapus saat melepaskan objek.




Mantan:Pemula memainkan beberapa teknologi hitam di CSS
Depan:Waspadalah terhadap Trojan virus perangkat lunak snap Wanke Cloud!
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com