当前位置首页 > 百科> 正文

CMS收集器

2019-09-01 13:59:04 百科

CMS收集器

CMS收集器是JAVA虚拟机中垃圾收集器的一种。它运行在JAVA虚拟机的老年代中,是基于“标记-清除”算法实现的。

基本介绍

  • 中文名:CMS收集器
  • 隶属:JAVA虚拟机中垃圾收集器
  • 运行:JAVA虚拟机的老年代
  • 原理:标记-清除

示例代码

package com.gc;
import java.util.ArrayList;
import java.util.List;
/**
* 简单的JAVA虚拟机记忆体回收,cms收集器的使用
* 参数:-Xms30m -Xmx60m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails
* @author 范芳铭
*/
public class EasyCMS {
public byte[] placeHolder = new byte[64 * 1024]; //占位符
public static void main(String[] args) throws Exception{
outOfMemoryByExpansionSize();
}
private static void outOfMemoryByExpansionSize() throws Exception{
List<EasyCMS> list = new ArrayList<EasyCMS>();
while(true){
EasyCMS serial = new EasyCMS();
list.add(serial);
Thread.sleep(10);//停顿10毫秒
}
}
}

参数

参数:-Xms30m -Xmx60m -Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails
-Xms30m JVM最小30M
-Xmx100m JVM最大100M
-Xmn10m 新生代固定10M
-XX:+ UseConcMarkSweepGC对应parNew + cms 收集器
-XX:+PrintGCDetails 列印详细GC

运行结果

[GC [ParNew: 9110K->972K(9216K), 0.0056278 secs] 48708K->48702K(60416K), 0.0056664 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC [1 CMS-initial-mark: 47730K(51200K)] 48766K(60416K), 0.0000829 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC[YG occupancy: 1036 K (9216 K)][Rescan (parallel) , 0.0001092 secs][weak refs processing, 0.0000140 secs] [1 CMS-remark: 47730K(51200K)] 48766K(60416K), 0.0001609 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [ParNew: 9112K->9112K(9216K), 0.0000185 secs][CMS: 47728K->51175K(51200K), 0.0184446 secs] 56840K->56814K(60416K), [CMS Perm : 2086K->2085K(12288K)], 0.0185255 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
[GC [1 CMS-initial-mark: 51175K(51200K)] 56878K(60416K), 0.0000866 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC[YG occupancy: 5703 K (9216 K)][Rescan (parallel) , 0.0001108 secs][weak refs processing, 0.0000041 secs] [1 CMS-remark: 51175K(51200K)] 56878K(60416K), 0.0001523 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [ParNew: 9103K->9103K(9216K), 0.0000140 secs][CMS: 51172K->51172K(51200K), 0.0135952 secs] 60275K->60269K(60416K), [CMS Perm : 2085K->2084K(12288K)], 0.0136662 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC [CMS: 51172K->51172K(51200K), 0.0041339 secs] 60269K->60269K(60416K), [CMS Perm : 2084K->2084K(12288K)], 0.0041729 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
[GC [1 CMS-initial-mark: 51172K(51200K)] 60269K(60416K), 0.0000883 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

运作步骤

CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说要更複杂一些,整个过程分为6个步骤,包括:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
并发预清理(CMS-concurrent-preclean)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
并发重置(CMS-concurrent-reset)
其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程式继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。其他动作都是并发的。
对应具体的运行结果:
[GC [ParNew: 9110K->972K(9216K), 0.0056278 secs] 48708K->48702K(60416K), 0.0056664 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
【1.初始标记】
[GC [1 CMS-initial-mark: 47730K(51200K)] 48766K(60416K), 0.0000829 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【2.并发标记】
[CMS-concurrent-mark: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【3.并发预清理】
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【4.重新标记】
[GC[YG occupancy: 1036 K (9216 K)][Rescan (parallel) , 0.0001092 secs][weak refs processing, 0.0000140 secs] [1 CMS-remark: 47730K(51200K)] 48766K(60416K), 0.0001609 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【5.并发清除】
[CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
【6.并发重置】
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net