GC:Garbage Collection 垃圾回收
(1)GC种类:
Scavenge GC 和 Full GC
选择合适的GC收集器(串行、并行、并发)、调整JVM heap的大小、调整young generation的比重。
(2)设置输出GC日志:
引用
CATALINA_OPTS="-server -Xms3072m -Xmx3072m -XX:PermSize=512m -XX:MaxPermSize=1024m -Xloggc:/usr/local/tomcat/logs/gc.log -XX:+PrintClassHistogram -XX:+PrintGCDetails"
堆设置
-Xms:初期Heap大小
-Xmx:最大Heap大小
-Xss:每个线程的堆栈大小
-XX:NewSize
-XX:MaxNewSize
-XX:PermSize
-XX:MaxPermSize
-XX:NewRatio
-XX:SurvivorRatio
垃圾回收统计设置
-Xloggc:<file_path> GC日志文件输出
-XX:+PrintClassHistogram
-XX:+PrintGCDetails 输出GC详细信息(New、Old)
-XX:+PrintGCDateStamps 输出时间戳
持久代一般固定大小为64m
(3)GC日志例子:
引用
1718.835: [GC [PSYoungGen: 786432K->19883K(917504K)] 786568K->20019K(3014656K), 0.0222160 secs] [Times: user=0.14 sys=0.01, real=0.02 secs]
时间: [GC [<回收器名>: <新生代GC前大小> -> <新生代GC后大小>(<可用容量>)] <Heap在GC前大小> -> <Heap在GC后大小><可用容量>, <GC中jvm暂停时间>]
“1718.835”代表了GC发生的时间(从Java虚拟机启动以来经过的秒数)。
引用
23006.031: [Full GC [PSYoungGen: 8874K->0K(1034752K)] [PSOldGen: 2092515K->135616K(2097152K)] 2101390K->135616K(3131904K) [PSPermGen: 57227K->56746K(524288K)], 0.5162470 secs] [Times: user=0.51 sys=0.00, real=0.52 secs]
时间: [[Full GC,新生代:回收前->回收之后(回收的容量) 老年代:前->后,总 永久区:前,后,总,用时
GC针对New、Full GC针对New/Old/Perm;
Full GC的时候会停止所有线程处理又名“Stop the World”
Full GC如果是调用System.gc()方法所触发的收集,那么在这里将显示“Full GC (System)”。如果间隔3600s的话就是定时GC处理。
GC发生时机:
New对象时Heap内存不足GC
System.gc(),可通过“-XX:+DisableExplicitGC”禁止
定时GC“-Dsun.rmi.dgc.server.gcInterval”默认1小时
(4)工具:
日志查看
GCViewer
HPjmeter
JDK标准工具jconsole、VisualVM
JDK附带命令jps(显示JVM的进程ID)、jstat(监视JVM的GC状况)、jstack(获取JVM堆栈信息)、jmap(获取JVM的HeapDump)、jhat(HeapDump分析工具
HeapDump分析工具
Eclipse Memory Analyzer
参考:
http://pengjiaheng.iteye.com/blog/518623
http://d.hatena.ne.jp/tanakakns/20120508/1336467306