33.125:[GC [DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K),0.0031680 secs]
100.667:[FullGC [Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K),[Perm:2999K->2999K(21248K)],0.0150007 secs][Times:user=0.01 sys=0.00,real=0.02 secs]
最前面的数字“33.125:”和“100.667”代表了GC发生的时间,这个数字的含义是从Java虚拟机启动以来经过的秒数
GC日志开头的“[GC” "[FullGC"说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的,如果有“Full”,说明这次GC是发生了stop-the-world的。
接下来“[DefNew”、"[Tenured" “[Perm”标识GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,例如上面样例所使用的Serial收集器中的新生代名为“Default New Generation”,所以显示为“DefNew”。如果是ParNew收集器,新生代名称就会变为“[ParNew” 意为“Parallel New Generation”。如果采用Parallel Scavenge收集器,那它配套的新生代就叫做“PSYoungGen”,老年代和永久代同理,名称也是由收集器决定的。
后面方括号内部的“3324K ->152K(3712K)”含义是“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”,而在方括号外部的"3324K ->152K(11904K)",含义是“GC前Java堆已使用容量->GC后Java堆已使用容量(java堆总容量)”
再往后,“0.0025925 secs”表示该内存区域GC所占用的时间,单位是秒。
对象的内存分配,往大方向讲,就是在堆上分配
1、对象优先在Eden分配
大多数情况下,对象在新生代Eden区分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。
2、大对象直接进入老年代
所谓的大对象,是指需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组
3、长期存活的对象将进入老年代