2008-12-04 12 views
9

我繼承了一個Java applet(實際的<APPLET>),它在運行大約4天后引發OutOfMemory異常。這個applet的本質就是人們真的會長時間地開放它。Java堆中的constantPoolClass?

運行後,JMAP -histo近兩天顯示前堆消費者:

 
    num #instances #bytes class name 
    --- ---------- ------ ---------- 
     1:  14277 7321880 <constantPoolKlass> 
     2:  59626 5699968 <constMethodKlass> 
     3:  14047 5479424 <constantPoolCacheKlass> 
     4:  14277 5229744 <instanceKlassKlass> 
     5:  59626 4778944 <methodKlass> 
     6:  71026 3147624 <symbolKlass> 

麻煩的是,我不明白這些事情的。至少有兩件事情會發生:constantPoolKlass + constantPoolCacheKlass + instanceKlassKlass與constMethodKlass + methodKlass相關。從名稱來看,它們似乎與類加載器相關。

如果我不得不猜測我會說小程序已經創建了大約14,277個對象,其中每個對象都有大約4個方法,總共大約59626個方法。然而,jmap輸出並沒有顯示任何具有如此大量實例的類,也沒有看起來像其他類對象的總和合計爲14277.所以也許我對這些對象的作用是不正確的。有人可以解釋嗎?

回答

4

是的,看起來你正在泄漏班級裝載機。如果你實際上沒有在你自己的代碼中創建類加載器(通常通過URLClassLoader.newInstance或XSLT),那麼它可能與重新加載applet有關(儘管你通常會得到相同的類加載器)。泄漏的可能原因是ThreadLocal,JDBC驅動程序和java.beans。