簡體   English   中英

PermGen空間是否減少了?

[英]Is the PermGen space ever decreased?

我想知道JVM是否通常卸載類以減少PermGen空間。 所以我的問題在這里:

  1. Java類是否默認從JVM中卸載?
  2. 關閉Jar類加載器會從該jar中卸載所有加載的類嗎?
  3. 應該使用哪些命令/方法來卸載類?

僅供參考,我確實在網上嘗試了一些解決方案,但沒有人回答我的問題。 (例如: 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。

  1. 如果沒有引用它們。 請注意,所有類都引用了它們的類加載器,反之亦然,並且所有對象都引用了它們的類。
  2. 也許。 你是什​​么意思“靠近”?
  3. 使用-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM