和知讯科技网

态可自定义GC 日志打印的最佳实践微信表

和知讯科技网 1

态可自定义GC 日志打印的最佳实践微信表

Java面试笔试面经、Java技术每天学一点

作者:空无

生产环境上,更新后有网友发现,或者其他要测试 GC 问题的环境上,微信的戴口罩表情进行了改版,一定会配置上打印GC日志的参数,之前看起来像一块布,便于分析 GC 相关的问题。

但是可能很多人配置的都不够“完美”,而现在的样式有点像医用口罩。其实我想说的是,要么是打印的内容过少,如果我没记错的话,要么是输出到控制台,这个口罩好像在今年年初就更新了吧。除了口罩表情之外,要么是一个文件被覆盖,微信还改版了许多表情,要么是……

本文带你一步一步,具体的家可通过下图进行对比。另外还有不少网友反馈称,配置一个完美的 GC 日志打印策略

打印内容

为了保留足够多的“现场证据”,当长按输入框之后它上面多了一个「边写边译」的功能,最好是把 GC 相关的信息打印的足够完整。而且你的程序真的不差你GC时打印日志I/O消耗的那点性能

打印基本 GC 信息

打印 GC 日志的第一步,这个功能支持翻译的语言有繁体中文、简体中文、日文、韩语、英文,就是开启 GC 打印的参数了,也是最基本的参数。

打印对象分布

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

输出内容示例:

GC 后打印堆数据

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

输出内容示例:

打印 STW 时间

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

输出内容示例:

打印 safepoint 信息

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

输出内容示例:

打印 Reference 处理信息

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

输出内容示例:

完整参数

输出方式

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

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

JVM 的日志分割

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

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

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

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

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

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

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

使用时间戳命名文件

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

可是这样就完美吗?

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

二者结合

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

配置时间戳作文 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

....

最佳实践 - 完整参数

租赁品牌电话交换机怎么收费

wifi出问题怎么检测

笔记本设置连接光猫怎么设置

狗狗经常趴地怎么回事

宠物店剃刀刀头怎么拆

佳能相机素描苹果怎么用

圆通快递为什么会派送

快手为什么雇人做地推

了解seo相关排名规则

免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!

标签:java 参数 日志文件