基本参数了解
堆大小设置
-Xms20m -Xmx20m
New Generation(新生代)内存大小设置
Xmn256m
新生代和老年代内存的比值来设置新生代大小
-XX:NewRatio=3
设置新生代(包括Eden和两个Survivor区)与老年代的比值(除去持久代)。设置为3,则新生代与老年代所占比值为1:3,新生代占整个堆栈的1/4
Survivor内存大小设置
-XX:SurvivorRatio=8
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的1/10
Old Generation(老年的)的内存大小设置
堆内存减去新生代内存
如上面设置的参数举例如下:
老年代初始内存为:512M-256M=256M
老年代最大内存为:1G-256M=768M
详解
测试代码,运行参数设置为:-Xms20m -Xmx20m -XX:+PrintGC -XX:+PrintGCDetails -Xloggc:gc.log
public class GcTest {
static int size = 4 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException {
byte[] a1 = new byte[size];
TimeUnit.SECONDS.sleep(1);
byte[] a2 = new byte[size];
TimeUnit.SECONDS.sleep(1);
byte[] a3 = new byte[size];
TimeUnit.SECONDS.sleep(1);
byte[] a4 = new byte[size];
TimeUnit.SECONDS.sleep(1);
System.out.println("ok");
}
}
- YoungGC日志
2.186: [GC (Allocation Failure) [PSYoungGen: 990K->488K(6144K)] 11230K->10808K(19968K), 0.0013081 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] - Full GC
3.191: [Full GC (Ergonomics) [PSYoungGen: 5608K->5531K(6144K)] [ParOldGen: 10372K->10342K(13824K)] 15980K->15874K(19968K), [Metaspace: 2589K->2589K(1056768K)], 0.0042786 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
-
最前面的数字
2.186:
和’3.191:'代表了GC发生的时间,这个数字的含义是从aⅤa虚拟机启动以来经过的秒数。 -
GC日志开头的
[GC
和[Full GC
说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果是Full GC
,说明这次GC是发生了Stop-The-World的,
第二条收集器的日志也会出现[Full GC
(这一般是因为出现了分配担保失败之类的问题,所以才导致STW)。如果是调用 System.gc()方法所触发的收集,那么
在这里将显示[ Full gc( System)
。 -
接下来的
[PSYoungGen
、[ParOldGen
、[Metaspace
表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,如果是 ParNew收集器,新生代名称
就会变为[ ParNew
,意为Parallel New Generation
。如果采用 Parallel Scavenge收集器,那它配套的新生代称为PSYoungGen
,老年代和永久代同理,名称也是由收集器决定的。 -
后面方括号内部的
990K->488K(6144K)
含义是GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)
。而在方括号之外的11230K->10808K(19968K)
表示GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)
-
再往后,
0.0013081 secs
表示该内存区域GC所占用的时间,单位是秒。后面是更具体的时间数据,[Times: user=0.00 sys=0.00, real=0.00 secs]
,这里面的
user、sys和real与 Linux的time命令所输出的时间含义一致
- user:代表用户态消耗的CPU时间
- sys:内核态消耗的CPU事件
- real:操作从开始到结束所经过的墙钟时间( Wall Clock Time)。