Istilah Jawa tumpukan: generasi muda, tua dan permanen?


318

Saya mencoba memahami Apa konsep generasi muda , tua dan permanen dalam terminologi tumpukan Jawa, dan lebih khusus interaksi antara tiga generasi.

Pertanyaan saya adalah:

  • Apa itu generasi muda?
  • Apa itu generasi lama?
  • Apa itu generasi permanen?
  • Bagaimana ketiga generasi berinteraksi / berhubungan satu sama lain?

Dengan asumsi Anda berbicara tentang Sun JDK / OpenJDK, lihat halaman di situs web OpenJDK tentang Manajemen Penyimpanan . Ada beberapa tautan ke lebih banyak informasi di bagian bawah.
Nicholas Riley

1
juga terkait dengan pertanyaan ini "generasi bertenor"
gstackoverflow

Jawaban:


304

Ini sepertinya kesalahpahaman umum. Dalam JVM Oracle, generasi permanen bukan bagian dari heap. Ini adalah ruang terpisah untuk definisi kelas dan data terkait. Di Jawa 6 dan sebelumnya, string yang diinternir juga disimpan dalam generasi permanen. Di Java 7, string yang diinternir disimpan di tumpukan objek utama.

Ini adalah pos yang bagus untuk generasi permanen .

Saya suka deskripsi yang diberikan untuk setiap ruang dalam panduan Oracle di JConsole :

Untuk HotSpot Java VM, kumpulan memori untuk pengumpulan sampah serial adalah sebagai berikut.

  • Eden Space (heap): Kolam dari mana memori awalnya dialokasikan untuk sebagian besar objek.
  • Survivor Space (heap): Kolam yang berisi benda-benda yang selamat dari pengumpulan sampah ruang Eden.
  • Tenured Generation (heap): Kolam yang berisi objek yang telah ada selama beberapa waktu di ruang selamat.
  • Permanent Generation (non-heap): 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.
  • Kode Cache (non-heap): The HotSpot Java VM juga termasuk kode cache, berisi memori yang digunakan untuk kompilasi dan penyimpanan kode asli.

Java menggunakan pengumpulan sampah generasi. Ini berarti bahwa jika Anda memiliki objek foo (yang merupakan turunan dari beberapa kelas), semakin banyak peristiwa pengumpulan sampah yang bertahan (jika masih ada referensi untuknya), semakin dipromosikan. Ini dimulai pada generasi muda (yang dengan sendirinya terbagi menjadi beberapa ruang - Eden dan Survivor) dan pada akhirnya akan berakhir pada generasi masa jabatan jika bertahan cukup lama.


2
Saya percaya bahwa pada Java 7, string tidak lagi diinternir dalam generasi permanen.
Tim Goodman

Anda benar, saya terkejut ini bertahan begitu lama sebelum disebutkan. Kemudian di Java 8 generasi permanen akan digantikan oleh metaspace (walaupun saya tidak yakin seberapa berbedanya hal ini, selain tidak terikat secara default)
Joshua McKinnon

9
Joshua - apakah "lama" identik dengan "bertenor," dan "baru" identik dengan "selamat?"
joadha

1
gen perm hanya berlaku sebelum Java 8.
lwpro2

2
Jika Anda masih menunggu jawaban, ya Anda benar @ joadha. Lihatlah tautan ini: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

Heap dibagi menjadi generasi muda dan tua sebagai berikut:

Generasi Muda : Ini adalah tempat tinggal untuk waktu singkat dan dibagi menjadi dua ruang:

  • Eden Space : Ketika objek dibuat menggunakan memori kata kunci baru yang dialokasikan di ruang ini.
  • Survivor Space : Ini adalah kolam yang berisi benda-benda yang selamat setelah pengumpulan sampah java dari ruang Eden.

Old Generation : Pool ini pada dasarnya berisi ruang bertenor dan virtual (dilindungi) dan akan menampung benda-benda yang selamat setelah pengumpulan sampah dari Young Generation.

  • Ruang Bertahan: kumpulan memori ini berisi objek yang selamat setelah beberapa pengumpulan sampah berarti objek yang selamat setelah pengumpulan sampah dari ruang Survivor.

Generasi Permanen: Kumpulan memori ini seperti namanya juga berisi metadata kelas permanen dan informasi deskriptor sehingga ruang PermGen selalu disediakan untuk kelas dan yang terkait dengan kelas misalnya anggota statis.

Pembaruan Java8: PermGen diganti dengan Metaspace yang sangat mirip.
Perbedaan utama adalah bahwa Metaspace kembali ukuran secara dinamis yaitu, dapat berkembang saat runtime.
Ruang Java Metaspace: tidak terikat (default)

Kode Cache (Virtual atau disediakan): Jika Anda menggunakan HotSpot Java VM ini termasuk area cache kode yang berisi memori yang akan digunakan untuk kompilasi dan penyimpanan kode asli.

masukkan deskripsi gambar di sini

