JVM调优 – CMS模式
配置
- JAVA_OPTS中添加如下配置
-XX:NewRatio=1
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSInitiatingOccupancyFraction=80
-XX:+CMSParallelRemarkEnabled
-XX:SoftRefLRUPolicyMSPerMB=0
参数说明
-XX:NewRatio=1
设置年老代为并发收集
- 并发收集适用于响应优先的服务器,保证系统的响应时间,减少垃圾收集时的停顿时间
- JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
该参数可能会导致-XX:NewRatio的配置失效
-XX:+UseCMSCompactAtFullCollection
打开对年老代的压缩
- 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。
- 该参数是打开对年老代的压缩。可能会影响性能,但是可以消除碎片。
- 辅助参数:
- -XX:CMSFullGCsBeforeCompaction=5
- 此值设置运行多少次GC以后对内存空间进行压缩、整理。
- 辅助参数:
-XX:CMSInitiatingOccupancyFraction=80
CMS回收阀值
- 该参数值是指设定CMS在对内存占用率达到80%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);
- 辅助参数:
- -XX:+UseCMSInitiatingOccupancyOnly
- 这两个设置一般配合使用,一般用于“降低CMS GC频率或者增加频率、减少GC时长”的需求
- 辅助参数:
-XX:+CMSParallelRemarkEnabled
降低标记停顿
- CMS使用的是两次短暂停的标记整理算法,它的收集周期是:
- 初始标记(CMS-initial-mark)
- 并发标记(CMS-concurrent-mark)
- 重新标记(CMS-remark)
- 并发清除(CMS-concurrent-sweep)
- 并发重设状态等待下次CMS的触发(CMS-concurrent-reset)
- 其中的1,3两个步骤需要暂停所有的应用程序线程的
- 该参数是用来减少第二次暂停的时间配置
-XX:SoftRefLRUPolicyMSPerMB=0
每兆堆空闲空间中SoftReference的存活时间
- 引申:
- 除了强引用外,Java还引入了SoftReference,WeakReference,PhantomReference,FinalReference
- Java额外引入这个四种类型引用主要目的是在jvm 在gc时,按照引用类型的不同,在回收时采用不同的逻辑。
- 这几种类型的引用主要在jvm内存缓存、资源释放、对象可达性事件处理等场景会用到。