Java中的边界检查

11

"Hotspot可以在Java中删除边界检查。"有人能解释一下吗?实际上,我正在分析C++和Java之间的区别。这不是作业,我只是出于自己的兴趣进行分析。


3
这是一个询问背景和示例的问题吗?这是一道作业题吗? - Jonathon Bolster
2
在比较Java和C++的页面上,从Java中似乎会“通常执行边界检查。HotSpot可以删除边界检查。” - Mark Mayo
2个回答

8
在谷歌搜索“hotspot bounds checking”后,题为“Array Bounds Check Elimination for the Java HotSpot™ Client Compiler”的论文出现了(作为第一个结果),并且给我们提供了一些见解:
摘要:
每当访问数组元素时,Java虚拟机都会执行比较指令以确保索引值在有效范围内。这会降低Java程序的执行速度。数组边界检查消除识别这些检查是多余的并可以被删除的情况。我们提出了一种基于静态分析的Java HotSpot™ VM的数组边界检查消除算法,该算法工作在静态单赋值形式的中间表示上,并维护索引表达式的条件。如果可以证明它们永远不会失败,则完全删除边界检查。只要可能,它就会将边界检查移出循环。静态检查的数量保持不变,但是循环内的检查可能会被执行更多次。如果这样的检查失败,则执行程序会回退到解释模式,避免在错误位置抛出异常的问题。
评估显示科学SciMark基准套件的速度接近理论最大值(平均40%)。该算法还提高了SPECjvm98基准套件的执行速度(平均2%,最大12%)。
Mark Mayo很好地解释了这一点。
要点:如果Hotspot检测到对于一个数组不需要检查边界,它将把这视为禁用该数组的边界检查的机会,从而提高性能。

1
那似乎是一篇第三方研究论文。撰写它的人是否曾将其实现合并到Hotspot中? - Boann
论文的一位作者,Thomas Würthinger现在在Oracle公司从事Graal编译器的工作。该论文指出:“...我们在Java HotSpot TM VM中实现了该算法。它目前已经集成到JDK 7 [16]的早期访问版本build b04中。”因此,很可能已经包含在内(如果没有被删除的话)。 - Flow

1

它的工作原理是不断分析程序的性能,寻找可能频繁或重复执行的“热点”,然后针对这些热点进行优化,以实现高性能执行和最小开销,适用于不太关键的代码。

因此,理论上,如果存在某些边界检查,并且通过重复和频繁的执行明显表明不可能超出边界,则热点可能会优化掉这些检查。这并不意味着它是绝对可靠的,但这可能是发生这种情况的原因之一。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接