找到热点代码,两计数器之和是否超过阀值?

来源:1-4 编译器优化机制详解

慕粉152226940

2020-09-10 08:45:26

http://img.mukewang.com/climg/5f59751009b1721012901766.jpg



http://img.mukewang.com/climg/5f59753c091a56c611921674.jpg


老师课程中提到,Hotspot内置了两类计数器,方法调用计数器和回边计数器,但是在阐述他们各自执行的流程图中,却提到两计数器之和是否超过阀值(即上图箭头所指),那么此时我就比较困惑:

  1. 为什么是会用两个计数器之和去做比较呢?

  2. 另外如果上述二者之和,那么比较的那个阀值有是哪一个呢?也是两者域值之和吗?

写回答

1回答

大目

2020-09-10

您好,很棒的问题哦^_^非常有极客精神,为您点赞!

我参考了下《深入理解Java虚拟机》,发现图是OK的。

此外,在https://hotspot-compiler-dev.openjdk.java.narkive.com/zDMgaPxA/compilethreshold-backedgethreshold-question-s  这里,有一个相关的讨论 ,可以搜索:inv_count + bb_count,这就是两类计数器之和啦。可以看看。

此外,这个图只是一个大致的过程,实际上两个阈值是动态的,计算更为复杂,不同的JDK版本计算方式也不一样,比如这个:https://bugs.openjdk.java.net/browse/JDK-8059604 ,JDK 9就针对方法计数器控制阈值做了调整。

因此,我们在学习的时候,还是可以侧重思路的培养、了解大致的过程。祝您学习愉快!

1

Java架构师-技术专家

千万级电商项目从0到100全过程,覆盖Java程序员不同成长阶段的核心问题与解决方案

2672 学习 · 5839 问题

查看课程