You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JEP 197分段代码缓存中Profiled与NonProfiledCodeHeapSize的区别

首先明确结论:你不能直接把ProfiledCodeHeap和C1编译产物划等号,也不能把NonProfiledCodeHeap完全等同于C2编译产物,二者的划分标准和编译器层级不是完全对应的,具体差异如下:

JEP 197引入的分段代码缓存,三类分区的核心划分依据是代码的生命周期和特性:

  • NonNMethodCodeHeap:你已经了解,存储JVM内部非方法类的二进制代码,比如解释器桩代码、编译器本身的执行代码、JNI适配器等,不存业务方法的编译产物。
  • ProfiledCodeHeap:存储所有带插桩采集逻辑的编译代码,所谓插桩就是你理解的附带运行时计数器,用来统计方法执行次数、分支命中率、类型检查结果等profiling数据,给后续高阶优化提供依据。这类代码绝大多数是C1分层编译中Tier 2、Tier 3层级的产物,特点是临时存在,当对应方法被更高层级编译完成后,就可以被垃圾回收淘汰。
  • NonProfiledCodeHeap:存储所有不带任何插桩逻辑的编译代码,这里面包含两类产物:
    1. 无插桩的C1编译产物,也就是分层编译的Tier 1层级产物,通常用于编译不会高频执行、不需要进一步做C2优化的冷方法
    2. C2(Tier 4)的最终优化编译产物,C2编译时已经消费了之前profiling采集到的所有数据,生成的最高性能代码不需要再插桩统计,因此也存在这个分区

这种拆分设计的核心价值是降低代码缓存的内存碎片,同时提升不同生命周期代码的回收效率:带插桩的临时代码集中存放,淘汰时不需要扫描全缓存,也不会和长期存在的优化代码穿插排列产生碎片。

内容的提问来源于stack exchange,提问作者Eugene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:03