在eclipse的窗口--首选项--java--已安装的jre--jre定义中缺省vm参数加上 -XX:+PrintGCDetails -Xloggc:d:\gc.log
package test;
public class GetCircleDB {}
d:/gc.log
0.077: [GC 0.077: [DefNew: 1364K->437K(4928K), 0.0017301 secs]
0.079: [Tenured: 8704K->949K(10944K), 0.1680245 secs] 9556K->949K(15872K),
[Perm : 141K->141K(12288K)], 0.1698671 secs] [Times: user=0.00 sys=0.00, real=0.17 secs]
0.249: [Full GC (System) 0.249: [Tenured: 9141K->9142K(10944K), 0.0032902 secs] 9320K->9142K(15936K),
[Perm : 141K->141K(12288K)], 0.0033866 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 6912K, used 122K [0x22cb0000, 0x23430000, 0x28200000)
eden space 6144K, 2% used [0x22cb0000, 0x22ccebf0, 0x232b0000)
from space 768K, 0% used [0x232b0000, 0x232b0000, 0x23370000)
to space 768K, 0% used [0x23370000, 0x23370000, 0x23430000)
tenured generation total 15240K, used 9142K [0x28200000, 0x290e2000, 0x32cb0000)
the space 15240K, 59% used [0x28200000, 0x28aed808, 0x28aeda00, 0x290e2000)
compacting perm gen total 12288K, used 141K [0x32cb0000, 0x338b0000, 0x36cb0000)
the space 12288K, 1% used [0x32cb0000, 0x32cd37a0, 0x32cd3800, 0x338b0000)
ro space 10240K, 45% used [0x36cb0000, 0x37137290, 0x37137400, 0x376b0000)
rw space 12288K, 54% used [0x376b0000, 0x37d3ace8, 0x37d3ae00, 0x382b0000)
1. 0.077表示GC发生的时间,从JVM启动的时候开始算,单位是秒。
2. [Tenured: 8704K->949K(10944K), 0.1680245 secs] 9556K->949K(15872K), 8704K->949K(10944K)表示GC前该内存区域已使用容量-> GC后该内存区域已使用容量 (该内存区域总容量),9556K->949K(15872K)表示GC前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆总容量)。
3. GC和Full GC只是表示这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果有Full,说明这次GC是发生了Stop-The-World。
4. [DefNew]、[Tenured]、[Perm]表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,例如像上面的收集器中的新生代名为[Default New Generation],所以显示的是[DefNew]。如果是ParNew收集器,新生代名称就会变为[ParNew],意为[Parallel New Generation]。如果采用Parallel Scavenge收集器,那它配套的新生代称为[PSYoungGen],老年代和永久代同理,名称也是由收集器决定的。
DefNew(年轻代)
年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空 的。
Tenured(年老代)
年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。
Perm(持久代)
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=