- 浏览: 1869687 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
jquery打印指定的div -
GentlemanQc:
...
quartz系列(二)spring3.2.5与quartz2.1.7集群版集成简要说明 -
静夜独窗:
你好,能说一下server.xml增加的配置是怎么影响性能的吗 ...
tomcat7.0性能优化-挑战极限精简版 -
beyondfengyu:
beyondfengyu 写道如果每个客户进程的时间不同步,时 ...
java并发(二十二)分布式锁 -
beyondfengyu:
如果每个客户进程的时间不同步,时间超前的进程是不是更容易得到锁 ...
java并发(二十二)分布式锁
初始标记
CMS-initial-mark
并发标记
CMS-concurrent-mark
CMS-concurrent-preclean
CMS-concurrent-abortable-preclean
重新标记
CMS-remark
并发清理
CMS-concurrent-sweep
重置线程
CMS-concurrent-reset
其中preclean该步用于重新扫描在concurrent mark阶段CMS Heap中被新创建的对象或从新生代晋升到旧生代对象的引用关系,以减少remark所需耗费的时间,这是Sun JDK 1.5后增加的一个优化步骤。
可选参数
-XX:CMSInitiatingOccupancyFraction=85(触发FULL GC的老年代使用百分比)
-XX:CMSFullGCsBeforeCompaction=5(多少次后进行内存压缩)
-XX:ParallelGCThreads=8(并发标记和清除时的线程数)
其他参数
-XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集
CMS触发参数与条件(与eden区有关系)
-XX:CMSScheduleRemarkEdenSizeThreshold=2M
-XX:CMSScheduleRemarkEdenPenetration=50
-XX:CMSMaxAbortablePrecleanTime=5000(单位为毫秒)
当eden space占用超过CMSScheduleRemarkEdenSizeThreshold时,执行此步,并且将一直并发的执行到eden space的使用率超过CMSScheduleRemarkEdenPenetration,之后触发remark动作,过CMSMaxAbortablePrecleanTime时间扔为达到要求,则直接触发CMS-remark
常用的优化配置示例
案例一:空跑
空跑eclipse的时候,占用了507K的新生代空间,老生代无任何数据。持久代使用了3033K空间。其中默认值遵循了eden:survival=8:1的原则。
案例二:验证对象大小
新生代使用的空间为6651K = 507 + 2048 * 3,所以新分配的3个2M对象,占用了6M的空间。但是没有发生GC,如果再分配一个2M对象,就会超出eden空间进行一次minor gc。
案例三:minor GC
从内容来看,执行了一次新生代的垃圾回收操作。对象占用空间从6487K减少到173K,其中总新生代可用空间(1*eden + 1*survival)即9216K,耗时0.0048546 secs,整个堆内存的情况为闸弄空间从6487K降低到6319K,其中总可用堆大小为19456K。其中查看heap,可知道新生代已用2385K,老生代使用6146K,基本与之前分配的3个2M对象2048*3=6144相等,表明此3个对象进行minor GC后,进入了老年代。而新生代占用的空间2385中,基本与刚分配的第四个2M对象相等。下个实验,我们将触发major GC即:full gc
案例四:major GC
本案例开启参数-XX:+UseCMSInitiatingOccupancyOnly
案例五:major GC
本案例删除参数-XX:+UseCMSInitiatingOccupancyOnly
案例六:设置CMS的preclean超时触发
通过启动参数CMSScheduleRemarkEdenSizeThreshold我们可以知道,当eden区使用超过1M的时候,CMS垃圾收集触发以后,就会启动preclean(这个是JDK1.5的新特性),当并发执行到CMSScheduleRemarkEdenPenetration百分比值时候直接触发remark,如果设置了XX:CMSMaxAbortablePrecleanTime,则在CMSMaxAbortablePrecleanTime时间后,直接触发remark,忽略CMSScheduleRemarkEdenPenetration。
其中可以看到 CMS: abort preclean due to time 7.221:表示触发了preclean
案例七:设置CMS的preclean容量触发
本次实验,设置了XX:CMSScheduleRemarkEdenPenetration=35,只有2秒的时候,优先于-XX:CMSMaxAbortablePrecleanTime=5000设置的5秒触发了remark,可以观察
2.196: [CMS-concurrent-abortable-preclean-start]
4.216: [CMS-concurrent-abortable-preclean: 0.023/2.020 secs] [Times: user=0.02 sys=0.00, real=2.02 secs]
时间停顿有2秒钟。
附录
参考文章
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://szhnet.iteye.com/blog/1423894
http://book.51cto.com/art/201011/235590.htm
文章更新日志
2014-01-24
完善个别CMS参数的说明
作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:6301655@163.com
CMS-initial-mark
并发标记
CMS-concurrent-mark
CMS-concurrent-preclean
CMS-concurrent-abortable-preclean
重新标记
CMS-remark
并发清理
CMS-concurrent-sweep
重置线程
CMS-concurrent-reset
其中preclean该步用于重新扫描在concurrent mark阶段CMS Heap中被新创建的对象或从新生代晋升到旧生代对象的引用关系,以减少remark所需耗费的时间,这是Sun JDK 1.5后增加的一个优化步骤。
可选参数
-XX:CMSInitiatingOccupancyFraction=85(触发FULL GC的老年代使用百分比)
-XX:CMSFullGCsBeforeCompaction=5(多少次后进行内存压缩)
-XX:ParallelGCThreads=8(并发标记和清除时的线程数)
其他参数
-XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集
CMS触发参数与条件(与eden区有关系)
-XX:CMSScheduleRemarkEdenSizeThreshold=2M
-XX:CMSScheduleRemarkEdenPenetration=50
-XX:CMSMaxAbortablePrecleanTime=5000(单位为毫秒)
当eden space占用超过CMSScheduleRemarkEdenSizeThreshold时,执行此步,并且将一直并发的执行到eden space的使用率超过CMSScheduleRemarkEdenPenetration,之后触发remark动作,过CMSMaxAbortablePrecleanTime时间扔为达到要求,则直接触发CMS-remark
常用的优化配置示例
#!/bin/bash SERVER_HOME="/application/search/server" CONF_HOME="/application/search/server/conf" LOG_HOME="/data0/search/server" CURRENT_TIME=`date +%Y-%m-%d_%H:%M:%S` java -server -verbose:gc -Xms512m -Xmx512m -Xmn192m -XX:PermSize=32m -XX:MaxPermSize=32m -Xss256k -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=4 -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000 -XX:CMSFullGCsBeforeCompaction=5 -XX:CMSInitiatingOccupancyFraction=85 -XX:+UseParNewGC -Xloggc:${LOG_HOME}/logs/gc.${CURRENT_TIME}.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/logs/HeapDumpOnOutOfMemoryError.${CURRENT_TIME}.log -XX:+DisableExplicitGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -cp ${SERVER_HOME}/server.jar:${SERVER_HOME}/lib/* -DCONF_HOME=${CONF_HOME} -DLOG_HOME=${LOG_HOME} com.chinaso.search.Server >>${LOG_HOME}/logs/console.log 2>&1 &
案例一:空跑
package com.chinaso.phl; /** * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly * @author piaohailin * @date 2014-1-15 */ public class Server0 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { } } /* Heap par new generation total 9216K, used 507K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 6% used [0x00000000f9a00000, 0x00000000f9a7eee0, 0x00000000fa200000) from space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) to space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000) concurrent mark-sweep generation total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3033K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
空跑eclipse的时候,占用了507K的新生代空间,老生代无任何数据。持久代使用了3033K空间。其中默认值遵循了eden:survival=8:1的原则。
案例二:验证对象大小
package com.chinaso.phl; /** * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly * @author piaohailin * @date 2014-1-15 */ public class Server1 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(2); // System.out.println("minor gc"); // byte[] b4 = getM(2); } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* Heap par new generation total 9216K, used 6651K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 81% used [0x00000000f9a00000, 0x00000000fa07ef10, 0x00000000fa200000) from space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) to space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000) concurrent mark-sweep generation total 10240K, used 0K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3034K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
新生代使用的空间为6651K = 507 + 2048 * 3,所以新分配的3个2M对象,占用了6M的空间。但是没有发生GC,如果再分配一个2M对象,就会超出eden空间进行一次minor gc。
案例三:minor GC
package com.chinaso.phl; /** * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly * @author piaohailin * @date 2014-1-15 */ public class Server2 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(2); System.out.println("minor gc"); byte[] b4 = getM(2);//执行这一行的时候就会GC } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* minor gc 0.108: [GC 0.109: [ParNew: 6487K->173K(9216K), 0.0048546 secs] 6487K->6319K(19456K), 0.0049077 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] Heap par new generation total 9216K, used 2385K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 27% used [0x00000000f9a00000, 0x00000000f9c28fd8, 0x00000000fa200000) from space 1024K, 16% used [0x00000000fa300000, 0x00000000fa32b500, 0x00000000fa400000) to space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) concurrent mark-sweep generation total 10240K, used 6146K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3039K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
从内容来看,执行了一次新生代的垃圾回收操作。对象占用空间从6487K减少到173K,其中总新生代可用空间(1*eden + 1*survival)即9216K,耗时0.0048546 secs,整个堆内存的情况为闸弄空间从6487K降低到6319K,其中总可用堆大小为19456K。其中查看heap,可知道新生代已用2385K,老生代使用6146K,基本与之前分配的3个2M对象2048*3=6144相等,表明此3个对象进行minor GC后,进入了老年代。而新生代占用的空间2385中,基本与刚分配的第四个2M对象相等。下个实验,我们将触发major GC即:full gc
案例四:major GC
本案例开启参数-XX:+UseCMSInitiatingOccupancyOnly
package com.chinaso.phl; import java.util.concurrent.TimeUnit; /** * 案例四:major GC * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly * @author piaohailin * @date 2014-1-15 */ public class Server3 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(2); System.out.println("minor gc"); byte[] b4 = getM(2);//执行这一行的时候就会GC TimeUnit.SECONDS.sleep(2); byte[] b5 = getM(2); byte[] b6 = getM(2); System.out.println("promotion failed"); byte[] b7 = getM(2); TimeUnit.SECONDS.sleep(2); } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* minor gc 0.102: [GC 0.102: [ParNew: 6487K->176K(9216K), 0.0049663 secs] 6487K->6322K(19456K), 0.0050174 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] promotion failed 2.110: [GC 2.110: [ParNew: 6570K->6570K(9216K), 0.0000346 secs]2.110: [CMS: 6146K->8192K(10240K), 0.0134294 secs] 12716K->12448K(19456K), [CMS Perm : 3074K->3074K(21248K)], 0.0135341 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 2.124: [GC [1 CMS-initial-mark: 8192K(10240K)] 14496K(19456K), 0.0002687 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.125: [CMS-concurrent-mark-start] 2.128: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.128: [CMS-concurrent-preclean-start] 2.130: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 2.130: [CMS-concurrent-abortable-preclean-start] 2.130: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.131: [GC[YG occupancy: 6304 K (9216 K)]2.131: [Rescan (parallel) , 0.0001867 secs]2.131: [weak refs processing, 0.0000054 secs] [1 CMS-remark: 8192K(10240K)] 14496K(19456K), 0.0002429 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.131: [CMS-concurrent-sweep-start] 2.131: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.131: [CMS-concurrent-reset-start] 2.131: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.092: [GC [1 CMS-initial-mark: 8192K(10240K)] 14496K(19456K), 0.0002814 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.093: [CMS-concurrent-mark-start] 4.096: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.096: [CMS-concurrent-preclean-start] 4.096: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.096: [CMS-concurrent-abortable-preclean-start] 4.096: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.096: [GC[YG occupancy: 6304 K (9216 K)]4.096: [Rescan (parallel) , 0.0001894 secs]4.096: [weak refs processing, 0.0000050 secs] [1 CMS-remark: 8192K(10240K)] 14496K(19456K), 0.0002433 secs] [Times: user=0.00 sys=0.01, real=0.00 secs] 4.096: [CMS-concurrent-sweep-start] 4.096: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.096: [CMS-concurrent-reset-start] 4.097: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap par new generation total 9216K, used 6468K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 78% used [0x00000000f9a00000, 0x00000000fa051178, 0x00000000fa200000) from space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000) to space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) concurrent mark-sweep generation total 10240K, used 8192K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3082K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
案例五:major GC
本案例删除参数-XX:+UseCMSInitiatingOccupancyOnly
package com.chinaso.phl; import java.util.concurrent.TimeUnit; /** * 案例五:major GC * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps * @author piaohailin * @date 2014-1-15 */ public class Server4 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(2); System.out.println("minor gc"); byte[] b4 = getM(2);//执行这一行,minor GC TimeUnit.SECONDS.sleep(2); byte[] b5 = getM(2); byte[] b6 = getM(2); System.out.println("promotion failed"); byte[] b7 = getM(2);//执行这一行,分配担保失败 TimeUnit.SECONDS.sleep(2); } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* minor gc 0.106: [GC 0.106: [ParNew: 6487K->176K(9216K), 0.0050621 secs] 6487K->6322K(19456K), 0.0051125 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2.111: [GC [1 CMS-initial-mark: 6146K(10240K)] 8620K(19456K), 0.0003830 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.112: [CMS-concurrent-mark-start] promotion failed 2.115: [GC 2.115: [ParNew: 6570K->6570K(9216K), 0.0000308 secs]2.115: [CMS2.117: [CMS-concurrent-mark: 0.004/0.005 secs] [Times: user=0.00 sys=0.02, real=0.00 secs] (concurrent mode failure): 6146K->8192K(10240K), 0.0144718 secs] 12716K->12448K(19456K), [CMS Perm : 3074K->3074K(21248K)], 0.0145735 secs] [Times: user=0.00 sys=0.02, real=0.01 secs] 4.094: [GC [1 CMS-initial-mark: 8192K(10240K)] 14496K(19456K), 0.0003338 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.094: [CMS-concurrent-mark-start] 4.098: [CMS-concurrent-mark: 0.004/0.004 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 4.098: [CMS-concurrent-preclean-start] 4.100: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.100: [CMS-concurrent-abortable-preclean-start] 4.100: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.102: [GC[YG occupancy: 6304 K (9216 K)]4.103: [Rescan (parallel) , 0.0001871 secs]4.103: [weak refs processing, 0.0000054 secs] [1 CMS-remark: 8192K(10240K)] 14496K(19456K), 0.0002575 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.103: [CMS-concurrent-sweep-start] 4.103: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.103: [CMS-concurrent-reset-start] 4.103: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap par new generation total 9216K, used 6468K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 78% used [0x00000000f9a00000, 0x00000000fa051178, 0x00000000fa200000) from space 1024K, 0% used [0x00000000fa300000, 0x00000000fa300000, 0x00000000fa400000) to space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) concurrent mark-sweep generation total 10240K, used 8192K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3082K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
案例六:设置CMS的preclean超时触发
package com.chinaso.phl; import java.util.concurrent.TimeUnit; /** * 案例六:设置CMS的preclean超时触发 * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:CMSMaxAbortablePrecleanTime=5000 -XX:CMSScheduleRemarkEdenSizeThreshold=1M * @author piaohailin * @date 2014-1-15 */ public class Server5 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(3); System.out.println("minor gc"); byte[] b4 = getM(1); TimeUnit.SECONDS.sleep(8); } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* minor gc 0.199: [GC 0.199: [ParNew: 7511K->176K(9216K), 0.0057871 secs] 7511K->7346K(19456K), 0.0058452 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2.204: [GC [1 CMS-initial-mark: 7170K(10240K)] 8619K(19456K), 0.0004038 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.205: [CMS-concurrent-mark-start] 2.208: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 2.208: [CMS-concurrent-preclean-start] 2.209: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.209: [CMS-concurrent-abortable-preclean-start] CMS: abort preclean due to time 7.221: [CMS-concurrent-abortable-preclean: 0.059/5.012 secs] [Times: user=0.05 sys=0.00, real=5.01 secs] 7.221: [GC[YG occupancy: 1449 K (9216 K)]7.221: [Rescan (parallel) , 0.0001736 secs]7.221: [weak refs processing, 0.0000050 secs] [1 CMS-remark: 7170K(10240K)] 8619K(19456K), 0.0002317 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 7.221: [CMS-concurrent-sweep-start] 7.221: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 7.221: [CMS-concurrent-reset-start] 7.222: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap par new generation total 9216K, used 1613K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 17% used [0x00000000f9a00000, 0x00000000f9b675a8, 0x00000000fa200000) from space 1024K, 17% used [0x00000000fa300000, 0x00000000fa32c110, 0x00000000fa400000) to space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) concurrent mark-sweep generation total 10240K, used 7170K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3082K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
通过启动参数CMSScheduleRemarkEdenSizeThreshold我们可以知道,当eden区使用超过1M的时候,CMS垃圾收集触发以后,就会启动preclean(这个是JDK1.5的新特性),当并发执行到CMSScheduleRemarkEdenPenetration百分比值时候直接触发remark,如果设置了XX:CMSMaxAbortablePrecleanTime,则在CMSMaxAbortablePrecleanTime时间后,直接触发remark,忽略CMSScheduleRemarkEdenPenetration。
其中可以看到 CMS: abort preclean due to time 7.221:表示触发了preclean
案例七:设置CMS的preclean容量触发
package com.chinaso.phl; import java.util.concurrent.TimeUnit; /** * 案例七:设置CMS的preclean容量触发 * -Xms20m -Xmx20m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:CMSMaxAbortablePrecleanTime=5000 -XX:CMSScheduleRemarkEdenSizeThreshold=1M -XX:CMSScheduleRemarkEdenPenetration=35 * @author piaohailin * @date 2014-1-15 */ public class Server6 { /** * * @param args * @author piaohailin * @date 2014-1-15 */ public static void main(String[] args) throws Exception { byte[] b1 = getM(2); byte[] b2 = getM(2); byte[] b3 = getM(3); System.out.println("minor gc"); byte[] b4 = getM(1); TimeUnit.SECONDS.sleep(2); byte[] b5 = getM(1); TimeUnit.SECONDS.sleep(2); byte[] b6 = getM(1); TimeUnit.SECONDS.sleep(8); } public static byte[] getM(int m) { return new byte[1024 * 1024 * m]; } } /* minor gc 0.185: [GC 0.185: [ParNew: 7511K->176K(9216K), 0.0057790 secs] 7511K->7346K(19456K), 0.0058398 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 2.191: [GC [1 CMS-initial-mark: 7170K(10240K)] 8619K(19456K), 0.0004258 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.192: [CMS-concurrent-mark-start] 2.195: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.195: [CMS-concurrent-preclean-start] 2.196: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2.196: [CMS-concurrent-abortable-preclean-start] 4.216: [CMS-concurrent-abortable-preclean: 0.023/2.020 secs] [Times: user=0.02 sys=0.00, real=2.02 secs] 4.216: [GC[YG occupancy: 3497 K (9216 K)]4.216: [Rescan (parallel) , 0.0001836 secs]4.216: [weak refs processing, 0.0000058 secs] [1 CMS-remark: 7170K(10240K)] 10667K(19456K), 0.0002418 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.216: [CMS-concurrent-sweep-start] 4.216: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.216: [CMS-concurrent-reset-start] 4.217: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.266: [GC [1 CMS-initial-mark: 7170K(10240K)] 10667K(19456K), 0.0002891 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.266: [CMS-concurrent-mark-start] 4.269: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.269: [CMS-concurrent-preclean-start] 4.269: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.269: [CMS-concurrent-abortable-preclean-start] 4.270: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.270: [GC[YG occupancy: 3497 K (9216 K)]4.270: [Rescan (parallel) , 0.0001925 secs]4.270: [weak refs processing, 0.0000050 secs] [1 CMS-remark: 7170K(10240K)] 10667K(19456K), 0.0002479 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.270: [CMS-concurrent-sweep-start] 4.270: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 4.270: [CMS-concurrent-reset-start] 4.270: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.271: [GC [1 CMS-initial-mark: 7170K(10240K)] 10667K(19456K), 0.0003114 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.271: [CMS-concurrent-mark-start] 6.274: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.274: [CMS-concurrent-preclean-start] 6.274: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.274: [CMS-concurrent-abortable-preclean-start] 6.274: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.274: [GC[YG occupancy: 3497 K (9216 K)]6.274: [Rescan (parallel) , 0.0002117 secs]6.275: [weak refs processing, 0.0000042 secs] [1 CMS-remark: 7170K(10240K)] 10667K(19456K), 0.0002752 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.275: [CMS-concurrent-sweep-start] 6.275: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 6.275: [CMS-concurrent-reset-start] 6.275: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.275: [GC [1 CMS-initial-mark: 7170K(10240K)] 10667K(19456K), 0.0002918 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.276: [CMS-concurrent-mark-start] 8.279: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.279: [CMS-concurrent-preclean-start] 8.279: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.279: [CMS-concurrent-abortable-preclean-start] 8.279: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.279: [GC[YG occupancy: 3497 K (9216 K)]8.279: [Rescan (parallel) , 0.0001401 secs]8.279: [weak refs processing, 0.0000042 secs] [1 CMS-remark: 7170K(10240K)] 10667K(19456K), 0.0001936 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.279: [CMS-concurrent-sweep-start] 8.279: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 8.279: [CMS-concurrent-reset-start] 8.280: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.280: [GC [1 CMS-initial-mark: 7170K(10240K)] 10667K(19456K), 0.0003064 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.280: [CMS-concurrent-mark-start] 10.283: [CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.283: [CMS-concurrent-preclean-start] 10.283: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.283: [CMS-concurrent-abortable-preclean-start] 10.283: [CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.283: [GC[YG occupancy: 3497 K (9216 K)]10.283: [Rescan (parallel) , 0.0001428 secs]10.284: [weak refs processing, 0.0000042 secs] [1 CMS-remark: 7170K(10240K)] 10667K(19456K), 0.0001940 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.284: [CMS-concurrent-sweep-start] 10.284: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 10.284: [CMS-concurrent-reset-start] 10.284: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap par new generation total 9216K, used 3661K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000) eden space 8192K, 42% used [0x00000000f9a00000, 0x00000000f9d675c8, 0x00000000fa200000) from space 1024K, 17% used [0x00000000fa300000, 0x00000000fa32c110, 0x00000000fa400000) to space 1024K, 0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000) concurrent mark-sweep generation total 10240K, used 7170K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000) concurrent-mark-sweep perm gen total 21248K, used 3082K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000) */
本次实验,设置了XX:CMSScheduleRemarkEdenPenetration=35,只有2秒的时候,优先于-XX:CMSMaxAbortablePrecleanTime=5000设置的5秒触发了remark,可以观察
2.196: [CMS-concurrent-abortable-preclean-start]
4.216: [CMS-concurrent-abortable-preclean: 0.023/2.020 secs] [Times: user=0.02 sys=0.00, real=2.02 secs]
时间停顿有2秒钟。
附录
参考文章
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://szhnet.iteye.com/blog/1423894
http://book.51cto.com/art/201011/235590.htm
文章更新日志
2014-01-24
完善个别CMS参数的说明
作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:6301655@163.com
发表评论
-
java for 的几种用法
2014-12-02 09:59 1220J2SE 1.5提供了另一 ... -
finally不执行的陷阱
2014-05-16 09:23 1063写了个DEMO,说明下finally在System.exit( ... -
URI和URL的区别
2014-03-26 10:38 1249String HttpServletRequest.getRe ... -
Iterator与ListIterator区别
2014-03-23 22:21 1086Iterator:只能正向遍历集合,适用于获取移除元素。Lis ... -
快速失败特性
2014-03-23 22:20 1076从高级别层次来说快速失败是一个系统或软件对于其故障做出 ... -
java继承静态方法复写
2014-03-12 09:28 4371最近和人交流,遇到了这样一个问题,就是继承当中,静态方法复写的 ... -
关于return和finally
2014-03-11 10:19 2793本来return和finally也不是个事。之前看虚拟机运行原 ... -
JVM内存分析系列(十三)内存实践理解
2014-01-22 10:09 3090java堆 包括 新生代:eden,survival(from ... -
JVM内存分析系列(十二)G1垃圾收集器的使用
2014-01-16 17:10 11473Garbage First(G1)致力于在多CPU和大内存服务 ... -
eclipse内存优化
2014-02-26 14:00 1462修改eclipse的配置文件,添加或者修改参数如下,其中XX: ... -
远程调试(二)JVM
2014-01-10 11:43 1704从J2SE 1.4.2开始,就已经提出并实现了JavaTM P ... -
JVM内存分析系列(九)JDK监控和故障处理工具
2014-01-08 18:33 1988jps JVM Process Status Tool,显示指 ... -
guava--google----用来替代commons的jar包
2014-01-06 18:21 16749Guava 是一个 Google ... -
JVM内存分析系列(八)垃圾收集器介绍及性能指标
2013-12-30 13:33 1994内存回收的具体实现。 停顿时间越短就越适合需要 ... -
JVM内存分析系列(七)垃圾收集算法
2013-12-30 12:58 1080内存回收的方法论 标记-清除算法 Mark-Sweep 分为 ... -
JVM内存分析系列(六)对象存活判断
2013-12-26 11:10 1095对象存活常用2种算法 引用计数算法 给对象中添加一个 ... -
JVM内存分析系列(五)浅谈finalize()方法
2013-12-28 18:47 1424根搜索算法中不可达对象在回收之前,要进行二次标记。 第 ... -
JVM内存分析系列(四)对象4种引用
2013-12-25 20:07 1283强引用:只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象 ... -
JVM内存分析系列(三)JVM内存模型初步
2013-12-25 17:09 1129根据《Java虚拟机规范(第二版)》的规定,结构如下 1 ... -
JVM内存分析系列(二)内存溢出的类型分析
2013-12-24 23:54 1793启动参数 -server -verbose:gc -Xms10 ...
相关推荐
jvm性能调优-垃圾收集器parnew&CMS底层三色标记算-performance-gc-parnew-cms
第41讲 垃圾收集器-cms收集器详解 00:14:58 第42讲 最牛的垃圾收集器-g1收集器详解 00:18:04 第43讲 内存分配-概述 00:04:23 第44讲 内存分配-Eden区域 00:22:51 第45讲 内存分配-大对象直接进老年代...
1. GC事件开始的时间 2. GC开始相对于JVM启动时间时间差 4. 收集原因 5. 使用收集器的名称 6. Young代回收前后的已使用空间 8. 清除时
1.垃圾收集器 1. -XX:+UseConcMarkSweepGC:启用cms 2. -XX:ConcGCThreads:并发的GC线程数 3. -XX:+U
保持GC低开销的窍门有哪些? 随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器。...CMS(“Concurrent Mark-Sweep”)收集器与 parallel GC 相比,它将回收过
文章目录内存回收引用计数法可达性分析浅谈引用强引用软引用弱引用虚引用方法区GC 算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark-Compact)GC算法综合用年轻代老年代永久代枚举根节点安全...
第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法 3.3.2 ...
• 熟悉JVM内存区域,常用引用类型,垃圾回收机制、算法以及常见的GC垃圾收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1) • 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与...
CMS 收集器与 G1 收集器的特点。8. Minor GC 与 Full GC 分别在什么时候发生?9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat10. 类加载的几个过程:11.JVM 内存分哪几个区,每个区的作用是什么?
2.4.3. 并发收集器(响应时间优先) 11 2.4.4. 其它垃圾回收参数 11 2.5. 辅助信息参数设置 12 2.6. 关于参数名称等 13 3. JVM服务参数调优实战 14 3.1. 大型网站服务器案例 14 3.2. 内部集成构建服务器案例 15 4. ...
仅适用于以下 JVM 参数-verbosegc -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:logs/gc.log和 CMS 收集器。 使用 JDK 6 测试。 #总结报告示例 Total time: 20.51 min Young size ...
GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本变化 1.5 1.6 1.7 1.8 1.9 IO/NIO IO类型 同步阻塞 同步非...
JVM 内存区域 ..................................................................................................................................... 21 2.2.1. 程序计数器(线程私有) ........................
2.2. JVM 内存区域 ..................................................................................................................................... 21 2.2.1. 程序计数器(线程私有) ....................