关于sun的Hotspot JVM中的PermGen能否被GC的问题
首先要说明的是PermGen的作用,PermGen是在JVM启动时,类和方法的Meta信息被加载到内存,放在PermGen中。
一般来说,该PermGen是不会被GC掉的,但是也要视JDK的版本和GC的策略有所区别。
(1)、在JDK1.5的版本中,缺省的GC策略是不会对PermGen进行GC的,但是如果想要PermGen被GC,可以通过CMS策略来
实施,样例配置如下:
-server -Xms512m -Xmx512m -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=40m -XX:MaxPermSize=64m -XX:+HeapDumpOnOutOfMemoryError -XX:SurvivorRatio=8
POC如下图:

此处需要注意的是:使用CMS(ConcMarkSweep)策略时,必须有:-XX:+CMSPermGenSweepingEnabled 和-XX:+CMSClassUnloadingEnabled
来配合同时启用,才可以对PermGen进行GC(
实际主要参数为:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
)。而且参数:-XX:+CMSPermGenSweepingEnabled在JDK1.6中是不存在的。
可以通过jconsole中的MBeans=>com.sun.management.HotSpotDiagnostic来验证JVM中的参数。
(2)、在JDK1.6的版本中,缺省的GC策略是不会对PermGen进行GC的,但是如果想要PermGen被GC,可以通过CMS策略来
实施,样例配置如下:
-server -Xms512m -Xmx512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:PermSize=40m -XX:MaxPermSize=64m -XX:+HeapDumpOnOutOfMemoryError
实际主要参数为:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
效果图如下:

总结:CMS策略可以对PermGen进行GC,但是前提是应用程序停止后能保证其所使用的类完全达到可以被GC的条件,如果某些web应用中配置了listener的话,这些web应用通过应用服务器的web控制台停掉后,其listener并不会停掉,导致该应用所加载的类不会被卸载。因为:listener中的两个方法,contextInitialized()是在Servlet容器启动时执行,而contextDestroyed()是在Servlet容器停止时执行。因此要想让PermGen在应用服务器启动状态下被GC,需要以下两个条件:
(1)、配置CMS策略,如:
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled,只是jdk1.6中不需要-XX:+CMSPermGenSweepingEnabled参数;
(2)、所控制的web应用程序,不能配置类似listener之类的线程应用。
分享到:
相关推荐
- `-XX:PermSize` 和 `-XX:MaxPermSize` 用于设置永久代的初始和最大大小,这两个参数在较新的JVM版本(如Java 8及以上)中已被移除,取而代之的是元空间(Metaspace)。 3. **垃圾收集器配置**: - `-XX:+...
- **PermGen/Metaspace Overflow**:持久代/元空间溢出,通常由于过多的类或大型静态变量引起,可通过增大相应区域大小或限制类加载。 9. **JIT编译器(Just-In-Time Compiler)**: - **HotSpot** JVM包含C1和C2...
如果在开发中经常遇到 `java.lang.OutOfMemoryError: PermGen space` 的异常,可以将此 PermSize 设大一些。 经验之谈 根据经验,Xmx 应设为物理内存的一半,初始堆大小 Xms 是 Xmx 的 1/2。例如,在 1G 内存的...
4. JIT编译器:HotSpot JVM中的Just-In-Time编译器能将频繁执行的热点代码编译成机器码,提高运行速度。了解何时启用并优化JIT,可以显著提升性能。 5. 参数调优:通过设置JVM启动参数,例如-Xms, -Xmx设置堆内存...
14. **方法区与 PermGen/Metaspace**:对比HotSpot JVM中的PermGen和Metaspace区域,了解它们的变化原因和影响。 15. **内存模型与并发**:理解Java内存模型(JMM),了解volatile、synchronized、原子变量类等在...
2. 方法区:存储类的元数据,包括常量池、字段和方法数据等,HotSpot中的 PermGen 被移除,替换为 Metaspace。 3. 栈内存:每个线程有自己的Java栈,用于存储局部变量、方法参数和操作数栈。 三、垃圾收集与内存...
常见的OOM异常有`OutOfMemoryError: Java heap space`(堆内存溢出)、`PermGen space`(永久代溢出,Java 8后已不存在)和`Metaspace`(元空间溢出)。 9. **线程模型** JVM支持多线程编程,每个线程有自己的程序...