2013-04-16 16 views
24

Makinemde başlattığım her java işlemi varsayılan olarak 2 çöp toplayıcısına sahip gibi görünüyor. Bunu JConsole üzerinden kontrol ediyorum.Java'da birden çok çöp toplayıcısı

Örnek - şu anda çalışan tutulma için. Onların örtüşen havuzları varsayıyorum

Collection Count - 241 
Collection Time - 2428 
Memory Pool Names - java.lang.String[2] 

PS MarkSweep

Collection Count - 221 
Collection Time - 102118 
Memory Pool Names - java.lang.String[4] 

PS Scavenge. İki çöp toplayıcısı, aynı havuzları (Cennet, kurtulan, yaşlı gen) kullanırken nasıl çalışır? Havuzlar arasında nesnelerin hareketinde çakışma yok mu (ikinci algoritma çağrıldığında 1'den sağkafadan diğerine hareket gibi)? Olmasa bile, havuz başına birden fazla kolektöre neden ihtiyacımız var?

this article on GC okudum. Farklı büyük ve küçük GC'ler için farklı toplayıcılar kullanmaya başvururlar, ancak aynı havuzda birden çok toplayıcı kullanmanın bir referansı yoktur.

+0

Farklı nesiller için farklı koleksiyonculara sahip olmak ne garip? – Mikhail

+0

Farklı jenerasyonlar için farklı kolektörler kullanmayı anlıyorum, ama aynı jenerasyonlar için çok sayıda kollektör varmış gibi görünüyor. Bu nasıl çalışıyor? –

+0

Büyük koleksiyonlar sadece eski nesiller için değil, tüm yığınları temizler. – Mikhail

cevap

34

Çakışan havuzlara sahip olduklarını varsayıyorum.

Bu varsayım yanlıştır. PS Scavenge genç (eden, survivor) nesillerinde kullanılacak ve PS MarkSweep eski nesilde kullanılacaktır. Tek “örtüşen”, PS Scavenge nesnelerini bir süredir etrafta eski nesle taşıyacak ve PS MarkSweep'in onlarla başa çıkmasına izin verecek.

Farklı havuzlar için farklı çöp toplayıcılarına sahip olmanın yararı, Eden havuzundaki nesneler için iyi çalışan bir algoritmanın, eski nesil nesneler için iyi bir şekilde işe yaramayacağıdır.

... genç kuşak toplama algoritması:

This article covers the various options for different garbage collectors working together.

Bildiğim kadarıyla hiçbir eski nesil içine nesneleri taşımak için boşluk, this (admittedly old) whitepaper from Sun olduğunda ortaya "büyük" koleksiyonları olarak şöyle diyor çalışmıyor. Bunun yerine, tüm nesilde eski nesil koleksiyon algoritması kullanılır.

+0

Arama yaparken bu makaleye rastladım, ancak JDK 1.7.0_04 için yazdığı kadarıyla ayrıntılı bir şekilde okumayı bıraktım, 1.6 kullanıyorum. Teşekkürler, okuyacağım ve soruma cevap verip vermediğini anlayacağım. –

+0

doğru cevabı işaretlemekle birlikte, büyük bir koleksiyonda (tüm yığın üzerinde bir koleksiyon çalıştıran) kollektörün hangi alanda kullanıldığını açıklayabilir misiniz? –

+1

@gap_j - Eski bir bültende bulduğum büyük koleksiyonlarla ilgili bir şeyler ekledim. Umarım hala doğrudur. –

1

Formu sağladığınız madde:

Tipik genç nesilden hayatta kalan nesnelerin bazı fraksiyon her küçük toplama sırasında tenured kuşağa taşınır. Sonuç olarak, kiralanan nesil dolduracak ve toplanmalı, bu da tüm yığınının toplandığı büyük bir koleksiyonla sonuçlanmalıdır. Büyük koleksiyonlar, minör koleksiyonlarından çok daha uzun süre dayanmaktadır, çünkü önemli sayıda daha fazla nesne içermektedir.

+0

Büyük koleksiyon ayrıca küçük bir GC yapar. Büyük bir koleksiyon sırasında minör GC için hangi kollektörün kullanıldığını belirtmez. –

İlgili konular