2010-10-19 78 views
2

停止我的網絡應用程序後,大量的PermGen未被釋放。罪魁禍首似乎是WebappClassLoader(在Tomcat中,但它也發生在Jetty中),它由一堆其他對象的引用保存在內存中。下圖顯示了引用WebappClassLoader的對象以及引用它們的內容等等。是否可以阻止java.util.logging導致內存泄漏?

alt text

其中一個緊貼對象似乎是net.lag.logging.Level$INFO$一個實例中,向其中一個參考存儲在靜態known陣列中java.util.logging.Level

看來,java.util.logging.Level保持對其自身的所有實例的靜態引用。壞,討厭java.util.logging.Level!我能做些什麼嗎? java.util.logging框架被第三方庫使用,所以我認爲我沒有選擇不使用它。

+0

單位是什麼字節?日誌記錄佔用8個字節,你擔心它嗎? – bwawok 2010-10-19 02:21:03

+0

是的,它是字節,不,我不關心8字節。我關心的是,對WebappClassLoader的引用會阻止它被垃圾收集;它佔了大約10兆字節。 – David 2010-10-19 02:23:17

+0

您正在使用哪種JVM? – 2010-10-19 02:31:47

回答

2

爲了讓Sun修復Level實現或更改您的庫以廢除自定義級別,我能想到的唯一方法是將庫從Web應用程序類加載器移出並放入容器(共享或通用類加載器)。

如果您這樣做,仍然會有Level的自定義實例,但它們將不再鏈接到Web應用程序。所以如果你反彈webapp,它會繼續回收相同的級別(不會泄漏新的)。

當然,這會影響庫的類加載器,並且可能會中斷。有些東西需要在Web應用程序中,並且不能移動到容器中。即使圖書館繼續工作,它本身也可能保留與Web應用程序其他部分相似的引用,這又會是完全相同的問題。不過,試試吧。

+1

有關錯誤報告,請參閱http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6543126。 – Gili 2012-05-31 23:13:28