9. 内存回收(GC日志及工具)
GC日志查看
可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略
GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空
对应的参数列表
1 | -XX:+PrintGC 输出GC日志 |
指标
监控GC在于判断JVM是否在良好高效地工作并且是否需要投入性能调优(主要包括应用程序优化与JVM参数优化),关注的数据大概有:
- Mirror GC频率、持续时间以及回收内存量。
- Major GC频率、持续时间、回收内存量以及 stop-the-world 耗时。
- Heap 对象分配(导出.hprof文件分析,通常比较大)
GC LOG 及Collector行为分析
LOG分析包含前面文章所介绍的各个GC collector的行为分析。
- 通过加入 -XX:+PrintGCDetails参数则可以打印详细GC信息至控制台。
- 参数-verbose:gc也是可以,但不够详细。
- 通过加入-XX:+PrintGCDateStamps则可以记录GC发生的详细时间。
- 通过加入 -Xloggc:/home/XX/gc/app_gc.log 可以把GC输出至文件,这对长时间服务器GC监控很有帮助。
以下列出一些参数大致打印的信息如下:
-verbose:gc:
1
[GC 72104K->9650K(317952K), 0.0130635 secs]
-XX:+PrintGCDetails:
1
[GC [PSYoungGen: 142826K->10751K(274944K)] 162800K->54759K(450048K), 0.0609952 secs] [Times: user=0.13 sys=0.02, real=0.06 secs]
-XX:+PrintGCDetails 加上-XX:+PrintGCDateStamps 参数则打印如下:
1
2015-12-06T12:32:02.890+0800: [GC [PSYoungGen: 142833K->10728K(142848K)] 166113K->59145K(317952K), 0.0792023 secs] [Times: user=0.22 sys=0.00, real=0.08 secs]
首先来说明一段在各个GC中通用的字段含义说明
- 142826K->10751K(274944K) 分别代表回收前、回收后以及总内存大小。
- Times: user=0.46 sys=0.05, real=0.07 secs:
- user代表GC 需要的各个CPU总时间(各个CPU时间相加)
- sys代表回收器自身的行为所占用CPU时间
- real则代表本次GC所耗费的真正耗时(在多核CPU中并行回收,它通常小于user)
GC监控工具
- JConsole
- JVisualVM
jmap
1 | jmap -heap [pid] //整个JVM中内存的情况 |
其中 7880为 PID,导出的文件可使用Memory Analyzer, jvisualvm, jprofile等工具打开
在使用CMS GC时,jmap -heap执行可能导致Java进程被挂起
jhat
如果你导出的 hprof 文件很大不方便下载本地分析,可以使用 jhat 启动HTTP Server的后可以使用浏览器访问
例如:执行 jhat d:/test.hprof / jhat -J -Xmx1024M [file] 端口提供HTTP服务,使用浏览器即可访问:
注:如果导出的文件很大,则需要开启更多的内存空间,使用 -J-Xmx5g 命令则开启最大5G
jstat (jstatd) & jvisualvm
jstat用于实时监测 GC情况,如PID为7880的应用监测,每 1000毫秒打印一次:
用于GC分析的参数
- gc
- gccapacity
- gccause
- gcnew
- gcnewcapacity
- gcold
- gcoldcapacity
- gcpermcapacity
- gcutil
- 可通过此命令查看jvm各代空间占用情况,minor gc次数,消耗时间、full gc次数及消耗时间统计
- jstat -gcutil [pid] [interval] //每个多少秒打印一次
参数 含义 s0 Survivor空间的使用率 s1 Survivor空间的使用率 E Eden空间的使用率 O old空间使用率 P 持久代空间使用率 YGC minor GC执行次数 YGCT minor GC执行消耗时间 FGC full GC执行次数 FGCT full GC执行消耗时间 GCT Minor GC + Full GC消耗时间
使用命令:
1 | jstat -gc 7880 1000 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的生活小站!