JVM方法意外重编译咨询:基于PrintCompilation日志分析
Java PrintCompilation日志分析解答
原始日志
Time Tier Method 11:20:24 3 m 11:24:14 3 m made not entrant 11:24:15 2 m 11:24:20 4 m 11:24:21 2 m made not entrant
问题1解答
11:24:14到11:24:15这段时间,原Tier3编译的m方法被标记为not entrant(无法被新调用进入),而Tier2版本的编译还未完成。此时方法m的执行会回退到解释执行——因为旧的编译代码已经不能被新调用使用,新的编译版本又没就绪,只能靠解释器处理请求。
问题2解答
在未发生反优化、代码缓存未占满的前提下,方法m被标记为not entrant并在Tier2重编译的可能原因有这些:
- 编译策略调整:JVM分层编译中,Tier3是带轻量 profiling 的编译版本,当运行时收集到的 profiling 数据显示该方法不需要再持续收集 profiling 信息时,会触发降级编译到Tier2(Tier2是不带profiling的优化编译,执行效率更稳定),同时标记旧的Tier3版本不可进入。
- 编译任务调度优化:JVM的编译线程可能之前优先处理了其他高优先级编译任务,后续调度时选择用Tier2重新编译
m,为避免新调用使用旧的Tier3版本,先将其标记为not entrant。 - profiling数据补全:Tier3编译时收集的 profiling 数据不够完整,后续运行中补充的数据表明,用Tier2的优化策略更适配
m的实际执行模式,因此触发重编译,同时禁用旧版本的进入权限。
内容的提问来源于stack exchange,提问作者Gilgamesz
相关产品推荐
相关产品推荐

