Pekala, burada birkaç soru var!
1 - Kısa ömürlü nesneler nasıl yönetilir?
Daha önce belirtildiği gibi, JVM, Zayıf Kuşak Hipotezini izlediği için çok büyük miktarda kısa ömürlü nesneyle mükemmel bir şekilde başa çıkabilir .
Ana belleğe (yığına) ulaşan nesnelerden bahsettiğimize dikkat edin. Bu her zaman böyle değildir. Oluşturduğunuz birçok nesne bir CPU kaydı bile bırakmaz. Örneğin, bu for-döngüsünü düşünün
for(int i=0, i<max, i++) {
// stuff that implies i
}
Döngü açmayı düşünmeyelim (JVM'nin kodunuzda yoğun bir şekilde gerçekleştirdiği optimizasyonlar). Eşitse max
, Integer.MAX_VALUE
döngünün yürütülmesi biraz zaman alabilir. Bununla birlikte, i
değişken döngü bloğundan asla kaçmayacaktır. Bu nedenle, JVM bu değişkeni bir CPU kaydına koyacak, düzenli olarak artıracak, ancak ana belleğe asla geri göndermeyecektir.
Bu nedenle, yalnızca yerel olarak kullanılıyorsa, milyonlarca nesne oluşturmak önemli değildir. Eden'de saklanmadan önce ölmüş olacaklar, bu yüzden Genel Sekreter onları fark etmeyecek.
2 - GC'nin ek yükünü azaltmak faydalı mı?
Her zamanki gibi duruma göre değişir.
Öncelikle, neler olup bittiğini net bir şekilde görebilmek için GC günlüğünü etkinleştirmelisiniz. İle etkinleştirebilirsiniz -Xloggc:gc.log -XX:+PrintGCDetails
.
Uygulamanız bir GC döngüsünde çok fazla zaman harcıyorsa, o zaman evet, GC'yi ayarlayın, aksi takdirde gerçekten buna değmeyebilir.
Örneğin, her 100 ms'de 10 ms süren genç bir GC'niz varsa, zamanınızın% 10'unu GC'de geçirirsiniz ve saniyede 10 koleksiyonunuz olur (ki bu huuuuge). Böyle bir durumda, bu 10 GC / s hala orada olacağından, GC ayarına zaman harcamam.
3 - Biraz deneyim
Belirli bir sınıfın büyük bir miktarını oluşturan bir uygulamada benzer bir sorun yaşadım. GC günlüklerinde, uygulamanın oluşturulma oranının 3 GB / sn civarında olduğunu fark ettim, bu çok fazla (hadi ... her saniye 3 gigabayt veri mi?!).
Sorun: Oluşturulan çok fazla nesnenin neden olduğu çok fazla sık GC.
Benim durumumda, bir bellek profilleyici ekledim ve bir sınıfın tüm nesnelerimin büyük bir yüzdesini temsil ettiğini fark ettim. Bu sınıfın temelde bir nesneye sarılmış bir çift boole olduğunu bulmak için örnekleri izledim. Bu durumda iki çözüm mevcuttu:
Algoritmayı bir boole çifti döndürmeyecek şekilde yeniden çalışın, bunun yerine her booleanı ayrı ayrı döndüren iki yöntemim var
Yalnızca 4 farklı örnek olduğunu bilerek nesneleri önbelleğe alın
Uygulamaya en az etkisi olduğu ve tanıtımı kolay olduğu için ikincisini seçtim. İş parçacığı güvenli olmayan bir önbelleğe sahip bir fabrika kurmak dakikalarımı aldı (sonunda yalnızca 4 farklı örneğe sahip olacağım için iş parçacığı güvenliğine ihtiyacım yoktu).
Tahsisat oranı ve aynı şekilde genç GC sıklığı 1 GB / s'ye düştü (3'e bölünür).
Umarım yardımcı olur !