Java GC分析

[TOC]

1、如何收集GC日志

1.1、 配置JVM启动参数:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
示例:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/app/gc.log

1.2、 GC相关启动参数说明

1.2.1、简单日志模式

-XX:+PrintGC 或者 -verbose:gc
日志输出示例:
[GC 246656K->243120K(376320K), 0,0929090 secs]
[Full GC 243120K->241951K(629760K), 1,5589690 secs]

1.2.2、详细日志格式

-XX:+PrintGCDetails
日志输出示例:
[GC [PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K), 0,0935090 secs] [Times: user=0,55 sys=0,10, real=0,09 secs]
[Full GC [PSYoungGen: 10752K->9707K(142848K)] [ParOldGen: 232384K->232244K(485888K)] 243136K->241951K(628736K) [PSPermGen: 3162K->3161K(21504K)], 1,5265450 secs] [Times: user=10,96 sys=0,06, real=1,53 secs]

1.2.3、日志中添加时间标志(日志每行开头显示自从JVM启动以来的时间,���������单位为秒)

-XX:+PrintGCTimeStamps
日志输出示例:
0,185: [GC 66048K->53077K(251392K), 0,0977580 secs]
0,323: [GC 119125K->114661K(317440K), 0,1448850 secs]

1.2.4、日志中添加日期标志(日志每行开头显示绝日期及时间,���������单位为秒)

-XX:+PrintGCDateStamps
日志输出示例:
2014-01-03T12:08:38.102-0100: [GC 66048K->53077K(251392K), 0,0959470 secs]
2014-01-03T12:08:38.239-0100: [GC 119125K->114661K(317440K), 0,1421720 secs]

1.2.5、 打印GC前后的详细堆栈信息

-XX:+PrintHeapAtGC
日志输出示例:
Heap after GC invocations=1 (full 0):  
 par new generation   total 943744K, used 54474K [0x0000000757000000, 0x0000000797000000, 0x0000000797000000)  
  eden space 838912K,   0% used [0x0000000757000000, 0x0000000757000000, 0x000000078a340000) 
  from space 104832K,  51% used [0x00000007909a0000, 0x0000000793ed2ae0, 0x0000000797000000)  
  to   space 104832K,   0% used [0x000000078a340000, 0x000000078a340000, 0x00000007909a0000)  
 concurrent mark-sweep generation total 1560576K, used 0K [0x0000000797000000, 0x00000007f6400000, 0x00000007f6400000)  
 concurrent-mark-sweep perm gen total 159744K, used 38069K [0x00000007f6400000, 0x0000000800000000, 0x0000000800000000)  
}

1.2.6、查看每次minor GC后新的存活周期的阈值

-XX:+PrintTenuringDistribution
日志输出示例:
Desired survivor size 53673984 bytes, new threshold 4 (max 6)  
- age   1:    9165552 bytes,    9165552 total  
- age   2:    2493880 bytes,   11659432 total  
- age   3:    6817176 bytes,   18476608 total  
- age   4:   36258736 bytes,   54735344 total  
: 899459K->74786K(943744K), 0.0654030 secs] 1225769K->401096K(2504320K), 0.0657530 secs] [Times: user=0.55 sys=0.00, real=0.07 secs]

2、GC文件格式说明

2.1、 GC文件图解

Java GC文件图解

2.2、GC文件格式详解

2014-11-18T16:39:37.728-0800: 88.808: [Full GC [PSYoungGen: 116544K->12164K(233024K)] [PSOldGen: 684832K->699071K(699072K)] 801376K->711236K(932096K) [PSPermGen: 2379K->2379K(21248K)], 3.4230220 secs] [Times: user=3.40 sys=0.02, real=3.42 secs]

每部分说明如下:

2014-11-18T16:39:37.728-0800 – GC运行的绝对时间.

Full GC – GC类型,可以是‘Full GC’ 或 ‘GC’。

[PSYoungGen: 116544K->12164K(233024K)] – 运行新生代GC后,新生代空间从116544k 减少到 12164k 。 总计分配的新生代空间为233024k。

[PSOldGen: 684832K->699071K(699072K)] – 运行年老代GC后, 年老代空间从 684832k 减少到 699071k 。 总计分配的年老代空间为669072k。

801376K->711236K(932096K) – 运行GC后, 整个内存空间从 801376k 减少到 711236k 。 总计分配的内存空间 932096k。

[PSPermGen: 2379K->2379K(21248K)] – 运行GC后, 持久代空间从 2379K 减少到 2379K 。 没有回收持久代空间。

3.4230220 secs – 此次GC运行了3.42秒。

[Times: user=3.40 sys=0.02, real=3.42 secs] – 
Real - 是调用从开始到结束的实际持续时间。 这是所有持续的时间,包括其他进程消耗的时间片和进程花费在阻塞等待(比如等待I/O完成)上的时间。
User - 是进程用户模式(user-mode)代码(非内核模式)消耗的CPU时间。这只是运行这个进程所消耗的CPU时间。其他进程及进程花费在阻塞等待上的时间不包括在内。
Sys - 是进程内核模式(执行内核代码)消耗的CPU时间。 只包括内核中系统调用消耗的CPU时间,不包括执行库代码(library code)的时间。和 'user' 一样,只统计这个进程自己消耗的时间。

User+Sys 告诉你你的进程实际消耗的CPU时间。注意这个时间是所有CPUs时间总和,所以如果进程是多线程执行,那么 User+Sys 可能大于 Real 。

并行GC示例:
[Times: user=11.53 sys=1.38, real=1.03 secs]
串行GC示例:
[Times: user=0.09 sys=0.00, real=0.09 secs]

3、GC分析工具

3.1、在线GC分析

http://gceasy.io/

4、参考资料

https://dzone.com/articles/understanding-garbage-collection-log
https://blog.tier1app.com/2016/04/06/gc-logging-user-sys-real-which-time-to-use/
https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/
http://www.codeceo.com/article/twitter-jvm-performance.html#0-tsina-1-26634-397232819ff9a47a7b7e80a40613cfe1
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
http://darktea.github.io/notes/2013/09/08/java-gc.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 主要关注点: GC日志分析 调优命令 调优工具 GC日志分析 摘录GC日志一部分(前段为年轻代gc回收;后段为fu...
    好久不见_9264阅读 693评论 0 0
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • 最近总是会听到朋友时不时的感慨:为什么美女旁边的都长得那么“随心所欲”的? 我想起当年刚进北京林业大学,去北京西单...
    吴宇仁阅读 366评论 3 4
  • 昨天晚上,餐前水果是橙子,每个孩子三瓣。所有人都吃完了,看到有个小姑娘还没吃,有点奇怪,问她为什么还不吃,她说要...
    我是一朵蘑菇a阅读 647评论 0 0