Demo:
package com.su.mybatis.oracle.controller;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<byte[]> list =new LinkedList<>();
for(int i = 0; i<12; i++) {//触发一次Minor GC
list.add(new byte[1024 * 1024]);
}
System.gc();//触发 Full GC
}
}
初始设置:
-Xmx40M -Xms40M -Xmn10M -XX:+PrintGCDetails
未配置(默认情况)输出结果:
[GC[DefNew: 7880K->426K(9216K), 0.0066092 secs] 7880K->7594K(39936K), 0.0066656 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC[Tenured: 7168K->12714K(30720K), 0.0071252 secs] 12967K->12714K(39936K), [Perm : 154K->154K(12288K)], 0.0071673 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
-XX:+UseSerialGC:使用Serial+Serial Old进行垃圾回收;
输出结果:
[GC[DefNew: 7880K->426K(9216K), 0.0068026 secs] 7880K->7594K(39936K), 0.0068600 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC[Tenured: 7168K->12714K(30720K), 0.0065880 secs] 12967K->12714K(39936K), [Perm : 154K->154K(12288K)], 0.0066274 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
对比默认情况,说明单线程回收器为默认开启。
-XX:+UseParNewGC: 使用ParNew+Serial Old进行垃圾回收;
输出结果:
[GC[ParNew: 8004K->517K(9216K), 0.0037568 secs] 8004K->7685K(39936K), 0.0038107 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC[Tenured: 7168K->12792K(30720K), 0.0068715 secs] 13224K->12792K(39936K), [Perm : 1640K->1640K(12288K)], 0.0069113 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
-XX:+UseParallelGC:使用Parallel Scavenge+Serial Old进行垃圾回收;
输出结果:
[GC [PSYoungGen: 6913K->1272K(8960K)] 6913K->6668K(39680K), 0.0044390 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 7808K->1272K(8960K)] 13205K->12820K(39680K), 0.0032042 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen: 1272K->0K(8960K)] [ParOldGen: 11548K->12792K(30720K)] 12820K->12792K(39680K) [PSPermGen: 1640K->1639K(12288K)], 0.0104641 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
-XX:+UseParallelOldGC:使用Parallel Scavenge + Parallel Old进行垃圾回收;
[GC [PSYoungGen: 6913K->1272K(8960K)] 6913K->6684K(39680K), 0.0042283 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen: 7808K->1272K(8960K)] 13221K->12832K(39680K), 0.0069219 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC [PSYoungGen: 1272K->0K(8960K)] [ParOldGen: 11560K->12792K(30720K)] 12832K->12792K(39680K) [PSPermGen: 1640K->1639K(12288K)], 0.0104744 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
-XX:+UseConcMarkSweepGC:使用CMS进行垃圾回收;
[GC[ParNew: 8004K->520K(9216K), 0.0039692 secs] 8004K->7691K(39936K), 0.0040423 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC[CMS: 7170K->12792K(30720K), 0.0106636 secs] 13229K->12792K(39936K), [CMS Perm : 1640K->1639K(12288K)], 0.0107201 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
-XX:ParallelCMSThreads:配置CMS垃圾回收线程数;
-XX:CMSFullGCsBeforeCompaction(=N):CMS并发GC执行过后,出现N次full GC会做整理(CMS是标记清除算法)。默认是0,即默认情况下,CMS GC后内存不足,需要full GC的时就会进行整理。
如果有写的不对的地方,请大家多多批评指正,非常感谢!