Ölmekte olan bir uygulamadan yaptığım bir bellek dökümü var. Bütün mevcut yığınları tüketmiştir (-Xmx1024m). Web sayfalarını taramak için com.gargoylesoftware.htmlunit.WebClient
kullanır. Dakikada birkaç http isteği yapar, birkaç gün içinde ölür. Çöp kutusundan görüldüğü gibi, her biri taranan bir sayfanın tam içeriği de dahil olmak üzere, ilgili nesnelerin tonlarıyla birlikte, her biri 17123 örneğiyle HtmlPage
sınıfına sahiptir.Avcılık bellek sızıntıları, VisualVM: "GC kökü bulunamadı". Sıradaki ne?
Neden HtmlPage
'un çöp toplandığını anlamıyorum. Örnek referansları araştırdım ve herhangi bir kodumu referans olarak görmüyorum ve VisualVM, "GC root bulunamadı" diyor. Anladığım kadarıyla, nesnenin gc için uygun olduğu, ancak işe yaramadığı anlamına gelmelidir.
Uygulama basit bir bağımsız işlem olarak çalışıyor, herhangi bir web kapsayıcı veya uygulama sunucusu kullanmıyor.
Herhangi bir ipucu? Başka neye bakmalıyım?
Özellikleri:
- HtmlUnit'in v2.7
- java versiyonu "1.6.0_13" Java (TM) SE Runtime Environment (build 1.6.0_13-b03) Java HotSpot (TM) Sunucu VM (Linux my.lan
- 11.3-B02, karışık mod) inşa 2.6.18-128.el5 1. SMP Çar 17 Aralık 11:42:39 EST 2008 i686 i686 i386 GNU/Linux
Update1
Ben YourKit Java Profiler tarafından dökümü analiz etmeye çalıştık. 310mb tutulan boyuta sahip bir çok java.lang.ref.Finalizer
nesnesini gösteriyor. Onlar net.sourceforge.htmlunit.corejs.javascript.NativeGenerator#finalize()
finalizer için oluşturulmuş ve NativeGenerator
Window
, daha sonra HtmlPage
ve her şey için ifade eder.
Herkes neden bellekte kaldığını biliyor mu?
Not: Meraklı ancak VisualVM, "bekleyen sonlandırmayı" sıfır olarak gösterdi.
JVM için belirli komut satırı argümanlarını kullandınız mı? –
@ThomasJungblut '-Xmx1024m -XX: MaxPermSize = 128m -XX: + PrintGCDetails -XX: + PrintGCTimeStamps -XX: + UseConcMarkSweepGC' – kan
Ayrıca htmlunit 2.8 ile bir bellek sızıntısı yaşıyorum. Bir geçici çözüm olarak, WebClient'i günde bir kez yeniden örneklendiririm. Umarım bu hatayı izleyebilirsin. – milan