Çok iyi yazılmış grafiksel Java çöp toplama mekanizması

  • Otomatik çöp toplama nedir?
  • 1. Adım: İşaretleyin
  • 2. Adım: Temizle
  • sıkıştırma
  • Neden nesilsel çöp toplamaya ihtiyacımız var?
  • JVM üretimi
  • Nesil çöp toplama süreci

Otomatik çöp toplama nedir?

Otomatik çöp toplama, yığın belleğinde hangi nesnelerin kullanıldığını ve hangi nesnelerin kullanılmadığını bulmak ve ikincisini silmek için bir mekanizmadır.

Kullanılan sözde nesne (başvurulan nesne), programdaki işaretçinin işaret ettiği nesneyi ifade eder; kullanılmayan nesne (başvurulmayan nesne) herhangi bir işaretçi tarafından işaret edilmediğinden, işgal edilen bellek de geri dönüştürülebilir. Düşürmek.

C gibi bir programlama dili kullanırken, programcıların belleği kendileri manuel olarak ayırması ve serbest bırakması gerekir. Java farklıdır, bir çöp toplayıcıya sahiptir ve toplayıcı hafızayı serbest bırakmaktan sorumludur. Bu makale daha sonra çöp toplama mekanizmasının temel sürecini tanıtacaktır.

1. Adım: İşaretleyin

Çöp toplamanın ilk adımı işaretlemedir. Çöp toplayıcı hangi belleğin kullanımda olduğunu ve hangilerinin kullanılmadığını bulacaktır.

Yukarıdaki şekilde mavi, nesneye başvurulduğu ve turuncu, nesneye başvurulmadığı anlamına gelir. Çöp toplayıcı, hangilerine başvurulduğunu ve hangilerinin olmadığını bilmek için tüm nesneleri kontrol etmelidir. Sistemdeki tüm nesnelerin kontrol edilmesi gerekiyorsa, bu adım oldukça zaman alabilir. Java teknoloji yığınının WeChat resmi hesabını takip edin, cevap verin: JVM46, süper eksiksiz bir JVM ayarlama kılavuzu edinebilirsiniz.

2. Adım: Temizle

Bu adım, işaretli referans verilmeyen nesneleri silecektir.

Bellek ayırıcısı, yeni nesnelerin tahsis edilmesi için mevcut belleğe referansları tutar.

sıkıştırma

Performansı artırmak için, referans verilmeyen nesneleri sildikten sonra, kalan referans nesneleri bir araya getirebilir (sıkıştırabilirsiniz), böylece yeni nesneler daha kolay ve hızlı bir şekilde tahsis edilebilir.

Neden nesilsel çöp toplamaya ihtiyacımız var?

Daha önce de belirtildiği gibi, Java sanal makinesindeki tüm nesneleri tek tek işaretlemek ve sıkıştırmak çok verimsizdir: Ne kadar çok nesne ayrılırsa, çöp toplama o kadar uzun sürecektir. Bununla birlikte, istatistiklere göre, çoğu nesne uzun süre yararlı olmayacaktır.

Bir örneğe bakalım. (Aşağıdaki şekilde, dikey eksen ayrılan baytları temsil eder ve yatay eksen program çalışma süresini temsil eder)

Yukarıdaki şekilde görülebileceği gibi, hayatta kalan (serbest bırakılmayan) nesnelerin sayısı çalışma süresiyle azalır. Şeklin sol tarafındaki zirveler, çoğu konunun aslında kısa ömürlü olduğunu da gösteriyor.

JVM üretimi

Önceki kurallara göre, JVM'nin verimliliğini artırmak için kullanılabilir. Yöntem, yığını birkaç bölüme (sözde kuşak), yani genç kuşak, eski kuşak ve ölümsüz kuşak ayırmaktır.

Genç nesil hafızaya yeni nesneler tahsis edilecektir. Yeni nesil bellek dolduğunda, ölü nesneler için küçük çöp toplama işlemini başlatacaktır. Yeni nesil hafızanın bir parçasında, ne kadar ölü olursa, kurtarma süreci o kadar hızlı olur; hala hayatta olan nesneler bu zamanda yaşlanacak ve sonunda eski nesil hafızaya girecek kadar yaşlanacaktır.

Dünyayı Durdur olay-küçük çöp toplama "Dünyayı Durdur" adlı bir olaya aittir. Bu tür bir olay meydana geldiğinde, olay tamamlanana kadar tüm program iş parçacıkları askıya alınmalıdır (örneğin, tüm kurtarma çalışmaları burada tamamlanır).

Eski nesil, uzun ömürlü nesneleri korumak için kullanılır. Genellikle bir eşik belirlenir ve yaşa ulaşıldığında genç nesil nesnesi eski nesle taşınacaktır. Sonunda eski nesil de geri dönüştürülecek. Bu olay Binbaşı GC olur.

Büyük GC ayrıca STW'yi (Dünyayı Durdur) tetikleyecektir. Genel olarak, Major GC çok daha yavaştır çünkü tüm canlı nesneleri içerir. Bu nedenle, duyarlı uygulamalar için, Majör GC'den mümkün olduğunca kaçınılmalıdır. Ayrıca Majör GC'nin STW süresinin eski nesil çöp toplayıcı türünden etkilendiğine dikkat edin.

