我想知道JVM是否通常会卸载类以减少PermGen空间。以下是我的问题:
- JVM默认会卸载Java类吗?
- 关闭Jar类加载器是否会卸载该jar中的所有已加载类?
- 应使用哪些命令/方法来允许卸载类?
顺便提一下,我尝试过一些网络上的解决方案,但没有一个能回答我的问题。(例如:JVM标志CMSClassUnloadingEnabled实际上是做什么的?)
PS:我是指Java 6+hibernate(类加载由hibernate处理)
我想知道JVM是否通常会卸载类以减少PermGen空间。以下是我的问题:
顺便提一下,我尝试过一些网络上的解决方案,但没有一个能回答我的问题。(例如:JVM标志CMSClassUnloadingEnabled实际上是做什么的?)
PS:我是指Java 6+hibernate(类加载由hibernate处理)
默认情况下,永久代正在被收集。
永久代由一个空间组成,但没有自己的收集器。相反,该空间作为老年代的一部分进行收集。
根据这个可视化GC页面。
在旧的JVM中,您可以使用-XX:+CMSPermGenSweepingEnabled
标志启用此功能。
据我所知,当类未从任何ClassLoader引用时,它们会被卸载。
java.lang.OutOfMemoryError: PermGen space
错误是由于类加载器中的内存泄漏导致的。在取消部署/重新部署Web应用程序时经常出现此问题。
-XX:+UseConcMarkSweepGC
和-XX:+CMSClassUnloadingEnabled
启动JVM。这将允许卸载未使用的类,即使它们的类加载器仍然存在。另请参阅Java中的类卸载?
OutOfMemoryError: PermGen space
错误,并想知道为什么旧 Jar 文件中的类一旦被丢弃就不会被卸载。 - Adel BoutrosSessionFactory
启动时会加载所有的Entity
类到内存中。然而,Hibernate
以lazy
的方式加载实体实例,只有在需要时才会加载。JVM
需要内存时,类可以被GC
卸载。实体实例也可以被垃圾回收,但是和其他对象一样,只有当没有指向它们的引用时才会被回收。换句话说,如果Hibernate
会话仍然处于打开状态,就无法卸载Entity
实例。要卸载它们,您需要清除持久性上下文或关闭会话。
new SomeClass
在“主线”代码中引用的类来删除类 - 您必须从其名称作为字符串开始加载类。) - Hot Licks