`
dyllove98
  • 浏览: 1418115 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39367
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80565
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133699
社区版块
存档分类
最新评论

关于sun的Hotspot JVM中的PermGen能否被GC的问题(-XX:+UseConcMarkSweepGC )

阅读更多

关于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之类的线程应用。

分享到:
评论

相关推荐

    JVM性能调优.docx

    - `-XX:PermSize` 和 `-XX:MaxPermSize` 用于设置永久代的初始和最大大小,这两个参数在较新的JVM版本(如Java 8及以上)中已被移除,取而代之的是元空间(Metaspace)。 3. **垃圾收集器配置**: - `-XX:+...

    JVM配置资料JVM配置资料

    - **PermGen/Metaspace Overflow**:持久代/元空间溢出,通常由于过多的类或大型静态变量引起,可通过增大相应区域大小或限制类加载。 9. **JIT编译器(Just-In-Time Compiler)**: - **HotSpot** JVM包含C1和C2...

    NetBeans优化.docx

    如果在开发中经常遇到 `java.lang.OutOfMemoryError: PermGen space` 的异常,可以将此 PermSize 设大一些。 经验之谈 根据经验,Xmx 应设为物理内存的一半,初始堆大小 Xms 是 Xmx 的 1/2。例如,在 1G 内存的...

    JAVA共舞里的所有精华帖子

    4. JIT编译器:HotSpot JVM中的Just-In-Time编译器能将频繁执行的热点代码编译成机器码,提高运行速度。了解何时启用并优化JIT,可以显著提升性能。 5. 参数调优:通过设置JVM启动参数,例如-Xms, -Xmx设置堆内存...

    20道面试官常问的JVM面试题!.zip

    14. **方法区与 PermGen/Metaspace**:对比HotSpot JVM中的PermGen和Metaspace区域,了解它们的变化原因和影响。 15. **内存模型与并发**:理解Java内存模型(JMM),了解volatile、synchronized、原子变量类等在...

    java jvm及性能优化_javajvm优化_Java性能分析_

    2. 方法区:存储类的元数据,包括常量池、字段和方法数据等,HotSpot中的 PermGen 被移除,替换为 Metaspace。 3. 栈内存:每个线程有自己的Java栈,用于存储局部变量、方法参数和操作数栈。 三、垃圾收集与内存...

    深入java 虚拟机

    常见的OOM异常有`OutOfMemoryError: Java heap space`(堆内存溢出)、`PermGen space`(永久代溢出,Java 8后已不存在)和`Metaspace`(元空间溢出)。 9. **线程模型** JVM支持多线程编程,每个线程有自己的程序...

Global site tag (gtag.js) - Google Analytics