1.概述

转载:Flink jvm参数配置GC日志

生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题。

但是可能很多人配置的都不够“完美”,要么是打印的内容过少,要么是输出到控制台,要么是一个大文件被覆盖,要么是……

本文带你一步一步,配置一个完美的 GC 日志打印策略

打印内容

为了保留足够多的“现场证据”,最好是把 GC 相关的信息打印的足够完整。而且你的程序真的不差你GC时打印日志I/O消耗的那点性能

打印基本 GC 信息

打印 GC 日志的第一步,就是开启 GC 打印的参数了,也是最基本的参数。

-XX:+PrintGCDetails -XX:+PrintGCDateStamps

打印对象分布

为了分析 GC 时的晋升情况和晋升导致的高暂停,不看对象年龄分布日志怎么行

-XX:+PrintTenuringDistribution

输出内容示例:

  1. Desired survivor size 59244544 bytes, new threshold 15 (max 15)
  2. - age   1:     963176 bytes,     963176 total
  3. - age   2:     791264 bytes,    1754440 total
  4. - age   3:     210960 bytes,    1965400 total
  5. - age   4:     167672 bytes,    2133072 total
  6. - age   5:     172496 bytes,    2305568 total
  7. - age   6:     107960 bytes,    2413528 total
  8. - age   7:     205440 bytes,    2618968 total
  9. - age   8:     185144 bytes,    2804112 total
  10. - age   9:     195240 bytes,    2999352 total
  11. - age  10:     169080 bytes,    3168432 total
  12. - age  11:     114664 bytes,    3283096 total
  13. - age  12:     168880 bytes,    3451976 total
  14. - age  13:     167272 bytes,    3619248 total
  15. - age  14:     387808 bytes,    4007056 total
  16. - age  15:     168992 bytes,    4176048 total

GC 后打印堆数据

每次发生 GC 时,对比一下 GC 前后的堆内存情况,更直观

-XX:+PrintHeapAtGC

输出内容示例:

  1. {Heap before GC invocations=0 (full 0):
  2. garbage-first heap   total 1024000K, used 324609K [0x0000000781800000, 0x0000000781901f40, 0x00000007c0000000)
  3. region size 1024K, 6 young (6144K), 0 survivors (0K)
  4. Metaspace       used 3420K, capacity 4500K, committed 4864K, reserved 1056768K
  5. class space    used 371K, capacity 388K, committed 512K, reserved 1048576K
  6. Heap after GC invocations=1 (full 1):
  7. garbage-first heap   total 1024000K, used 21755K [0x0000000781800000, 0x0000000781901f40, 0x00000007c0000000)
  8. region size 1024K, 0 young (0K), 0 survivors (0K)
  9. Metaspace       used 3420K, capacity 4500K, committed 4864K, reserved 1056768K
  10. class space    used 371K, capacity 388K, committed 512K, reserved 1048576K
  11. }

打印 STW 时间

暂停时间是 GC 最重要的指标,肯定不能少

-XX:+PrintGCApplicationStoppedTime

输出内容示例:

Total time for which application threads were stopped: 0.0254260 seconds, Stopping threads took: 0.0000218 seconds

打印 safepoint 信息

进入STW阶段之前,需要要找到一个合适的 safepoint ,这个指标一样很重要(非必选,出现 GC 问题时最好加上此参数调试)

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

输出内容示例:

  1. vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
  2. 0.371: ParallelGCFailedAllocation       [      10          0              0    ]      [     0     0     0     0     7    ]  0   
  3. Execute full gc...dataList has been promoted to cms old space
  4. vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
  5. 0.379: ParallelGCSystemGC               [      10          0              0    ]      [     0     0     0     0    16    ]  0   
  6. vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
  7. 0.396: no vm operation                  [       9          1              1    ]      [     0     0     0     0   341    ]  0   

打印 Reference 处理信息

强引用/弱引用/软引用/虚引用/finalize 方法万一有问题,不得打印出来看看?

-XX:+PrintReferenceGC

