添加JVM GC日志参数后Java应用启动极慢,是否配置有误?
GC日志配置错误导致应用启动变慢的分析与修复
你的GC日志配置存在多处重复、冲突和格式错误,这才导致启动速度暴降,绝非正常现象。具体问题和修复方案如下:
配置中的问题点
- 重复开启GC日志:
-verbose:gc是JDK8及以前的老参数,在JDK9+会被映射为-Xlog:gc,而你同时配置了-Xlog:gc:utctime和-Xlog:gc*,相当于重复开启多层GC日志输出,日志量直接翻倍。 - 日志标签过于宽泛:
-Xlog:gc*会输出所有GC相关的细分日志(包括内存分配、对象年龄、GC各阶段细节等),启动阶段JVM频繁触发Young GC,每条GC的所有细节都被记录,产生巨量日志,磁盘IO成为瓶颈,直接拖慢启动。 - 参数格式错误:
-Xlog:gc:utctime不符合JDK9+的Xlog规范,装饰器(utctime)的位置应为第三个字段,正确写法是-Xlog:gc::utctime;另外-Xlog::::filecount=5,filesize=2M是单独的无效配置,需和主Xlog参数合并才能生效。 - 新老参数冲突:
-Xloggc是JDK8的参数,和JDK9+的-Xlog同时使用会导致日志重复写入同一文件,进一步加重IO负担。
修正后的配置
针对JDK9及以上版本(推荐统一用Xlog)
wrapper.java.additional.306=-Xlog:gc,heap:/opt/java/logs/gc-%t.log:utctime,level,tags:filecount=5,filesize=2M
说明:如果不需要太细的GC日志,把gc,heap改成gc即可,既能监控GC情况,又不会产生过多日志影响启动。
针对JDK8及以下版本
wrapper.java.additional.306=-verbose:gc wrapper.java.additional.307=-Xloggc:/opt/java/logs/gc-%t.log wrapper.java.additional.308=-XX:+PrintGCDetails wrapper.java.additional.309=-XX:+PrintGCDateStamps wrapper.java.additional.310=-XX:+UseGCLogFileRotation wrapper.java.additional.311=-XX:NumberOfGCLogFiles=5 wrapper.java.additional.312=-XX:GCLogFileSize=2M
内容的提问来源于stack exchange,提问作者Svetoslav Angelov
相关产品推荐
相关产品推荐

