一、Java垃圾回收
基本概念:
1 Committed内存,jvm向操作系统申请的内存。
2 Used内存,jvm分配给对象使用的内存。
3 所以Committed >= Used。
4 当Committed不足时,jvm向系统申请,如果超过jvm配置的最大限制则抛出OutOfMemoryError异常。
jvm内存状态查询代码:GCUtils.java
不同垃圾回收算法对应的jvm内存状态如下:
Serial收集器,java -server -XX:+UseSerialGC gc.GCUtils,windows默认是串行:
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是串行的多线程版本:
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,linux默认是并行:
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(并发标记清除)垃圾回收特点:
优点:并发收集、低停顿
缺点:产生大量内存碎片、并发阶段会降低吞吐量
CMS垃圾回收过程:
1 初始标记(CMS-initial-mark),SWT(Stop The World),只扫描root对象直接关联的对象,单线程扫描。
2 并发标记(CMS-concurrent-mark),与应用程序一起工作,通过直达对象扫描全部的对象,消耗时间最长。
3 重新标记(CMS-remark),STW,修正并发标记时由于应用程序还在并发运行产生的对象修改,多线程扫描。
4 并发清除(CMS-concurrent-sweep)
5 并发重置状态等待下次CMS的触发(CMS-concurrent-reset)
关于Concurrent Mode Failure:
CMS期间应用程序申请不到内存,会输出Concurrent Mode Failure,然后进行一次Full GC。
Copy:复制回收算法,浪费一半内存,但回收效率高。
ParNew:Copy的多线程版本。
Parallel收集器:算法同ParNew,但可以动态调整参数提供更大吞吐量。
MarkSweepCompact:结合标记清除和复制算法的优点。