У меня есть дамп памяти, который я сделал из умирающего приложения.Он израсходовал всю доступную кучу (-Xmx1024m).Он использует com.gargoylesoftware.htmlunit.WebClient
для сканирования веб-страниц.Делает несколько http запросов в минуту, умирает через несколько дней.Как видно из дампа, у него ~ 1750 экземпляров класса HtmlPage
, каждый с тонами связанных объектов, включая полное содержимое просканированной страницы.
Я не могу понять, почему HtmlPage
не являютсямусор собрал.Я исследовал ссылки на экземпляры, и я не вижу своего кода, содержащего ссылку на него, и VisualVM говорит, что «корень GC не найден».Как я понимаю, это должно означать, что объект имеет право на gc, но он не работает.
Приложение работает как простой автономный процесс, оно не использует веб-контейнеры или серверы приложений.
Есть намеки?На что еще мне обратить внимание?
Характеристики:
- htmlunit v2.7
- Java-версия "1.6.0_13"Среда выполнения Java (TM) SE (сборка 1.6.0_13-b03) Серверная виртуальная машина Java HotSpot (TM) (сборка 11.3-b02, смешанный режим)
- Linux my.lan 2.6.18-128.el5 # 1SMP ср 17 дек 11:42:39 EST 2008 i686 i686 i386 GNU / Linux
Update1
Я попытался проанализировать дамп с помощьюYourKit Java Profiler.Он показывает мне много java.lang.ref.Finalizer
объектов с сохраненным размером 310 МБ.Они созданы для финализатора net.sourceforge.htmlunit.corejs.javascript.NativeGenerator#finalize()
, а NativeGenerator
относится к Window
, затем к HtmlPage
и ко всему.
Кто-нибудь знает, почему они остаются в памяти?
Примечание : Любопытно, но VisualVM показывал "ожидающий финализацию" как ноль.