欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java虚拟机GC日志分析

程序员文章站 2023-10-20 11:37:31
本文研究的主要是java虚拟机中gc日志的理解问题,具体如下。 一、日志分析 理解gc日志是处理java虚拟机内存问题的基本技能。 通过在java命令种加入参数...

本文研究的主要是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日志分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!