JVM学习-java垃圾回收-GC日志

Posted 智公博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习-java垃圾回收-GC日志相关的知识,希望对你有一定的参考价值。

GC 日志是一个分析Java内存回收有用的工具,它能准确的记录每一次GC的执行时间和结果

GC or Full GC

关于Full GC,容易有误解,以为是堆全部年代内存GC;其实”Full” 并不是用来区分新生代GC和老年代GC,只是表示这次GC发生了”Stop The World(STW)”

-XX:+PrintGC

这个参数开启简单的GC日志模式,为每次的GC或Full GC打印一条信息,如:

[GC 1331K->568K(124416K), 0.0009585 secs]
[Full GC 568K->473K(124416K), 0.0072450 secs]

开头为GC类型(GC or Full Gc),然后是GC前和GC后使用堆空间大小,然后括号中是堆大小,最后是GC执行时间(秒)

简单模式的GC日志是与收集器无关的,也没有提供其他信息;

-XX:+PrintGCDetails

这个参数打印详细GC日志,在这种模式下,日志格式与收集器相关,比如以下Parallel Scavenge + Serial Old 收集器组合:

[GC [PSYoungGen: 32051K->600K(38400K)] 32051K->10840K(124416K), 0.0076132 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC [PSYoungGen: 600K->0K(38400K)] [ParOldGen: 10240K->10712K(86016K)] 10840K->10712K(124416K) [PSPermGen: 2541K->2540K(21504K)], 0.0409766 secs] [Times: user=0.05 sys=0.00, real=0.04 secs]

格式和简单模式差不多,但是更详细:
开头是GC类型,然后是不同年代内存区域GC的信息,PSYoungGen 表示新生代,ParOldGen 表示老年代,PSPerGen 表示永久区
最后是详细的时间信息,user 是用户态消耗的CPU时间,sys 是内核态消耗的CPU时间,而real 是操作从开始到结束的墙中时间(包括各种非计算的等待耗时,如I/O、线程阻塞),当系统有多CPU(多核)情况下,多线程会叠加这些CPU时间,所有user 或 sys 时间超过real是正常的;

对于不同的垃圾收集器,打印出来的日志会有不同,主要区别在对于新生代、老年代、永久代内存的命名上,如上面的是使用 Parallel Scavenge + Serial Old 垃圾收集器:
- 其中新生代:PSYoungGen
- 老年代:ParOldGen
- 永久代:PSPermGen

对于Serial + Serial Old,格式比如:

[GC[DefNew: 6979K->472K(9216K), 0.0040385 secs] 6979K->6616K(19456K), 0.0040830 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
[Full GC[Tenured: 0K->1496K(86400K), 0.0054293 secs] 3764K->1496K(125312K), [Perm : 2541K->2541K(21248K)], 0.0054809 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
  • 新生代:DefNew(def new generation)
  • 老年代:Tenured
  • 永久代:Perm

对于Serial + ParNew
- 其中新生代:ParNew(par new generation)
- 老年代:Tenured
- 永久代:Perm

对于 ParNew + CMS + Serial Old
- 新生代:DefNew(def new generation)
- 老年代:CMS
- 永久代:CMS Perm

对于 Parallel Scavenge + Parallel Old
- 新生代:PSYoungGen
- 老年代:ParOldGen
- 永久代:PSPermGen

Java 虚拟机中,垃圾收集器一直都在不断的优化提高,对于不同收集器的GC日志格式可能会有一点变化,但是总体格式都是不会变的

以上是关于JVM学习-java垃圾回收-GC日志的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机原理垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )

JVM学习笔记GC——JAVA预言的垃圾回收

JVM学习笔记GC——JAVA语言的垃圾回收

GC垃圾回收机制

GC垃圾回收机制

JVM之GC日志分析与对象内存分配回收策略