jvm GC日志详解
首先我们来介绍什么事GC:
Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。
在Java语言出现之前,就有GC机制的存在,如Lisp语言),Java GC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情。然而,如果我们从事较大型的应用软件开发,曾经出现过内存优化的需求,就必定要研究Java GC机制。
我们如何获取GC日志:
一种是使用命令动态查看,
17997 就是所谓的pid ,应用进程的id。
也可以设置间隔固定时间来打印:
每隔2000ms输出1262的gc情况,一共输出20次。
一种是在容器中设置相关参数打印GC日志。
JVM的GC日志的参数设置如下:
-----XX:+PrintGC
输出GC日志
------XX:+PrintGCDetails
输出GC的详细日志
------XX:+PrintGCTimeStamps
输出GC的时间戳
------XX:+PrintGCDateStamps
输出GC的时间戳
------XX:+PrintHeapAtGC
在进行GC的前后打印出堆的信息
------Xloggc:../logs/gc.log
日志文件的输出路径
接下来我们来分析gc日志Young GC回收日志:
2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
Full GC回收日志:
10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数
通过两张图来解析gc日志构成:
Young GC日志:
Full GC日志: