我繼承了一個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.所以也許我對這些對象的作用是不正確的。有人可以解釋嗎?