输出内容示例:

  1. 2021-02-19T12:41:30.462+0800: 5072726.605: [SoftReference, 0 refs, 0.0000521 secs]
  2. 2021-02-19T12:41:30.462+0800: 5072726.605: [WeakReference, 0 refs, 0.0000069 secs]
  3. 2021-02-19T12:41:30.462+0800: 5072726.605: [FinalReference, 0 refs, 0.0000056 secs]
  4. 2021-02-19T12:41:30.462+0800: 5072726.605: [PhantomReference, 0 refs, 0 refs, 0.0000059 secs]
  5. 2021-02-19T12:41:30.462+0800: 5072726.605: [JNI Weak Reference, 0.0000131 secs], 0.4635293 secs]

完整参数

  1. # requireds
  2. -XX:+PrintGCDetails 
  3. -XX:+PrintGCDateStamps 
  4. -XX:+PrintTenuringDistribution 
  5. -XX:+PrintHeapAtGC 
  6. -XX:+PrintReferenceGC 
  7. -XX:+PrintGCApplicationStoppedTime
  8. # optional
  9. -XX:+PrintSafepointStatistics 
  10. -XX:PrintSafepointStatisticsCount=1

输出方式

上面只是定义了打印的内容,默认情况下,这些日志会输出到控制台(标准输出)。那如果你的程序日志也输出到控制台呢,这个日志内容就会很乱,分析起来很麻烦。如果你是追加的方式(比如 tomcat 的 catalina.out 就是追加),这个文件会越来越大,分析起来就要命了。

所以需要一种分割日志的机制,这个机制嘛……JVM自然是提供的。

JVM 的日志分割

JVM提供了几个用于分割 GC 日志的参数:

  1. # GC日志输出的文件路径
  2. -Xloggc:/path/to/gc.log
  3. # 开启日志文件分割
  4. -XX:+UseGCLogFileRotation 
  5. # 最多分割几个文件,超过之后从头开始写
  6. -XX:NumberOfGCLogFiles=14
  7. # 每个文件上限大小,超过就触发分割
  8. -XX:GCLogFileSize=100M

按照这个参数,每个GC日志只要超过20M就会进行分割,最多分割5个文件,文件名依次是gc.log.0,gc.log.1,gc.log.2,gc.log.3,gc.log.4, .....

看似很美好,几行配置就搞定了输出文件的问题。但是这种方式有一些问题:

  • -Xloggc 方式指定的日志文件,是覆盖写的方式,每次启动都会覆盖,历史日志会丢失

  • 当超过最大分割数后,会从第0个文件开始重新写入,而且是覆盖

  • -XX:NumberOfGCLogFiles 并不能设置为无限

这个覆盖的问题就有点恶心了,每次启动覆盖之前的历史日志……这谁能忍?

使用时间戳命名文件

于是有另一种解决方案。不使用 JVM 提供的日志分割功能,而是每次启动用时间戳命名日志文件,这样可以每次启动都使用不同的文件,就不会出现覆盖的问题了。

  1. # 使用-%t作为日志文件名
  2. -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc-%t.log
  3. # 生成的文件名是这种:gc-2021-03-29_20-41-47.log

可是这样就完美吗?

虽然没有覆盖的问题,但由于没有日志分割的功能,每次启动后只有一个GC日志文件,单个日志文件可能会非常巨大。过大的日志文件分析起来是很麻烦的,必须得分割。

二者结合

这里只需要稍微调整一下策略,将 JVM 分割和时间戳命名两种方案结合,就可以得到最优的方式了。

  1. # GC日志输出的文件路径
  2. -Xloggc:/path/to/gc-%t.log
  3. # 开启日志文件分割
  4. -XX:+UseGCLogFileRotation 
  5. # 最多分割几个文件,超过之后从头开始写
  6. -XX:NumberOfGCLogFiles=14
  7. # 每个文件上限大小,超过就触发分割
  8. -XX:GCLogFileSize=100M

配置时间戳作文 GC 日志文件名的同时,也配置JVM的GC日志分割策略。这样一来,既保证了 GC 文件不会被覆盖,又保证了单个 GC 文件的大小不会过大,完美!

最终得到的日志文件名会像这个样子:

  • gc-2021-03-29_20-41-47.log.0

  • gc-2021-03-29_20-41-47.log.1

  • gc-2021-03-29_20-41-47.log.2

  • gc-2021-03-29_20-41-47.log.3

  • ....

