Java Çöp Toplama Günlüğü mesajları


96

Java'yı çöp toplama bilgilerini günlüklere dökecek şekilde yapılandırdım ( ayrıntılı GC ). Günlüklerdeki çöp toplama girişlerinin ne anlama geldiğinden emin değilim. Bu girdilerin bir örneği aşağıda yayınlanmıştır. Ben etrafında aradık Google ve katı açıklamalar bulamadı.

Bazı makul tahminlerim var, ancak girdilerdeki sayıların ne anlama geldiğine dair güvenilir kaynaklarla desteklenen kesin tanımlamalar sağlayan yanıtlar arıyorum. Sun belgelerine atıfta bulunan tüm yanıtlara otomatik +1. Sorularım:

  1. PSYoungGen neyi ifade eder? Önceki (genç?) Kuşakla bir ilgisi olduğunu varsayıyorum, ama tam olarak ne?
  2. İkinci üçlü sayı ile birincisi arasındaki fark nedir?
  3. Neden ilk üçlü sayı için bir ad (PSYoungGen) belirtilirken ikincisi belirtilmiyor?
  4. Üçlü içindeki her sayı (bellek boyutu) ne anlama geliyor? Örneğin 109884K-> 14201K'da (139904K), GC 109884k'den önceki bellektir ve ardından 14201K'ya düşürülür. Üçüncü sayı nasıl alakalı? Neden ikinci bir sayı setine ihtiyacımız olsun?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0.0454530 saniye]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0.0934560 saniye]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0.0682690 saniye]


tüm yığın, yığının genç nesil parçası, gc'nin
MarianP

Yanıtlar:


90

Çoğu, GC Ayarlama Kılavuzunda açıklanmıştır (yine de okumanız iyi olur).

Komut satırı seçeneği -verbose:gc, yığın ve çöp toplama hakkındaki bilgilerin her koleksiyonda yazdırılmasına neden olur. Örneğin, burada büyük bir sunucu uygulamasından çıktı verilmiştir:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Burada iki küçük koleksiyon ve ardından büyük bir koleksiyon görüyoruz. Oktan önceki ve sonraki sayılar (örneğin, 325407K->83000Kilk satırdan itibaren), sırasıyla çöp toplamadan önceki ve sonraki canlı nesnelerin birleşik boyutunu gösterir. Küçük toplamalardan sonra, boyut, çöp olan (artık canlı olmayan) ancak geri alınamayan bazı nesneleri içerir. Bu nesneler ya görevli kuşakta yer alır ya da görevli ya da kalıcı kuşaklardan referans alınır.

Parantez içindeki bir sonraki sayı (örneğin, (776768K)yine ilk satırdan itibaren), yığının kesin boyutudur: işletim sisteminden daha fazla bellek talep etmeden java nesneleri için kullanılabilen alan miktarı. Herhangi bir zamanda yalnızca bir tanesi kullanılabileceğinden, bu numaranın hayatta kalan alanlardan birini içermediğini ve sanal makine tarafından kullanılan meta verileri tutan kalıcı üretimi de içermediğini unutmayın.

Satırdaki son öğe (örneğin 0.2300771 secs), koleksiyonun gerçekleştirilmesi için geçen süreyi gösterir; bu durumda yaklaşık saniyenin dörtte biri.

Üçüncü satırdaki ana koleksiyonun biçimi benzerdir.

Tarafından üretilen çıktının formatı -verbose:gcgelecekteki sürümlerde değişebilir.

Seninkinde neden bir PSYoungGen olduğundan emin değilim; çöp toplayıcıyı değiştirdin mi?


Gc günlük dosyaları nerede bulunur?
Bay Lou

7
Bu cevap gerçekten orijinal soruları ele almıyor. Michaeljoseph'in cevabının daha iyi olduğunu hissediyorum. Ethan tarafından sorulan soruları ele alıyor ve orijinal örneği parçalara ayırmada daha iyi bir iş çıkarıyor. Cevabında iki konu varken (bağlantısı artık öldü ve rafa.ferreria diğerine işaret etti), bu sadece bir Kahin belgesini tekrarlamıyor.
Dirk

127
  1. PSYoungGen, küçük koleksiyon için kullanılan çöp toplayıcıyı ifade eder. PS, Parallel Scavenge anlamına gelir.
  2. İlk sayı kümesi genç neslin öncesi / sonrası boyutlarıdır ve ikinci küme tüm yığın içindir. ( Bir Çöp Toplama sorununun teşhisi , formatın ayrıntılarını verir)
  3. İsim, söz konusu jenerasyonu ve toplayıcıyı belirtir, ikinci set ise tüm yığın içindir.

İlişkili bir tam GC örneği, eski ve kalıcı nesiller için kullanılan toplayıcıları da gösterir:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

Son olarak, örnek günlük çıktınızın bir satırını parçalara ayırın:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107MB GC önce kullanılan, 14MB GC, maksimum genç kuşak boyutu sonra kullanılan 137Mb
  • GC'den önce kullanılan 675Mb yığın, GC'den sonra kullanılan 581Mb yığın, 1Gb maksimum yığın boyutu
  • küçük GC, JVM'nin başlamasından bu yana 8109.128 saniye meydana geldi ve 0.04 saniye sürdü

8
sadece küçük bir yorum, '()' arasındaki değer sonsuza kadar maksimum boyut değil, o an için maksimum boyuttur. GC, yığını daha az serbest bırakamazsa, o zaman bu limit operasyonel sistem için daha fazla alana ihtiyaç duyacak ve bu değer artacaktır. Tabi ki belirtilen sınıra
uyarak

@ rafa.ferreira Sanırım parantez içindeki değer, yani 1119040K, işlenmiş yığın boyutu. Sanmıyorum, GC herhangi bir yere 'maksimum yığın' boyutunu yazdırır. Referans 1 ve Referans 2
rohitmohta

23

Ben sadece ayrıntılı GC günlüğünü şu ile alabileceğinizi belirtmek istedim:

-XX:+PrintGCDetails 

parametre. Ardından cevaptaki gibi PSYoungGen veya PSPermGen çıktısını görürsünüz.

Ayrıca -Xloggc:gc.logaynı çıktıyı oluşturuyor gibi görünüyor, -verbose:gcancak ilkinde bir çıktı dosyası belirtebilirsiniz.

Örnek kullanım:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

Daha iyi verileri görselleştirmek için deneyebileceğiniz gcviewer (daha yeni bir sürümü bulunabilir github ).

Parametreleri doğru yazmaya özen gösterin, "+" işaretini unuttum ve JBoss'um herhangi bir hata mesajı vermeden başlamadı!


3
Java yeniden başlatıldığında gc.log'un üzerine yazılacağını unutmayın (örneğin tomcat'inizi bellek sorunları olduğu için yeniden başlatırsanız ve gc.log'u görmek istersiniz). Ya da en azından GC günlüklerini döndürürseniz değişecektir. Gc günlük kaydını kontrol eden birçok başka seçenek vardır. Oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html adresine bakın . Özellikle, düşünün-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.