Java虚拟机GC日志分析
本文研究的主要是java虚拟机中gc日志的理解问题,具体如下。
一、日志分析
理解gc日志是处理java虚拟机内存问题的基本技能。
通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略。
1、编写java代码
public class referencecountinggc { public object instance = null; private static final int one_mb = 1024 * 1024; private byte[] bigsize = new byte[2 * one_mb]; public static void main(string[] args) { testgc(); } public static void testgc() { referencecountinggc obja = new referencecountinggc(); referencecountinggc objb = new referencecountinggc(); obja.instance = objb; objb.instance = obja; obja = null; objb = null; system.gc(); } }
2、编译java文件
javac referencecountinggc.java
3、执行class文件
java -xx:+printgcdatestamps -xx:+printgcdetails referencecountinggc
对应的参数列表
-xx:+printgc 输出gc日志
-xx:+printgcdetails 输出gc的详细日志
-xx:+printgctimestamps 输出gc的时间戳(以基准时间的形式)
-xx:+printgcdatestamps 输出gc的时间戳(以日期的形式,如 2013-05-04t21:53:59.234+0800)
-xx:+printheapatgc 在进行gc的前后打印出堆的信息
-xloggc:../logs/gc.log 日志文件的输出路径
结果输出:
2016-03-20t14:34:55.118-0800: [gc [psyounggen: 6123k->400k(38912k)] 6123k->400k(125952k), 0.0012070 secs] [times: user=0.00 sys=0.00, real=0.00 secs]
2016-03-20t14:34:55.119-0800: [full gc [psyounggen: 400k->0k(38912k)] [paroldgen: 0k->282k(87040k)] 400k->282k(125952k) [pspermgen: 2622k->2621k(21504k)], 0.0084640 secs] [times: user=0.01 sys=0.00, real=0.01 secs]
heap
psyounggen total 38912k, used 1013k [0x00000007d5500000, 0x00000007d8000000, 0x0000000800000000)
eden space 33792k, 3% used [0x00000007d5500000,0x00000007d55fd7d0,0x00000007d7600000)
from space 5120k, 0% used [0x00000007d7600000,0x00000007d7600000,0x00000007d7b00000)
to space 5120k, 0% used [0x00000007d7b00000,0x00000007d7b00000,0x00000007d8000000)
paroldgen total 87040k, used 282k [0x0000000780000000, 0x0000000785500000, 0x00000007d5500000)
object space 87040k, 0% used [0x0000000780000000,0x0000000780046bf8,0x0000000785500000)
pspermgen total 21504k, used 2628k [0x000000077ae00000, 0x000000077c300000, 0x0000000780000000)
object space 21504k, 12% used [0x000000077ae00000,0x000000077b091380,0x000000077c300000)
psyounggen表示新生代,这个名称由收集器决定,这里的收集器是parallel scavenge。老年代为paroldgen,永久代为pspermgen
- 如果收集器为parnew收集器,新生代为parnew,parallel new generation
- 如果收集器是serial收集器,新生代为defnew,default new generation
可以看到上面有两种gc类型:gc和full gc,有full表示这次gc是发生了stop-the-world的。
新生代gc(minor gc):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以minor gc非常频繁,一般回收速度非常快。
老年代gc(major gc/full gc):指发生在老年代的gc,出现了major gc,经常会伴随至少一次的minor gc,major gc的速度一般会比minor gc慢10倍以上。
[gc [psyounggen: 6123k->400k(38912k)] 6123k->400k(125952k), 0.0012070 secs] [times: user=0.00 sys=0.00, real=0.00 secs]
上面方括号内部的6123k->400k(38912k),表示gc前该内存区域已使用容量->gc后该内存区域已使用容量,后面圆括号里面的38912k为该内存区域的总容量。
方括号外面的6123k->400k(125952k),表示gc前java堆已使用容量->gc后java堆已使用容量,后面圆括号里面的125952k为java堆总容量。
[times: user=0.00 sys=0.00, real=0.00 secs]分别表示用户消耗的cpu时间,内核态消耗的cpu时间和操作从开始到结束所经过的墙钟时间(wall clock time),cpu时间和墙钟时间的差别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘i/o、等待线程阻塞,而cpu时间不包括这些耗时。
二、gc日志的离线分析
可以使用一些离线的工具来对gc日志进行分析,比如sun的gchisto( https://java.net/projects/gchisto),gcviewer( https://github.com/chewiebug/gcviewer ),这些都是开源的工具,用户可以直接通过版本控制工具下载其源码,进行离线分析。
总结
以上就是本文关于java虚拟机gc日志分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
下一篇: SpringBoot多配置切换的配置方法