JVM GC日志文件分析

JVM GC日志文件分析

       GC 是垃圾回收(Garbage Collection)的缩写。两个关键名词:垃圾回收那何谓垃圾呢,JVM认为没有任何引用指向的对象就是垃圾对象,JVM里面判定为垃圾的算法有:应用计数法、可达性分析法。何谓回收呢,回收就是把认为是垃圾对象的内存回收回来,JVM里面的回收算法有:标记-清除算法、复制算法、标记整理算法、分代收集算法。GC日志文件就是JAVA虚拟机产生的一种对垃圾回收情况描述性的日志文件。 通过阅读GC日志文件,我们可以了解JAVA虚拟机内存分配情况(因为垃圾回收的对象就是内存)和垃圾回收信息。

GC的对象是内存,又因为内存是在JVM堆区分配的,换句话说GC的对象是JVM堆区(当然也包括方法区的内存)。

一 GC日志文件生成

1.1 GC日志文件JVM相关参数

GC日志文件相关的选项 解释
-XX:+PrintGC (或者-verbose:gc) 输出GC日志(可以认为-verbose:gc 是 -XX:+PrintGC的别名)
-XX:+PrintGCDetails 输出 GC 详细的日志, 包括 GC 使用的收集器, 发生 GC 的区域, GC 空间收集情况等信息,该参数会自动开启-XX:+PrintGC
-XX:+PrintGCTimeStamps 在输出 GC 日志的时候输出时间戳, 这个时间戳是相对于虚拟机的启动时间
-XX:+PrintGCDateStamps 在输出 GC 日志的时候输出 GC 发生的时间(以日期的形式,如2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在发生 GC 时输出 GC 前后各区域空间详细的对比信息, 对 -XX:PrintGCDetails 更加详细的补充
-XX:+PrintReferenceGC 在 GC 的时候打印系统中的软引用, 弱引用和虚引用等引用的数量信息
-Xloggc 输出 GC 日志到文件, 方便排查问题, 如果不配置路径, GC 日志将直接在控制台输出,格式为,-Xloggc:/path/xxx.log,或者-Xloggc:/path/gc-%t.log
-XX:+UseGCLogFileRotation 是否启用 GC 日志文件自动转储, GC 日志文件按大小切割时需要设置
XX:GCLogFileSize 控制 GC 日志文件的大小, 用于 GC 日志的切割, 不宜设置太大, 太大由于写日志需要进行 I/O 操作, I/O 操作需要在用户态和和心态之间切换, 会直接影响 user time 大小和 sys time 大小, 最终影响到 real time 大小, real time 就是 GC 耗费的时间。例如:-XX:GCLogFileSize=50M
-XX:NumberOfGClogFiles GC 日志文件最多保存的个数。例如:-XX:NumberOfGClogFiles=10
-XX:+PrintGCApplicationStopedTime 查看GC造成的应用暂停时间
-XX:+PrintTenuringDistribution 对象晋升的日志
-XX:+HeapDumpOnOutOfMemoryError 内存溢出时输出 dump 文件

1.2 GC日志文件生成

       比如我们可以在我们的应用程序java -jar启动的时候添加如下参数,这样程序运行过程中会把GC日志文件输出到gclogs文件里面去。拿到GC日志文件之后,我们可以对gclogs文件做相应的分析。

-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

二 GC日志文件分析

2.1 GC日志文件解读

       当我们拿到GC日志文件之后,用文本方式打开文件可以看到一堆的文字和数据信息。其实里面的内容不复杂就是文件比较多而已。我们得先来介绍下GC日志文件格式,GC日志文件包含哪些内容,每个内容代表啥意思。在了解了日志文件格式之后我们才可以对GC日志文件做简单的分析。这里为了简单我就通过一个图来介绍GC日志文件里面每个区域所代表的意思。

image-20200424215717123.png

GC的原因:

  • Allocation Failure:年轻代中没有足够的空间存储数据了。
  • Metadata GC Threshold:元空间没有足够的空间存储数据了。
  • Ergonomics:GC的原因是因为要自动调解GC暂停时间和吞吐量之间的平衡
  • System.gc():GC的原因是因为调用了System.gc()函数

2.2 GC日志文件分析工具

       GC日志文件的内容信息,我们上面分析清楚了。接下来就是对GC日志文件做简单的分析了。为了节约咱们得分析时间。我们直接介绍一个非常好用GC日志文件在线分析工具gceasy。对应官网 https://gceasy.io/ 。打开网址,把我们生成的GC日志文件导入进去。就会以图形化的界面帮我们展示GC日志文件里面所有你需要的信息了。展示的信息简单直接明了。

2.2.1 JVM memory size(JVM内存大小区域)

[图片上传失败...(image-7af870-1587738242306)]

        JVM memory size,gceasy给展示了年轻代,老年代,元空间。JVM给分配的大小和程序运行过程中实际使用的峰值大小。

        从JVM memory size展示的信息,我们可以判断是否需要做如下几件事情:

  • 是否需要修改JVM内存(-Xms、-Xmx...)相关设置。比如年轻代和老年代峰值大小远远小于分配的大小。这个时候我们可以适当的减少内存设置。

  • 是否需要调整年轻代和老年代的比例(-XX:NewSize(-Xns)、-XX:MaxNewSize(-Xmn)、-XX:SurvivorRatio=8)。比如老年代的峰值一直小于老年代申请的内存,这个时候我们就可以稍微多分点空间给年轻代;

  • 是否需要修改元空间(XX:MetaspaceSize,-XX:MaxMetaspaceSize)相关设置。

年轻代,老年代属于堆区。元空间属于非堆区(直接对接的是机器的内存)。

2.2.2 Key Performance Indicators(关键性能指标)

image-20200419003042535.png

        Key Performance Indicators给我们展示了GC吞吐量(应用程序线程用时占程序总用时的比例,越高越好)、每次GC的平均耗时(建议控制在50毫秒以下)、GC最长耗时、每个时间段的GC次数等信息。

        Key Performance Indicators显示的信息里面,我们得关注点应该在以下几个方面:

  • 吞吐量,应用花在非GC上的时间百分比(引用花在生产任务上的百分比)。所以吞吐量越高越好。

  • 每次GC的平均耗时。越小越好,建议50毫秒一下。

  • GC最长耗时。越小越好。如果你的应用是一个后台程序,并且任何请求不超过10秒。那么GC最长耗时就不能超过10秒。

       根据内存调优准则,以上这三个优化指标,你最多只能三者取其二

  • 如果你想要比较好的吞吐量延迟,那就得在CPU消耗上有所牺牲
  • 如果你想要比较好的吞吐量CPU消耗,那就得在延迟上有所牺牲
  • 如果你想要比较好的延迟CPU消耗,那就得在吞吐量上有所牺牲

2.2.3 Interactive Graphs(交互图)

       Interactive Graphs展示了Heap after GC、Heap before GC、GC Duration、Reclaimed Bytes、Young Gen、Old Gen、Meta Space、A & P对应的信息。

  • Heap after GC: 每次GC后堆的内存信息。
image-20200419003122646.png
  • Heap before GC: 每次GC前堆的内存信息。
image-20200419003204190.png
  • GC Duration: 每次GC的持续时间。(注意红色的是Full GC)
image-20200419003218774.png
  • Reclaimed Bytes: 每次GC回收掉的垃圾对象的内存大小。
image-20200419003234477.png
  • Young Gen: 三条曲线分别展示年轻代每次GC的时候JVM给年轻代分配的内存大小、GC前使用内存大小、GC后使用内存大小。
image-20200419003308925.png
  • Old Gen: 三条曲线分别展示老年代每次GC的时候JVM给老年代分配的内存大小、GC前使用内存大小、GC后使用内存大小。
image-20200419003321101.png
  • Meta Space: 三条曲线分别展示元空间每次GC的时候给分配的内存大小、GC前使用内存大小、GC后使用内存大小。
image-20200419003335813.png
  • A & P: 每次GC的时候堆内存分配和晋升情况。其中红色的线表示每次GC的时候年轻代里面有多少内存(对象)晋升到了老年代。
image-20200419003350899.png

2.2.4 GC Statistics(GC统计信息)

image-20200419003406219.png
image-20200419003443910.png

       GC Statistics显示一些GC的统计信息。每种GC总共回收了多少内存、总共用了多长时间、平均时间、以及每种GC的单独统计信息啥的。

2.2.5 Object Stats(对象的一些统计信息)

image-20200419003456250.png

2.2.6 GC Causes(GC的原因信息)

image-20200419003507536.png

以上就是我们对GC日志文件的一个大致介绍,主要是介绍GC日志文件分析工具,为我们后续分析GC日志文件做准备。

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

推荐阅读更多精彩内容

  • Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系...
    尹小凯阅读 1,687评论 0 10
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,202评论 0 7
  • 第一章 简介 J2SE平台的一大优势是它的自动化内存管理,避免了开发者去面对内存管理的复杂性。 本文以Sun J2...
    tianyiliusha阅读 956评论 0 1
  • 1、什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致...
    JavaLover阅读 872评论 0 1
  • 爸爸这个词, 需要用真正厚重的父爱来诠释。 壹 前段时间微博被李达康书记的一个动图刷屏了。 达康书记在沙发上看着电...
    是年阅读 961评论 0 1