环境:solaris5,jdk5
需要做GC调优,首先是要收集gc信息,不然你怎么去做调优呢。
方法一:通过配置JVM参数,自动产生日志文件
要收集gc信息,可以在JVM参数中需要设置打印gc信息。下面是配置JVM日志参数详解:
JVM日志参数配置一:
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:serverGC.log
输入样式:
481.991: [GC 481.991: [ParNew: 248412K->53301K(294912K), 0.2264667 secs] 2313927K->2137697K(2523136K), 0.2274222 secs]
483.324: [Full GC 483.325: [ParNew: 249962K->53149K(294912K), 0.2936765 secs] 2334358K->2156729K(2523136K), 0.2945332 secs]
输出格式说明:
ParNew: GC收集器的名称
248412K: 新生代在GC前占用的内存
53301K: 新生代在GC后占用的内存
294912K: 新生代堆大小
0.2264667 secs 新生代局部收集时jvm暂停处理的时间
2313927K JVM Heap 在GC前占用的内存
2137697K JVM Heap 在GC后占用的内存
2523136K :JVM Heap 总大小
0.2274222 secs GC过程中jvm暂停处理的总时间
JVM日志参数配置二:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:serverGC.log
输入样式:
12090.442: [GC {Heap before gc invocations=775: par new generation total 327680K, used 297546K [0xfffffffec0000000, 0xfffffffed8000000, 0xfffffffed8000000) eden space 262144K, 100% used [0xfffffffec0000000, 0xfffffffed0000000, 0xfffffffed0000000) from space 65536K, 54% used [0xfffffffed4000000, 0xfffffffed6292820, 0xfffffffed8000000) to space 65536K, 0% used [0xfffffffed0000000, 0xfffffffed0000000, 0xfffffffed4000000) concurrent mark-sweep generation total 2228224K, used 1517316K [0xfffffffed8000000, 0xffffffff60000000, 0xffffffff60000000) concurrent-mark-sweep perm gen total 262144K, used 154202K [0xffffffff60000000, 0xffffffff70000000, 0xffffffff70000000) 12090.442: [ParNew: 297546K->43374K(327680K), 0.4362126 secs] 1814862K->1564027K(2555904K)Heap after gc invocations=776: par new generation total 327680K, used 43374K [0xfffffffec0000000, 0xfffffffed8000000, 0xfffffffed8000000) eden space 262144K, 0% used [0xfffffffec0000000, 0xfffffffec0000000, 0xfffffffed0000000) from space 65536K, 66% used [0xfffffffed0000000, 0xfffffffed2a5b990, 0xfffffffed4000000) to space 65536K, 0% used [0xfffffffed4000000, 0xfffffffed4000000, 0xfffffffed8000000) concurrent mark-sweep generation total 2228224K, used 1520652K [0xfffffffed8000000, 0xffffffff60000000, 0xffffffff60000000) concurrent-mark-sweep perm gen total 262144K, used 154202K [0xffffffff60000000, 0xffffffff70000000, 0xffffffff70000000) } , 0.4374109 secs] |
输出格式说明:
红色字“Heap after gc invocations=776”前面内容是gc前的信息,后面内容是gc后的信息。中括号的内容是内存地址
invocations:GC次数
327680K:年轻代堆大小
297546K:年轻代已使用了大小
262144K:年轻代中eden区的大小
65536K:年轻代中survivor区的大小
2228224K:年老代堆大小
1517316K:已用年老代大小
262144K:永久区堆大小
154202K:已用永久区大小
, 0.4374109 secs:gc中断应用程序时间
从日志信息看,我更喜欢使用第二种输出,可以看出整个heap堆的不同分区的大小。
方法二:使用jdk命令,产生日志文件
1、进入jdk安装路径\bin
2、执行命令:./jstat -gcutil [PID] 10000>>gc.log #就会每隔10秒产生一次gc信息输出到gc.log文件中,格式如下
S0 S1 E O P YGC YGCT FGC FGCT GCT
100.00 0.00 65.64 49.73 56.73 42 8.649 24 110.087 118.736
s0和s1是新生代susvivoro2个区
E是eden区
O是年老代
P是持久代
YGC minor gc执行次数
YGCT minor gc执行耗费时间
FGC Full gc执行次数
FGCT Full gc执行耗时
GCT gc总时间