Java垃圾回收 CMS垃圾回收算法

2018-08-05 22:53:00
admin
原创 2059
摘要:Java垃圾回收 CMS垃圾回收算法

一、Java垃圾回收

1、Committed内存,JVM向操作系统申请的内存;

2、Used内存,JVM分配给对象使用的内存,Committed>=Used;

3、Committed内存不足时,JVM向操作系统申请,如果超过配置的最大限制则抛出OutOfMemoryError;

4、SerialGC是串行收集器,ParNewGC是并行收集器,ParallelGC是并行收集器,ParallelGC特点是可以控制吞吐量;

5、windows默认使用串行收集器SerialGC,linux默认使用并行收集器ParallelGC,后台系统推荐使用CMS收集器

6、JDK9之后G1成为默认的垃圾回收算法,将堆划分为更多区域,每次只回收部分区域内存,所以停顿时间比CMS更少;

7、JDK15之后ZGC成为正式的垃圾回收算法,支持TB级堆内存,停顿时间保证在10毫秒以下,吞吐量比CMS稍微低一点;

8、内存使用查询代码GCUtils.java


Serial收集器,java -server -XX:+UseSerialGC gc.GCUtils

Copy: gc count 0, gc time 0.
[Eden Space, Survivor Space]
MarkSweepCompact: gc count 0, gc time 0.
[Eden Space, Survivor Space, Tenured Gen, Perm Gen]


ParNew收集器,java -server -XX:+UseParNewGC gc.GCUtils

ParNew: gc count 0, gc time 0.
[Par Eden Space, Par Survivor Space]
MarkSweepCompact: gc count 0, gc time 0.
[Par Eden Space, Par Survivor Space, Tenured Gen, Perm Gen]


Parallel收集器,java -server -XX:+UseParallelGC gc.GCUtils

PS Scavenge: gc count 0, gc time 0.
[PS Eden Space, PS Survivor Space]
PS MarkSweep: gc count 0, gc time 0.
[PS Eden Space, PS Survivor Space, PS Old Gen, PS Perm Gen]


CMS收集器,java -server -XX:+UseConcMarkSweepGC gc.GCUtils

ParNew: gc count 0, gc time 0.
[Par Eden Space, Par Survivor Space]
ConcurrentMarkSweep: gc count 0, gc time 0.
[Par Eden Space, Par Survivor Space, CMS Old Gen, CMS Perm Gen]


CMS垃圾回收过程:

1、初始标记(CMS-initial-mark),SWT,扫描根对象直接关联的对象,单线程扫描;
2、并发标记(CMS-concurrent-mark),应用程序同时工作,通过直达对象扫描全部的对象,消耗时间最长;
3、重新标记(CMS-remark),STW,修正并发标记时由于应用程序运行产生的对象修改,多线程扫描;
4、并发清除(CMS-concurrent-sweep),清除未被引用的对象;
5、并发重置(CMS-concurrent-reset),等待下次垃圾回收触发;


CMS垃圾回收分析:

1、CMS是并发标记清除,优点是并发收集和低停顿,缺点是会产生大量内存碎片,并发阶段会降低吞吐量

2、CMS期间应用程序申请不到内存,会输出Concurrent Mode Failure,然后进行一次Full GC;

发表评论
评论通过审核之后才会显示。