java cpu激增
众所周知,垃圾收集(GC)日志记录不是标准化的。 GC日志格式随您传递的JVM供应商,Java版本,GC算法和GC系统属性而异。 从Oracle到IBM,从Java 8到Java 9,从Serial到Shenandoah,甚至基于技术考虑,日志都不同。 基于这些排列和组合,已经有40多种不同的垃圾收集日志格式。
不同垃圾收集标准的挑战
如果您开发了用于解析GC日志的脚本,以提取某些统计信息,或者在GC时间超过特定阈值时触发警报,或者监视重复的Full GC事件,则必须自定义这些脚本以适应不同格式的GC日志。
由于有许多不同的GC日志格式,因此很难理解每种格式并有效地解释结果。 大多数格式没有任何文档或文献。 当然,这一点可以反驳:您可以使用复杂的GC日志分析工具,例如GCeasy或HPJmeter 。
统一还是扩散?
当我们听到有关使用Java 9中的“ 统一JVM日志记录框架(JEP 158) ”重新实现GC日志的消息时,我们感到非常兴奋。 我们认为所有许多不同的垃圾收集日志都将合并为一种标准格式。 生活将会变得如此轻松。 不幸的是,事实并非如此。 相反,它最终创建了更多的日志格式 ! :-C
统一JVM日志记录框架的目标是为JVM的所有组件引入通用的日志记录系统。 具体来说,它意在统一编译器,垃圾回收,类加载器,元空间,svc,jfr等组件。 那么它是怎样工作的? 在每条日志行中,除旧版本的GC日志中存在的当前信息外,还将打印以下信息:
- 组件名称–编译器,GC,类加载器,元空间,svc,jfr
- 日志级别–跟踪,调试,信息,警告,错误
- 装饰–时间,正常运行时间,timemillis,uptimemillis,timenanos,uptimenanos,pid,tid
除了这些其他参数之外,垃圾收集日志语句的格式也已更改。 这是Java 8和Java 9之间的比较:
![](https://i-blog.csdnimg.cn/blog_migrate/44a9992c202382a6f9991300d7d0f1e1.png)
图1:Java 9统一GC日志记录框架中的G1 GC日志格式
![](https://i-blog.csdnimg.cn/blog_migrate/0c1951f88d923456dd88bff8fca96da7.png)
图3:Java 9统一GC日志记录框架中的CMS GC日志格式
![](https://i-blog.csdnimg.cn/blog_migrate/cb26d750e9ed167b38e9a63e5aa9e74d.png)
图4:Java 8中的CMS GC日志格式
因此,如果仔细观察图1,图2,图3和图4,您会发现Java 8和Java 9之间的垃圾收集日志发生了明显的变化。
但是同样,统一垃圾收集日志记录框架对简化已经很复杂的GC日志格式空间几乎无济于事。
结论
抱怨和批评任何实现都很容易。 但是,我们理解并尊重Oracle工程团队收到的迁移到JVM统一日志记录框架的任务。 由于它是JVM范围内的一项全球计划,因此GC日志记录陷入了这种复杂的情况。 对于这个复杂问题,我的个人解决方案是利用GCeasy或HPJmeter之类的工具来解析大多数格式的GC日志。 但是最后,只有整个社区都可以通过选择一种标准化方法来简化此问题。
翻译自: https://jaxenter.com/proliferation-caused-java-unified-gc-logging-138487.html
java cpu激增