使用jstat监控gc常用命令为:
jstat -gc PID interval
运行命令行:jstat -gc 8937 5000(监控进程ID为8937的GC,每5秒执行一次),运行结果如下所示:
首先对每一列数据的具体含义进行说明:
S0C |
新生代一区总内存 |
S1C |
新生代二区总内存 |
S0U |
新生代一区已使用内存 |
S1U |
新生代二区已使用内存 |
EC |
新生代伊甸区总内存 |
EU |
新生代伊甸区已使用内存 |
OC |
老年区总内存 |
OU |
老年区已使用内存 |
MC |
元数据区总内存(jdk1.8已经废除持久区改为元数据区) |
MU |
元数据区已使用内存 |
CCSC |
压缩类空间总内存 |
CCSU |
压缩类空间已使用内存 |
YGC |
新生代垃圾回收总次数 |
YGCT |
新生代垃圾回收总耗费时间 |
FGC |
老年代垃圾回收总次数 |
FGCT |
老年代垃圾回收总耗费时间 |
GCT |
所有垃圾回收所耗费的时间(GCT=YGCT+FGCT) |
了解了每一列数据的具体含义,继续观察上图数据的变化,因为所有的对象创建之初都会首先在新生代伊甸区申请内存,可以看到刚开始的时候EU=84425.4,随着时间的推移EU数据逐渐增大,当EU增加到128418.1,这时伊甸区的剩余内存=EC-EU=7773.9,这时如果新申请的内存大于剩余内存,就会触发GC,可以从图中看到以下几个数据变化:
1,YGC从295增加到296,年轻代GC次数增加了一次。
2,EU从128418.1变为12989.0,释放了无用的对象所占用的内存,将存活的对象移到S0区,为新创建的对象腾出空间。
3,S1U从481.1变为0,S0U从0变为463.9,此时S1为From区,S2为To区(From区与To区是相对的),因为触发GC所以S1区中的无用对象所占用的内存被释放,将S1中存活的对象移到S0,所以S0U是Eden区和S1区中经过GC后存活对象所占用的内存情况。