我想知道JVM是否正常卸载类以减少PermGen空间。所以我的问题在这里:
- Java类是否默认从JVM中卸载?
- 关闭Jar类加载器会从该jar中卸载所有加载的类吗?
- 应该使用哪些命令/方法来卸载类?
仅供参考,我确实在网上尝试了一些解决方案,但没有人回答我的问题。 (例如: JVM标志CMSClassUnloadingEnabled实际上做了什么?)
PS:我指的是Java 6 + hibernate(类加载由hibernate处理)
我想知道JVM是否正常卸载类以减少PermGen空间。所以我的问题在这里:
仅供参考,我确实在网上尝试了一些解决方案,但没有人回答我的问题。 (例如: JVM标志CMSClassUnloadingEnabled实际上做了什么?)
PS:我指的是Java 6 + hibernate(类加载由hibernate处理)
Hibernate加载所有 Entity
在内存中的类时 SessionFactory
开始。另一方面,实体的加载由 Hibernate
在一个 lazy
方式,只在需要时。
可以通过卸载类 GC
当。。。的时候 JVM
需要记忆。
实体istances也是垃圾收集,但是,与任何其他对象一样,只有当没有更多的引用指向它们时。换一种说法 Entity
如果是,则不能卸载 Hibernate
会议仍然开放。要卸载它们,您需要清除持久性上下文或关闭会话。
摆脱加载类的唯一方法是允许JVM通过消除对此类加载器的所有引用来加载这些类的类加载器。当我们取消部署webapp时,这就是Web服务器中发生的情况。
目前,默认情况下正在收集永久代。
永久世代由一个空间组成,但没有自己的收集器。相反,这个空间是作为老一代的一部分收集的。
根据 这个visualgc 页。
在旧的JVM中,您可以使用 -XX:+CMSPermGenSweepingEnabled
旗。
当AFAIK类未从任何ClassLoader引用时,它们将被卸载。
java.lang.OutOfMemoryError: PermGen space
错误是由类加载器中的内存泄漏引起的。取消部署/重新部署Web应用程序时的常见问题。
假设你在谈论HotSpot,即Oracle / Sun JVM。
-XX:+UseConcMarkSweepGC
和 -XX:+CMSClassUnloadingEnabled
。这将允许卸载未使用的类,即使它们的类加载器仍然存在。也可以看看 在java中卸载类?