最佳实践 - 完整参数

  1. # 必备
  2. -XX:+PrintGCDetails 
  3. -XX:+PrintGCDateStamps 
  4. -XX:+PrintTenuringDistribution 
  5. -XX:+PrintHeapAtGC 
  6. -XX:+PrintReferenceGC 
  7. -XX:+PrintGCApplicationStoppedTime
  8. # 可选
  9. -XX:+PrintSafepointStatistics 
  10. -XX:PrintSafepointStatisticsCount=1
  11. # GC日志输出的文件路径
  12. -Xloggc:/path/to/gc-%t.log
  13. # 开启日志文件分割
  14. -XX:+UseGCLogFileRotation 
  15. # 最多分割几个文件,超过之后从头文件开始写
  16. -XX:NumberOfGCLogFiles=14
  17. # 每个文件上限大小,超过就触发分割
  18. -XX:GCLogFileSize=100M

【Flink】Flink jvm参数配置GC日志相关推荐

  1. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  2. Java虚拟机:常见JVM参数配置和GC性能优化

    一.常见的JVM参数配置: 1.垃圾回收统计信息: -XX:+PrintGC     打印GC简要信息 -XX:+PrintGCDetails打印GC的详细信息 -XX:+PrintGCTimeSta ...

  3. 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )

    文章目录 一.设置 JVM 命令参数输出 GC 日志 二.GC 日志示例 三.GC 日志分析 一.设置 JVM 命令参数输出 GC 日志 在 IntelliJ IDEA 的启动参数中设置 -XX:+P ...

  4. kafka java jvm 优化_kafka优化–JVM参数配置优化

    主要是启动脚本和log4j基本参数的设置和优化,这些参数藏的比较深. 1.JVM参数配置优化 如果使用的CMS GC算法,建议JVM Heap不要太大,在4GB以内就可以.JVM太大,导致Major ...

  5. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  6. java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析

    今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...

  7. Java JVM虚拟机参数配置 - GC

    1.堆内存 Java中的堆是JVM所管理的内存中最大的一块内存空间,主要用于存放各种类的实例对象. 在Java中堆被划分成两个不同的区域:新生代(Young).老年代(Old).而新生代又被划分为三个 ...

  8. java jvm 参数配置_Java 从小白到大牛,JVM 不得不知的一些参数和配置

    神秘的 JVM 码 有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注.有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很 ...

  9. JVM学习笔记-GC日志分析(对象优先在Eden区分配)

    前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...

最新文章

  1. Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
  2. 突然关机导致git文件受损,如何处理
  3. Winmail邮件服务器
  4. Centos部署YApi
  5. Dijkstra的理解和实现
  6. SpringBoot_日志-SpringBoot默认配
  7. 缩点(有向图的强连通分量)学习笔记
  8. 初学WPF,做一款小游戏练习一下
  9. 12c RMAN新特性之Recover Table
  10. Python项目:生成微信好友头像拼接图
  11. Full details will be found in the appropriate container log 解决办法
  12. ​网易首支 AI 生成歌曲《醒来》正式发布;FSF :苹果 OCSP 事故在道德上不可接受;CentOS 8.3 发布|极客头条...
  13. Oracle 分析函数的使用(主要是rollup用法)
  14. 在线html游戏翻译,怎么把整个英文网页游戏翻译成中文
  15. GPS 定位精度查看
  16. Java中创建Excel文档,POI使用详解
  17. Windows锁机病毒
  18. Modeling Conversation Structure and Temporal Dynamics for Jointly Predicting Rumor Stance and Veraci
  19. python opencv实现 tiff转raw格式以及扩充体积补零
  20. mc网站服务器设置家怎么圈地,我的世界怎么圈地 教你设置自己的领地

热门文章

  1. 全球第一!苹果市值冲破3万亿美元 创历史记录
  2. 欠债3000亿,宣布破产!昔日民族品牌,为何总沦为反面教材?
  3. 网易云音乐下线所有明星艺人榜单,对数字专辑及单曲限购
  4. 安兔兔2月Android手机性价比榜出炉:Redmi包揽前三
  5. 泡泡玛特上市首日涨79.22%报69港元 总市值953亿港元
  6. 特斯拉Model Y在6月份销售7500辆 是Model X两倍多
  7. 长虹美菱:公司主要通过抖音短视频等平台进行直播带货
  8. 从72万现金到骨灰盒,还有什么是不能被忘在网约车上的?
  9. 疫情向左、大基金向右,国产光刻胶走到了哪一步?
  10. 对刚iPad!华为最强Pad发布,独揽四项全球第一,3299元起!