Java垃圾回收 CMS垃圾回收算法
- 2018-08-05 22:53:00
- admin
- 原创 2059
一、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;