[英]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.