边界检查Java

时间:2010-12-17 10:14:01

标签: java runtime jvm-hotspot bounds-check-elimination

“Hotspot可以删除Java中的边界检查。”有人可以解释一下吗?实际上我正在分析C ++和Java之间的差异。这不是一个功课,而是我自己的兴趣分析。

2 个答案:

答案 0 :(得分:5)

在谷歌搜索“热点边界检查”后,a Paper with the Title "Array Bounds Check Elimination for the Java HotSpot™ Client Compiler"显示(作为第一个结果)并给我们一些见解:

摘要:

  

每当访问数组元素时   Java虚拟机执行   比较指令以确保   索引值在有效范围内   界限。这减少了执行   Java程序的速度。数组边界   检查消除识别   这种检查的情况   多余的,可以删除。我们   提出数组边界检查   Java的消除算法   HotSpot™VM基于静态分析   在即时编译器中。

     

该算法适用于中间体   静态单一表示   转让表格和维护   索引表达式的条件。它   如果可以的话,完全删除边界检查   被证明他们永远不会失败。   它尽可能地移动边界   检查循环。静态数字   支票保持不变,但是a   在循环中检查可能是   经常执行。如果这样检查   失败,执行程序失败   回到解释模式,避免   引发异常的问题   错误的地方。

     

评估显示加速接近   理论上的最大值   科学的SciMark基准套件   (平均40%)。算法也   提高了执行速度   SPECjvm98基准套件(2%on   平均,最多12%)。

Mark Mayo很好地解释了这一点。

底线:如果Hotspot检测到没有必要检查数组的边界,它会将此视为一个机会来禁用对该数组的边界检查,从而提高性能。

答案 1 :(得分:1)

通过不断分析程序的性能,寻找可能频繁或重复执行的“热点”,然后以最小的开销为目标优化高性能执行,性能不太重要代码。

因此,理论上如果有一些边界检查,并且通过重复和频繁执行显而易见,它不可能超出界限,热点可能会优化这些检查。并不意味着它是绝对可靠的,但这可能是它发生的原因之一。

来自Würthinger等人的2007 article:“无论何时访问数组元素,Java虚拟机都会执行比较指令以确保索引值在有效范围内。这会降低Java程序的执行速度数组边界检查消除识别这种检查是多余的并且可以被删除的情况。我们基于即时编译器中的静态分析为Java HotSpot™VM提供数组边界检查消除算法。“