Kalıcı nesil, JVM tarafından uygulamadaki sınıfları ve yöntemleri açıklamak için kullanılan meta verileri içerir. Kalıcı nesil, uygulama tarafından kullanılan sınıflara göre çalışma zamanında JVM tarafından doldurulur. Ek olarak, Java SE sınıf kitaplıkları ve yöntemleri de burada depolanır.

JVM, belirli sınıflara artık ihtiyaç duyulmadığını tespit ederse ve diğer sınıfların alana ihtiyacı olabilirse, bu sınıflar geri alınabilir.

Nesil çöp toplama süreci

Yığının neden farklı nesillere bölündüğünü anladığınıza göre, artık bu alanların nasıl etkileşime girdiğini görmenin zamanı geldi. Aşağıdaki resimler, JVM'deki nesne tahsisini ve yaşlandırma sürecini tanıtacaktır.

İlk olarak, herhangi bir yeni nesneyi eden uzayına ayırın. Hayatta kalanların her ikisi de boş.

Eden alanı dolduğunda, hafif bir çöp toplama işlemi tetiklenir.

Başvurulan nesne, hayatta kalan ilk alana taşınır. Eden alanı temizlendiğinde, başvurulmayan nesneler silinecektir.

Bir sonraki Minor GC'de Eden bölgesi aynısını yapacak. Başvurulmayan nesneleri silin ve başvurulan nesneleri Survivor alanına taşıyın. Ancak burada ikinci Survivor alanına (S1) taşındılar.

Ayrıca ilk Survivor alanında (S0), son Minor GC'de hayatta kalan nesneler yaşlarını artıracak ve S1'e taşınacak. Hayatta kalan tüm nesneler S1'e taşındıktan sonra, S0 ve Eden bölgeleri temizlenecek. Survivor alanında farklı yaşlarda nesneler olduğunu unutmayın.

Bir sonraki Minor GC'de aynı işlem tekrarlanacaktır. Ancak bu sefer Survivor bölgesi değiştirilecek. Başvurulan nesne S0'a taşınır. Hayatta kalan nesneler yaşla birlikte artar. Eden bölgesi ve S1 temizlendi.

Bu slayt promosyonu gösterir. Daha küçük bir GC'den sonra, yaşlanan nesneler belirli bir yaş eşiğine (bu örnekte 8) ulaştığında, genç nesilden eski nesile yükseltilir.

Daha küçük GC'ler oluşmaya devam ettikçe, nesneler eski nesil alana genişletilmeye devam edecek.

Yani bu, genç neslin neredeyse tüm sürecini kapsıyor. Sonunda, alanı temizlemek ve nihayetinde sıkıştırmak için GC esas olarak eski nesilde gerçekleştirilecek.

Kaynak:

:-D WeChat Kimliği Arama (ID: Taro kaynak kodu ), çeşitli Java kaynak kodu analizi, ilke açıklaması, mülakat soruları ve çalışma kılavuzları edinebilirsiniz.

:-D Ve yanıtla [ kitabın Bundan sonra, yazarın önerdiği mimariye girişten başlayarak 100 adet Java kitabı alabilirsiniz.

:-D Ve yanıtla [ Teknoloji Grubu ] Bundan sonra, Java, arka uç ve mimariyi tartışmaya adanmış bir teknoloji grubuna katılabilirsiniz.

Hadi, Sao Nian ~

Burası Lugou Köprüsü 82 yıl önce
önceki
Bugün, Pekin Daxing Uluslararası Havalimanı'nın ana projesi planlandığı gibi tamamlandı! 50 fotoğraf tüm süreci inceliyor
Sonraki
Genel olarak dağıtılmış kilitleri açıklamak ve okuduktan sonra anlamazsanız yazar kaybeder
Neden büyük şirketler yalnızca 211 öğrenciyi işe alıyor? Yetenek ve eğitim değil, iç personel cevap veriyor
Çinli bir trafik polisi tarafından yakalanan ilk NBA yıldızı! Harden: Sadece manzarayı görmek istiyorum
Programcı içini çekti: kuzen ekipte küçük bir oyuncuydu ve gelirini yanlış okuduğunu düşündü
OCT Group'un Yoksulluğun Azaltılması için "Yaratıcı Fikirleri" - Dağlık bölgelerdeki çocuklara gülücükler getiren bir "Küçük Kırmızı Çiçek"
Daxing Uluslararası Havalimanı terminal alanı projesi tamamlanma kabulünü geçti
Öğretmenlere ve arkadaşlara veda edin ve ilerleyin
10 açık kaynak ve mükemmel arka plan yönetim sistemi UI paneli
Somut olmayan kültürel mirası size yaklaştırıyor: sevimli bebek üretimini öğretmek için el ele
Dalgalanmalara rasyonel bir şekilde yanıt verin: Yeni kan alımlarının bilim ve teknoloji inovasyon kurulu üzerindeki etkisinin körü körüne abartılması tavsiye edilmez.
İlk rapor | Başarıyla "dahil edildi"! Genel sekreter bu antik kentle neden bu kadar ilgileniyor?
Yaz ortasında en mutlu şey dünyayı sizinle birlikte izlemektir
To Top