java服务在运行过程中触发C2编译导致cpu抖动影响服务质量,该如何改善?
作者:卡卷网发布时间:2024-12-08 15:24浏览数量:108次评论数量:0次
针对Java服务在运行过程中触发C2编译导致CPU抖动影响服务质量的问题,以下是一些改善方法:
1. 调整Code Cache大小:
• 通过JVM参数-XX:ReservedCodeCacheSize=256M设置Code Cache的总容量上限。具体的设置应根据监控数据估算,例如单位时间增长量、系统最长连续运行时间等。如果没有相关统计数据,一种推荐的设置思路是设置为当前值(或者默认值)的2倍。
2. 使用龙井预热(Jwarmup):
• 根据前一次程序运行的情况,记录热点代码以及类加载顺序等信息。在应用下一次启动的时候积极主动地对相关类进行加载,并积极编译相关代码,进而使得应用尽快使用上C2编译优化的指令。从而在流量进来之前,提前完成类的加载、初始化和方法编译,避免一面解释执行一面后台编译带来的CPU与load飙高,rt超时等问题。
3. 逐步放开流量:
• 通过控制发布机器的流量大小,用低流量去先诱发JIT,再把发布机器的流量设置到正常水位,避免在JIT过程中,因为全量流量进来导致的CPU飚高、LOAD飚高、RT飚高等问题,使得应用发布或重启时顺滑平稳。
4. 调整JIT编译阈值:
• 通常情况下,我们可以使用-XX:CompileThreshold=5000修改JIT编译阈值为5000。将上述阈值调高意味着提高即时编译的门槛,将热点代码的编译工作分散开来,以防止某一时刻CPU的飙高。
5. 增加C2编译线程数:
• 通过JVM参数-XX:CICompilerCount=threads增加C2编译线程数,可以减少单个编译线程的负载,从而降低CPU占用率。
6. 关闭分层编译:
• 通过JVM参数-XX:-TieredCompilation关闭分层编译,这样可以避免C2编译器的介入,减少CPU的占用,但可能会牺牲一些性能。
7. 监控和分析:
• 使用工具如Arthas进行监控和分析,观察各线程对CPU的使用情况,定位问题线程。
8. 预热流量:
• 在系统启动时使用提前录制好的流量来使系统热点代码完成即时编译,然后再接收真正的流量,以减少对正式环境流量的影响。
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
相关推荐

你 发表评论:
欢迎