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日志:

  一种是使用命令动态查看,

jvm GC日志详解

17997 就是所谓的pid ,应用进程的id。

也可以设置间隔固定时间来打印:

jvm GC日志详解

每隔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日志:

jvm GC日志详解

Full GC日志:

jvm GC日志详解

jvm

相关推荐