【Flink】Flink jvm参数配置GC日志
1.概述
转载:Flink jvm参数配置GC日志
生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题。
但是可能很多人配置的都不够“完美”,要么是打印的内容过少,要么是输出到控制台,要么是一个大文件被覆盖,要么是……
本文带你一步一步,配置一个完美的 GC 日志打印策略
打印内容
为了保留足够多的“现场证据”,最好是把 GC 相关的信息打印的足够完整。而且你的程序真的不差你GC时打印日志I/O消耗的那点性能
打印基本 GC 信息
打印 GC 日志的第一步,就是开启 GC 打印的参数了,也是最基本的参数。
-XX:+PrintGCDetails -XX:+PrintGCDateStamps
打印对象分布
为了分析 GC 时的晋升情况和晋升导致的高暂停,不看对象年龄分布日志怎么行
-XX:+PrintTenuringDistribution
输出内容示例:
- Desired survivor size 59244544 bytes, new threshold 15 (max 15)
- - age 1: 963176 bytes, 963176 total
- - age 2: 791264 bytes, 1754440 total
- - age 3: 210960 bytes, 1965400 total
- - age 4: 167672 bytes, 2133072 total
- - age 5: 172496 bytes, 2305568 total
- - age 6: 107960 bytes, 2413528 total
- - age 7: 205440 bytes, 2618968 total
- - age 8: 185144 bytes, 2804112 total
- - age 9: 195240 bytes, 2999352 total
- - age 10: 169080 bytes, 3168432 total
- - age 11: 114664 bytes, 3283096 total
- - age 12: 168880 bytes, 3451976 total
- - age 13: 167272 bytes, 3619248 total
- - age 14: 387808 bytes, 4007056 total
- - age 15: 168992 bytes, 4176048 total
GC 后打印堆数据
每次发生 GC 时,对比一下 GC 前后的堆内存情况,更直观
-XX:+PrintHeapAtGC
输出内容示例:
- {Heap before GC invocations=0 (full 0):
- garbage-first heap total 1024000K, used 324609K [0x0000000781800000, 0x0000000781901f40, 0x00000007c0000000)
- region size 1024K, 6 young (6144K), 0 survivors (0K)
- Metaspace used 3420K, capacity 4500K, committed 4864K, reserved 1056768K
- class space used 371K, capacity 388K, committed 512K, reserved 1048576K
- Heap after GC invocations=1 (full 1):
- garbage-first heap total 1024000K, used 21755K [0x0000000781800000, 0x0000000781901f40, 0x00000007c0000000)
- region size 1024K, 0 young (0K), 0 survivors (0K)
- Metaspace used 3420K, capacity 4500K, committed 4864K, reserved 1056768K
- class space used 371K, capacity 388K, committed 512K, reserved 1048576K
- }
打印 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
输出内容示例:
- vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
- 0.371: ParallelGCFailedAllocation [ 10 0 0 ] [ 0 0 0 0 7 ] 0
- Execute full gc...dataList has been promoted to cms old space
- vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
- 0.379: ParallelGCSystemGC [ 10 0 0 ] [ 0 0 0 0 16 ] 0
- vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
- 0.396: no vm operation [ 9 1 1 ] [ 0 0 0 0 341 ] 0
打印 Reference 处理信息
强引用/弱引用/软引用/虚引用/finalize 方法万一有问题,不得打印出来看看?
-XX:+PrintReferenceGC
输出内容示例:
- 2021-02-19T12:41:30.462+0800: 5072726.605: [SoftReference, 0 refs, 0.0000521 secs]
- 2021-02-19T12:41:30.462+0800: 5072726.605: [WeakReference, 0 refs, 0.0000069 secs]
- 2021-02-19T12:41:30.462+0800: 5072726.605: [FinalReference, 0 refs, 0.0000056 secs]
- 2021-02-19T12:41:30.462+0800: 5072726.605: [PhantomReference, 0 refs, 0 refs, 0.0000059 secs]
- 2021-02-19T12:41:30.462+0800: 5072726.605: [JNI Weak Reference, 0.0000131 secs], 0.4635293 secs]
完整参数
- # requireds
- -XX:+PrintGCDetails
- -XX:+PrintGCDateStamps
- -XX:+PrintTenuringDistribution
- -XX:+PrintHeapAtGC
- -XX:+PrintReferenceGC
- -XX:+PrintGCApplicationStoppedTime
- # optional
- -XX:+PrintSafepointStatistics
- -XX:PrintSafepointStatisticsCount=1
输出方式
上面只是定义了打印的内容,默认情况下,这些日志会输出到控制台(标准输出)。那如果你的程序日志也输出到控制台呢,这个日志内容就会很乱,分析起来很麻烦。如果你是追加的方式(比如 tomcat 的 catalina.out 就是追加),这个文件会越来越大,分析起来就要命了。
所以需要一种分割日志的机制,这个机制嘛……JVM自然是提供的。
JVM 的日志分割
JVM提供了几个用于分割 GC 日志的参数:
- # GC日志输出的文件路径
- -Xloggc:/path/to/gc.log
- # 开启日志文件分割
- -XX:+UseGCLogFileRotation
- # 最多分割几个文件,超过之后从头开始写
- -XX:NumberOfGCLogFiles=14
- # 每个文件上限大小,超过就触发分割
- -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 提供的日志分割功能,而是每次启动用时间戳命名日志文件,这样可以每次启动都使用不同的文件,就不会出现覆盖的问题了。
- # 使用-%t作为日志文件名
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc-%t.log
- # 生成的文件名是这种:gc-2021-03-29_20-41-47.log
可是这样就完美吗?
虽然没有覆盖的问题,但由于没有日志分割的功能,每次启动后只有一个GC日志文件,单个日志文件可能会非常巨大。过大的日志文件分析起来是很麻烦的,必须得分割。
二者结合
这里只需要稍微调整一下策略,将 JVM 分割和时间戳命名两种方案结合,就可以得到最优的方式了。
- # GC日志输出的文件路径
- -Xloggc:/path/to/gc-%t.log
- # 开启日志文件分割
- -XX:+UseGCLogFileRotation
- # 最多分割几个文件,超过之后从头开始写
- -XX:NumberOfGCLogFiles=14
- # 每个文件上限大小,超过就触发分割
- -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
....
最佳实践 - 完整参数
- # 必备
- -XX:+PrintGCDetails
- -XX:+PrintGCDateStamps
- -XX:+PrintTenuringDistribution
- -XX:+PrintHeapAtGC
- -XX:+PrintReferenceGC
- -XX:+PrintGCApplicationStoppedTime
- # 可选
- -XX:+PrintSafepointStatistics
- -XX:PrintSafepointStatisticsCount=1
- # GC日志输出的文件路径
- -Xloggc:/path/to/gc-%t.log
- # 开启日志文件分割
- -XX:+UseGCLogFileRotation
- # 最多分割几个文件,超过之后从头文件开始写
- -XX:NumberOfGCLogFiles=14
- # 每个文件上限大小,超过就触发分割
- -XX:GCLogFileSize=100M
【Flink】Flink jvm参数配置GC日志相关推荐
- JVM基础系列第14讲:JVM参数之GC日志配置
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...
- Java虚拟机:常见JVM参数配置和GC性能优化
一.常见的JVM参数配置: 1.垃圾回收统计信息: -XX:+PrintGC 打印GC简要信息 -XX:+PrintGCDetails打印GC的详细信息 -XX:+PrintGCTimeSta ...
- 【Java 虚拟机原理】垃圾回收算法 ( 设置 JVM 命令参数输出 GC 日志 | GC 日志输出示例 | GC 日志分析 )
文章目录 一.设置 JVM 命令参数输出 GC 日志 二.GC 日志示例 三.GC 日志分析 一.设置 JVM 命令参数输出 GC 日志 在 IntelliJ IDEA 的启动参数中设置 -XX:+P ...
- kafka java jvm 优化_kafka优化–JVM参数配置优化
主要是启动脚本和log4j基本参数的设置和优化,这些参数藏的比较深. 1.JVM参数配置优化 如果使用的CMS GC算法,建议JVM Heap不要太大,在4GB以内就可以.JVM太大,导致Major ...
- 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 ...
- java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析
今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...
- Java JVM虚拟机参数配置 - GC
1.堆内存 Java中的堆是JVM所管理的内存中最大的一块内存空间,主要用于存放各种类的实例对象. 在Java中堆被划分成两个不同的区域:新生代(Young).老年代(Old).而新生代又被划分为三个 ...
- java jvm 参数配置_Java 从小白到大牛,JVM 不得不知的一些参数和配置
神秘的 JVM 码 有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注.有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很 ...
- JVM学习笔记-GC日志分析(对象优先在Eden区分配)
前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...
最新文章
- Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
- 突然关机导致git文件受损,如何处理
- Winmail邮件服务器
- Centos部署YApi
- Dijkstra的理解和实现
- SpringBoot_日志-SpringBoot默认配
- 缩点(有向图的强连通分量)学习笔记
- 初学WPF,做一款小游戏练习一下
- 12c RMAN新特性之Recover Table
- Python项目:生成微信好友头像拼接图
- Full details will be found in the appropriate container log 解决办法
- ​网易首支 AI 生成歌曲《醒来》正式发布;FSF :苹果 OCSP 事故在道德上不可接受;CentOS 8.3 发布|极客头条...
- Oracle 分析函数的使用(主要是rollup用法)
- 在线html游戏翻译,怎么把整个英文网页游戏翻译成中文
- GPS 定位精度查看
- Java中创建Excel文档,POI使用详解
- Windows锁机病毒
- Modeling Conversation Structure and Temporal Dynamics for Jointly Predicting Rumor Stance and Veraci
- python opencv实现 tiff转raw格式以及扩充体积补零
- mc网站服务器设置家怎么圈地,我的世界怎么圈地 教你设置自己的领地
热门文章
- 全球第一!苹果市值冲破3万亿美元 创历史记录
- 欠债3000亿,宣布破产!昔日民族品牌,为何总沦为反面教材?
- 网易云音乐下线所有明星艺人榜单,对数字专辑及单曲限购
- 安兔兔2月Android手机性价比榜出炉:Redmi包揽前三
- 泡泡玛特上市首日涨79.22%报69港元 总市值953亿港元
- 特斯拉Model Y在6月份销售7500辆 是Model X两倍多
- 长虹美菱:公司主要通过抖音短视频等平台进行直播带货
- 从72万现金到骨灰盒,还有什么是不能被忘在网约车上的?
- 疫情向左、大基金向右,国产光刻胶走到了哪一步?
- 对刚iPad!华为最强Pad发布,独揽四项全球第一,3299元起!