WildFly 9.2运行时CPU占用率升至100%问题排查求助
问题排查步骤
- 优先分析已生成的GC日志,核心关注指标:Full GC触发频率、单次Full GC耗时、老年代占用率、YGC耗时/频率、Mixed GC停顿时长,如果Full GC间隔低于5分钟、单次耗时超过1s,基本可以确认GC是CPU占满的直接原因
- 确认CPU消耗来源:执行
top -Hp <Java进程ID>查看CPU占比最高的线程是否为GC线程,排除业务死循环、锁冲突、大量IO等待等非GC原因 - 堆内存分析:低峰期执行
jmap -dump:format=b,file=heap.hprof <Java进程ID>导出堆快照,用MAT等工具分析是否存在内存泄漏,重点检查堆内存储的大量业务数据是否存在无效引用未释放、缓存过期策略失效、静态集合无限扩容等问题
优化建议
JVM参数调整
当前参数有明显适配不合理的问题,可按以下优先级调整:
- 堆内存扩容:32GB内存的机器仅分配4GB堆内存完全不匹配堆内存储大量数据的场景,建议调整为
-Xms16g -Xmx16g,注意堆内存不要超过32GB避免JVM压缩指针失效 - 补全G1GC关键配置:添加停顿目标和新生代范围限制,G1默认停顿目标为200ms,可根据业务可接受的最长停顿调整:
-XX:MaxGCPauseMillis=200 -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=40 - 兼容JDK版本配置:如果使用JDK8及以上版本,
-XX:MaxPermSize已废弃,替换为-XX:MaxMetaspaceSize=512m - 8核机器可配置并发GC线程数避免和业务线程抢资源:
-XX:ConcGCThreads=2 -XX:ParallelGCThreads=6
业务层面优化
- 堆内存储的大量数据如果为缓存类,建议迁移到堆外缓存或独立缓存服务,大幅降低堆内对象数量,从根源减少GC压力
- 必须堆内存储的场景,优化对象生命周期管理:设置严格的数据过期淘汰策略,避免无效对象长期占用老年代空间,尽量拆分超大对象避免直接进入老年代
- 高并发逻辑中减少不必要的短生命周期对象创建,降低YGC触发频率
内容的提问来源于stack exchange,提问作者sharath patel
相关产品推荐
相关产品推荐