Kesopanan


@Remaj apa artinya Metaspace kembali ukuran secara dinamis yaitu, dapat berkembang saat runtime. ? Satu-satunya perbedaan bahwa secara default tidak sampai perbatasan?
gstackoverflow

1
luar biasa..mungkin saya tahu di mana area metode, nativestack dan runtime pool konstan berada di gambar ini? dan apa yang mereka pegang sesuai?

jika cache kode digunakan untuk kode metode asli, apa yang dimiliki tumpukan metode asli (setiap utas akan memilikinya)?

49

Apa itu generasi muda?

The Generasi Muda adalah di mana semua benda baru dialokasikan dan umur. Ketika generasi muda terisi, ini menyebabkan pengumpulan sampah kecil. Generasi muda yang penuh dengan benda mati dikumpulkan dengan sangat cepat. Beberapa benda yang selamat berumur dan akhirnya pindah ke generasi tua.

Apa itu generasi lama?

The Generation Old digunakan untuk menyimpan panjang yang masih hidup objek. Biasanya, ambang batas ditetapkan untuk objek generasi muda dan ketika usia tersebut terpenuhi, objek akan dipindahkan ke generasi lama. Akhirnya generasi tua perlu dikumpulkan. Acara ini disebut pengumpulan sampah besar

Apa itu generasi permanen?

The generasi Permanen berisi metadata yang dibutuhkan oleh JVM untuk menggambarkan kelas dan metode yang digunakan dalam aplikasi. Generasi permanen diisi oleh JVM saat runtime berdasarkan kelas yang digunakan oleh aplikasi.

PermGen telah diganti dengan Metaspace sejak rilis Java 8.

Parameter PermSize & MaxPermSize akan diabaikan sekarang

Bagaimana ketiga generasi berinteraksi / berhubungan satu sama lain?

masukkan deskripsi gambar di sini

Artikel tutorial sumber tehnik & oracle: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Proses Pengumpulan Sampah Umum " dalam artikel di atas menjelaskan interaksi di antara mereka dengan banyak diagram.

Lihatlah diagram ringkasan:

masukkan deskripsi gambar di sini


luar biasa..mungkin saya tahu di mana area metode, nativestack dan runtime pool konstan berada di gambar ini? dan apa yang mereka pegang sesuai?

lihat docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html untuk detail lebih lanjut. Area metode dibuat pada permulaan mesin virtual. Meskipun area metode secara logis bagian dari heap, implementasi sederhana dapat memilih untuk tidak mengumpulkan sampah atau memadatkannya. Setiap pool konstan run-time dialokasikan dari area metode Java Virtual Machine
Ravindra babu

apakah Anda yakin ... saya sudah membaca bahwa itu bagian dari ruang permgen (yang tidak menumpuk)? journaldev.com/2856/…

Dokumentasi Oracle lebih otentik
Ravindra babu

Apakah ambang batas ditetapkan untuk objek generasi muda dalam satuan waktu (mis. Ms)? atau putaran GC?
Sangat Objektif

16

Mesin virtual Java disusun dalam tiga generasi: generasi muda, generasi tua, dan generasi permanen. Sebagian besar objek pada awalnya dialokasikan pada generasi muda. Generasi lama berisi benda-benda yang selamat dari sejumlah koleksi generasi muda, serta beberapa benda besar yang dapat dialokasikan langsung di generasi lama. Generasi permanen memiliki objek yang menurut JVM nyaman untuk dikelola oleh pengumpul sampah, seperti objek yang menggambarkan kelas dan metode, serta kelas dan metode itu sendiri.


1

Memori dalam SunHotSpot JVM diatur menjadi tiga generasi: generasi muda, generasi tua dan generasi permanen.

  • Generasi Muda: objek yang baru dibuat dialokasikan untuk gen muda.
  • Generasi Lama: Jika objek baru meminta ruang heap yang lebih besar, itu akan dialokasikan langsung ke gen lama. Juga objek yang telah bertahan beberapa siklus GC akan dipromosikan ke gen lama yaitu objek yang berumur panjang dirumah dalam gen tua.
  • Generasi Permanen: Generasi permanen memegang objek yang menurut JVM nyaman untuk dikelola oleh pengumpul sampah, seperti objek yang menggambarkan kelas dan metode, serta kelas dan metode itu sendiri.

FYI: Gen permanen tidak dianggap sebagai bagian dari heap Java.

Bagaimana ketiga generasi berinteraksi / berhubungan satu sama lain? Objek (kecuali yang besar) pertama-tama dialokasikan untuk generasi muda. Jika suatu benda tetap hidup setelah x tidak. dari siklus pengumpulan sampah yang dipromosikan ke gen lama / bertenor. Oleh karena itu kita dapat mengatakan bahwa gen muda mengandung benda berumur pendek sedangkan gen tua mengandung benda yang memiliki umur panjang. Gen permanen tidak berinteraksi dengan dua generasi lainnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.