Java中的边界检查

Java中的边界检查,java,runtime,jvm-hotspot,bounds-check-elimination,Java,Runtime,Jvm Hotspot,Bounds Check Elimination,“热点可以删除Java中的边界检查。”有人能解释一下吗?实际上,我分析了C++和java之间的区别。这不是一个家庭作业,我正在分析我自己的兴趣。在谷歌搜索“热点边界检查”后,出现了(作为第一个结果),并给了我们一些见解: 摘要: 每当访问数组元素时, Java虚拟机执行 比较指令以确保 索引值在有效范围内 界限。这降低了执行速度 Java程序的速度。数组边界 检查消除标识 此类检查不可用的情况 多余的,可以删除。我们 提供数组边界检查 Java语言的消元算法 热点™ 基于静态分析的虚拟机 在即时

“热点可以删除Java中的边界检查。”有人能解释一下吗?实际上,我分析了C++和java之间的区别。这不是一个家庭作业,我正在分析我自己的兴趣。

在谷歌搜索“热点边界检查”后,出现了(作为第一个结果),并给了我们一些见解:

摘要:

每当访问数组元素时, Java虚拟机执行 比较指令以确保 索引值在有效范围内 界限。这降低了执行速度 Java程序的速度。数组边界 检查消除标识 此类检查不可用的情况 多余的,可以删除。我们 提供数组边界检查 Java语言的消元算法 热点™ 基于静态分析的虚拟机 在即时编译器中

该算法适用于中间层 静态单幅图像的表示 分配表和维护 索引表达式的条件。信息技术 如果可以,则完全删除边界检查 要证明他们从不失败。 只要可能,它就会移动边界 签出循环。静态数 支票的数量保持不变,但 一个循环内的检查很可能是 执行得更频繁。如果这样的支票 如果失败,执行程序将失败 返回解释模式,避免 引发异常的问题 错地方了

评估显示,加速速度接近 理论最大值 科学SciMark基准测试套件 (平均40%)。算法也同样适用 提高了应用程序的执行速度 SPECjvm98基准测试套件(在 平均,最大12%)

马克·梅奥很好地解释了这一点


一句话:如果Hotspot检测到不需要检查数组的边界,它会认为这是一个机会,可以禁用该数组的边界检查,从而提高性能。

它通过不断分析程序的性能来寻找可能频繁或重复执行的“热点”,然后,它们的目标是以最小的开销优化高性能执行,以获得性能要求较低的代码

因此,从理论上讲,如果存在一些边界检查,并且通过重复和频繁执行可以明显看出它不可能超出边界,那么热点可能会优化这些检查。这并不意味着它是绝对正确的,但这可能是它发生的原因之一


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

上下文是什么,您是否有一个示例来说明您所说的内容?这是一个家庭作业问题吗?可能来自比较两种语言“通常执行边界检查”的地方。HotSpot可以删除边界检查。“来自Java?这似乎是一篇第三方研究论文。写这篇论文的人有没有将他们的实现实际合并到HotSpot中?这篇论文的一位作者现在在Oracle的Graal编译器上工作。这篇论文指出“…我们在Java HotSpot TM VM中实现的算法。它目前已集成到JDK 7[16]的早期access构建b04中。“因此,它很可能被包括在内(如果没有删除的话)。