繁体   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