Saat ini saya sedang memonitor aplikasi Java dengan jconsole. Tab memori memungkinkan Anda memilih di antara:
Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”
Apa perbedaan di antara mereka?
Jawaban:
Tumpukan memori
Memori tumpukan adalah area data runtime dari mana Java VM mengalokasikan memori untuk semua instance kelas dan array. Tumpukan mungkin ukuran tetap atau variabel. Pengumpul sampah adalah sistem manajemen memori otomatis yang mengambil kembali memori tumpukan untuk objek.
Eden Space : Kolam dari mana memori awalnya dialokasikan untuk sebagian besar objek.
Survivor Space : Kolam yang berisi benda-benda yang selamat dari pengumpulan sampah ruang Eden.
Tenured Generation atau Old Gen : Kelompok yang berisi objek yang telah ada selama beberapa waktu di ruang survivor
Memori non-tumpukan
Memori non-heap mencakup area metode yang digunakan bersama di antara semua utas dan memori yang diperlukan untuk pemrosesan internal atau optimalisasi untuk Java VM. Ini menyimpan struktur per-kelas seperti kumpulan konstanta runtime, data bidang dan metode, dan kode untuk metode dan konstruktor. Area metode secara logis merupakan bagian dari heap tetapi, tergantung pada implementasinya, Java VM mungkin tidak mengumpulkan atau memadatkannya. Seperti memori tumpukan, area metode mungkin ukuran tetap atau variabel. Memori untuk area metode tidak perlu bersebelahan.
Generasi Permanen : Kumpulan yang berisi semua data reflektif dari mesin virtual itu sendiri, seperti objek kelas dan metode. Dengan Java VM yang menggunakan berbagi data kelas, generasi ini dibagi menjadi area baca-saja dan baca-tulis.
Cache Kode : HotSpot Java VM juga menyertakan kode cache, berisi memori yang digunakan untuk kompilasi dan penyimpanan kode asli.
Berikut beberapa dokumentasi tentang cara menggunakan Jconsole .
sumber
Kata kunci baru mengalokasikan memori pada tumpukan Java. Tumpukan adalah kumpulan memori utama, dapat diakses oleh seluruh aplikasi. Jika tidak ada cukup memori yang tersedia untuk dialokasikan untuk objek itu, JVM mencoba untuk mengambil kembali sebagian memori dari tumpukan dengan pengumpulan sampah. Jika masih tidak mendapatkan cukup memori, OutOfMemoryError dilempar, dan JVM keluar.
Tumpukan dibagi menjadi beberapa bagian yang berbeda, yang disebut generasi. Karena objek bertahan lebih banyak dari pengumpulan sampah, mereka dipromosikan ke generasi yang berbeda. Generasi yang lebih tua tidak sering mengumpulkan sampah. Karena benda-benda ini telah terbukti berumur panjang, mereka cenderung mengumpulkan sampah.
Ketika objek pertama kali dibangun, mereka dialokasikan di Ruang Eden. Jika mereka selamat dari pengumpulan sampah, mereka dipromosikan ke Ruang Selamat, dan jika mereka hidup cukup lama di sana, mereka dialokasikan ke Generasi Bertenor. Generasi ini lebih jarang mengumpulkan sampah.
Ada juga generasi keempat, yang disebut Generasi Permanen, atau PermGen. Objek yang berada di sini tidak memenuhi syarat untuk menjadi sampah yang dikumpulkan, dan biasanya berisi keadaan tidak berubah yang diperlukan untuk menjalankan JVM, seperti definisi kelas dan kumpulan konstanta String. Perhatikan bahwa ruang PermGen direncanakan akan dihapus dari Java 8, dan akan diganti dengan ruang baru yang disebut Metaspace, yang akan disimpan dalam memori asli. referensi :http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
sumber
-XX:PermSize
dan tidak-XX:MaxPermSize
seperti yang sudah didefinisikan di atas itu.Dengan Java8, wilayah non heap tidak lagi berisi PermGen tetapi Metaspace, yang merupakan perubahan besar di Java8, seharusnya menyingkirkan kesalahan memori dengan java karena ukuran metaspace dapat ditingkatkan tergantung pada ruang yang dibutuhkan oleh jvm untuk data kelas.
sumber
Java Heap Memory adalah bagian dari memori yang dialokasikan untuk JVM oleh Sistem Operasi.
Objek berada di area yang disebut heap. Tumpukan dibuat ketika JVM dimulai dan dapat menambah atau mengurangi ukuran saat aplikasi berjalan. Ketika tumpukan menjadi penuh, sampah dikumpulkan.
Anda dapat menemukan detail lebih lanjut tentang Eden Space, Survivor Space, Tenured Space dan Permanent Generation di bawah pertanyaan SE:
Generasi muda, Bertenor dan Perm
PermGen telah diganti dengan Metaspace sejak rilis Java 8.
Mengenai pertanyaan Anda:
Codecache: Java Virtual Machine (JVM) menghasilkan kode asli dan menyimpannya di area memori yang disebut codecache. JVM menghasilkan kode asli untuk berbagai alasan, termasuk untuk loop interpreter yang dihasilkan secara dinamis, Java Native Interface (JNI) stubs, dan untuk metode Java yang dikompilasi ke dalam kode asli oleh kompiler just-in-time (JIT). JIT sejauh ini merupakan pengguna codecache terbesar.
sumber