Java JVM Detail:
Pengetahuan terkait tentang JVM
1. HEAP DAN SUMPK
1. Memori tumpukan dalam JVM terutama menyimpan referensi ke jenis dasar variabel dan objek.
2. Memori heap di JVM terutama menyimpan objek dan array yang dibuat dengan string baru, dan panjang variabel (StringBuilder dan StringBuffered) disimpan dalam memori heap.
Keuntungan menggunakan tumpukan adalah bahwa ia secara dinamis dialokasikan ruang penyimpanan, yang lebih fleksibel, tetapi kerugiannya adalah bahwa ia lebih lambat untuk mengalokasikan memori secara dinamis; Saat menggunakan tumpukan lebih cepat, dan berbagi data dapat dicapai, tetapi kerugiannya adalah bahwa ukuran data dan masa pakai dalam tumpukan harus ditentukan dan tidak memiliki fleksibilitas
3. Alokasi penyimpanan statis digunakan untuk menyimpan variabel statis dan blok kode statis.
2. Pemahaman tentang JVM
JVM adalah mesin virtual Java. Ini memblokir informasi yang terkait dengan platform sistem operasi tertentu, sehingga program Java hanya menghasilkan kode objek (kode byte) yang berjalan pada mesin virtual Java, sehingga operasi lintas platform dapat dicapai;
Prinsipnya adalah: File sumber Java dikompilasi ke dalam program bytecode melalui kompiler Java, dan setiap instruksi diterjemahkan ke dalam kode mesin dari platform yang berbeda melalui JVM, dan dijalankan melalui platform tertentu;
Area memori JVM terutama dibagi menjadi: Area Metode, tumpukan JVM, tumpukan, tumpukan metode lokal, penghitung program
Penghitung Program: Digunakan untuk merekam instruksi yang saat ini dieksekusi, yang merupakan satu -satunya area tanpa OOM;
JVM Stack: Thread bersifat pribadi. Setiap utas akan membuat tumpukan JVM secara bersamaan. Ini menyimpan variabel dasar lokal di utas saat ini, hasil pengembalian parsial, bingkai tumpukan, dan alamat referensi objek;
Heap: Berbagi Thread, digunakan untuk menyimpan beberapa objek dan array; Karena dibagikan, kunci diperlukan, yang mengarah ke overhead tinggi;
Area Metode: Area metode ini sesuai dengan generasi yang persisten, yang menyimpan informasi kelas (nama, pengubah, dll.), Variabel statis di kelas, konstanta yang didefinisikan di kelas dengan final, dll.;
Tumpukan Metode Lokal: Digunakan untuk mendukung pelaksanaan metode asli dan untuk menyimpan status panggilan dari setiap metode asli;
Koleksi Sampah Java terutama berfokus pada tumpukan dan area metode: tumpukan dibagi menjadi generasi baru dan generasi lama, dan umumnya objek yang baru saja baru akan ditempatkan ke dalam generasi baru; dan generasi baru dibagi menjadi area Eden dan dua area yang selamat;
Mekanisme pengumpulan sampah adalah: Pertama-tama tentukan benda mana yang merupakan sampah, yaitu, mereka tidak lagi digunakan, dan kemudian menggunakan algoritma yang sesuai (algoritma mark-clearing, algoritma menyalin, algoritma mark-tidying, algoritma pengumpulan generasional) untuk mengumpulkan sampah;
1. Algoritma Mark-Clearing:
Ini dibagi menjadi dua tahap, tahap penandaan dan tahap kliring. Pertama, tandai objek yang perlu didaur ulang, dan kemudian mendaur ulang ruang yang ditempati oleh objek penandaan;
Implementasinya relatif sederhana, tetapi kerugiannya adalah mudah untuk menghasilkan fragmen memori, menghasilkan ketidakmampuan untuk menemukan memori yang cukup ketika mengalokasikan ruang untuk objek besar di masa depan, dan memicu tindakan pengumpulan sampah baru sebelumnya;
2. Salin algoritma:
Untuk menyelesaikan kekurangan algoritma pembersihan tanda, algoritma salinan membagi memori menjadi dua area dengan ukuran yang sama sesuai dengan kapasitas, dan hanya satu dari mereka yang digunakan pada suatu waktu. Setelah satu bagian digunakan, benda yang masih payah disalin ke area lain, dan kemudian area yang digunakan dibersihkan, sehingga fragmentasi tidak mudah terjadi;
Masalah fragmentasi memori diselesaikan, tetapi kerugiannya adalah bahwa memori yang digunakan dikurangi menjadi setengah dari aslinya, dan efisiensi penyalinan terkait dengan jumlah objek yang bertahan. Ketika jumlahnya besar, efisiensinya sangat berkurang;
3. Algoritma Marking-Organisasi
Untuk memecahkan cacat algoritma salinan, algoritma Mark-Tidy lahir, dan tahap penandaan juga seperti algoritma pembersihan Markus. Pertama, benda -benda yang perlu didaur ulang ditandai, tetapi tidak secara langsung mendaur ulangnya, tetapi menggerakkan semua benda yang masih hidup ke sisi lain, dan kemudian membersihkan memori di luar batas;
4. Algoritma Koleksi Generasi
Ini adalah algoritma yang paling umum digunakan saat ini. Gagasan intinya adalah membagi memori menjadi beberapa area yang berbeda sesuai dengan siklus kelangsungan hidup objek. Secara umum, area tumpukan dibagi menjadi generasi baru dan generasi lama. Karakteristik generasi lama adalah bahwa ada lebih sedikit objek yang perlu didaur ulang setiap kali sampah dikumpulkan, sementara ada lebih banyak generasi baru, sehingga algoritma yang berbeda diadopsi;
Saat ini, sebagian besar generasi baru menggunakan algoritma salinan, tetapi pada kenyataannya, generasi baru tidak dibagi menjadi rasio 1: 1. Secara umum, generasi baru dibagi menjadi ruang Eden yang lebih besar dan dua ruang penyintas yang lebih kecil. Setiap kali ruang Eden dan salah satu ruang yang selamat digunakan, ketika didaur ulang, benda-benda yang masih payah di Eden dan Survivor disalin ke ruang korban lainnya, dan kemudian Eden dan ruang yang selamat yang baru saja digunakan dibersihkan.
Karena usia tua adalah bahwa hanya sejumlah kecil objek yang didaur ulang setiap saat, algoritma kompak tanda-markus umumnya digunakan.
Perhatikan bahwa ada generasi lain di luar area tumpukan, yang merupakan generasi permanen, yang digunakan untuk menyimpan kelas kelas, konstanta, deskripsi metode, dll. Daur ulang generasi permanen terutama mendaur ulang dua bagian: konstanta yang dibuang dan kelas yang tidak berguna.
Jadi bagaimana kita menentukan objek mana "sampah"?
Metode 1. Metode Penghitungan Referensi:
Di Java, itu dikaitkan dengan objek melalui referensi, yaitu, jika Anda ingin mengoperasikan objek, itu harus dilakukan melalui referensi. Maka jelas bahwa cara yang mudah adalah menilai apakah suatu objek dapat didaur ulang dengan penghitungan referensi. Tanpa kehilangan sifat umum, jika suatu objek tidak memiliki referensi yang terkait dengannya, itu berarti bahwa objek pada dasarnya tidak mungkin digunakan di tempat lain, dan kemudian objek menjadi objek yang dapat didaur ulang. Metode ini menjadi metode penghitungan referensi.
Keuntungan: Implementasi sederhana dan efisiensi tinggi
Kerugian: Tidak dapat menyelesaikan masalah referensi melingkar
Metode 2. Metode Analisis Aksesibilitas:
Gagasan dasar dari metode ini adalah mencari melalui serangkaian objek "GC Roots" sebagai titik awal. Jika tidak ada jalur yang dapat diakses antara "GC Roots" dan sebuah objek, objek tersebut dikatakan tidak dapat dijangkau. Namun, harus dicatat bahwa objek yang dinilai tidak dapat dijangkau mungkin tidak selalu menjadi objek yang dapat didaur ulang. Objek yang dinilai sebagai tidak terjangkau harus melalui setidaknya dua proses penandaan untuk menjadi objek yang dapat didaur ulang. Jika masih belum ada kemungkinan untuk menjadi objek yang dapat didaur ulang selama dua proses penandaan ini, itu pada dasarnya akan menjadi objek yang dapat didaur ulang.
Objek mana yang bisa menjadi akar GC?
1. Objek yang dirujuk dalam tumpukan JVM (tabel variabel lokal dalam bingkai stack).
2. Objek yang dirujuk oleh atribut statis kelas di area metode.
3. Objek yang dirujuk oleh konstanta di area metode
4. Objek yang dirujuk oleh JNI (yaitu, metode asli asli) dalam tumpukan metode lokal.
Untuk pemrogram, kami juga dapat mengurangi overhead GC melalui beberapa metode:
1. Jangan menampilkan metode System.gc ()
2. Minimalkan penggunaan benda sementara
3. Saat objek tidak digunakan, pengaturan tampilan diatur ke null
4. Coba gunakan StringBuilder alih -alih string akumulasi string
5. Jika Anda dapat menggunakan jenis variabel dasar (int long), jangan gunakan objek (integer, panjang)
6. Gunakan variabel objek statis sesedikit mungkin
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!