JEP 197分段代码缓存中Profiled与NonProfiledCodeHeapSize的区别
首先明确结论:你不能直接把ProfiledCodeHeap和C1编译产物划等号,也不能把NonProfiledCodeHeap完全等同于C2编译产物,二者的划分标准和编译器层级不是完全对应的,具体差异如下:
JEP 197引入的分段代码缓存,三类分区的核心划分依据是代码的生命周期和特性:
NonNMethodCodeHeap:你已经了解,存储JVM内部非方法类的二进制代码,比如解释器桩代码、编译器本身的执行代码、JNI适配器等,不存业务方法的编译产物。ProfiledCodeHeap:存储所有带插桩采集逻辑的编译代码,所谓插桩就是你理解的附带运行时计数器,用来统计方法执行次数、分支命中率、类型检查结果等profiling数据,给后续高阶优化提供依据。这类代码绝大多数是C1分层编译中Tier 2、Tier 3层级的产物,特点是临时存在,当对应方法被更高层级编译完成后,就可以被垃圾回收淘汰。NonProfiledCodeHeap:存储所有不带任何插桩逻辑的编译代码,这里面包含两类产物:- 无插桩的C1编译产物,也就是分层编译的Tier 1层级产物,通常用于编译不会高频执行、不需要进一步做C2优化的冷方法
- C2(Tier 4)的最终优化编译产物,C2编译时已经消费了之前profiling采集到的所有数据,生成的最高性能代码不需要再插桩统计,因此也存在这个分区
这种拆分设计的核心价值是降低代码缓存的内存碎片,同时提升不同生命周期代码的回收效率:带插桩的临时代码集中存放,淘汰时不需要扫描全缓存,也不会和长期存在的优化代码穿插排列产生碎片。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

