[英]Is the PermGen space ever decreased?
我想知道JVM是否通常卸載類以減少PermGen空間。 所以我的問題在這里:
僅供參考,我確實在網上嘗試了一些解決方案,但沒有人回答我的問題。 (例如: JVM標志CMSClassUnloadingEnabled實際上做了什么? )
PS:我指的是Java 6 + hibernate(類加載由hibernate處理)
擺脫加載類的唯一方法是允許JVM通過消除對此類加載器的所有引用來加載這些類的類加載器。 當我們取消部署webapp時,這就是Web服務器中發生的情況。
目前,默認情況下正在收集永久代。
永久世代由一個空間組成,但沒有自己的收集器。 相反,這個空間是作為老一代的一部分收集的。
根據這個visualgc頁面。
在舊的JVM中,您可以使用-XX:+CMSPermGenSweepingEnabled
標志啟用此功能。
當AFAIK類未從任何ClassLoader引用時,它們將被卸載。
java.lang.OutOfMemoryError: PermGen space
錯誤是由類加載器中的內存泄漏引起的。 取消部署/重新部署Web應用程序時的常見問題。
假設你在談論HotSpot,Oracle / Sun JVM。
-XX:+UseConcMarkSweepGC
和-XX:+CMSClassUnloadingEnabled
選項啟動JVM。 這將允許卸載未使用的類,即使它們的類加載器仍然存在。 另請參見在java中卸載類?
當SessionFactory
啟動時,Hibernate會加載內存中的所有Entity
類。 另一方面,只有在需要時, Hibernate
才會以lazy
方式加載Entity istances。
當JVM
需要內存時, GC
可以卸載類。 實體istances也是垃圾收集,但是,與任何其他對象一樣,只有當沒有更多的引用指向它們時。 換句話說,如果Hibernate
會話仍處於打開狀態,則無法卸載Entity
。 要卸載它們,您需要清除持久性上下文或關閉會話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.