Caliper分配指标全为0的原因、解决方案及JDK适配咨询
问题原因
- 直接原因是你使用的Caliper 1.0-beta-3依赖的
allocation-instrumenter组件内置的ASM版本过低,无法识别JDK16对应的类文件主版本号60,字节码注入失败直接抛出报错,自然无法统计内存分配数据。 - JDK11~14版本无报错但分配指标为0,是因为JDK9之后引入的JPMS模块系统封闭了JDK内部API,同时JVM默认安全策略限制了字节码注入的权限,
allocation-instrumenter虽然能正常解析类文件,但无法完成分配埋点的注入,所以统计结果始终为0。
最高支持的JDK版本
当前1.0-beta-3版本的Caliper,最高能正常支持所有功能(包括内存分配统计)的JDK版本为JDK8。
解决方案
- 方案一:将运行环境的JDK版本降至8,即可正常输出分配统计数据,不需要修改代码或依赖配置。
- 方案二:替换基准测试框架为OpenJDK官方维护的JMH,该框架持续适配最新JDK版本,功能更完善稳定,是Java基准测试的主流选择。
- 方案三:手动升级项目中Caliper依赖的ASM和
allocation-instrumenter组件版本,同时添加JVM启动参数开放模块权限,该方案修改成本较高,且可能出现兼容问题,不推荐。
内容的提问来源于stack exchange,提问作者lineage
相关产品推荐
相关产品推荐

