利用属性优化 Java 的框架
在 Java 编程中,数组边界检查是保障程序安全执行的重要机制,但它同时也带来了一定的运行时开销。本文将介绍一种利用属性优化 Java 数组边界检查的方法,通过静态分析和属性标记,减少不必要的检查,从而提高程序的性能。
1. 数组边界检查问题
Java 要求在运行时进行数组引用范围检查,以确保程序的安全执行。如果数组索引超出范围,运行时环境必须在数组引用发生的精确程序点抛出 IndexOutOfBoundsException
。对于基于数组的计算,数组边界检查可能会导致较大的运行时开销,因此消除静态分析证明不必要的检查是有益的。
目前,一些 Java 虚拟机在其 JIT 编译器中实现了数组边界检查消除算法,但这种方法存在两个局限性:
- 由于时间限制,只能应用相对简单的算法。
- 缺乏全局信息,如字段信息和全程序信息,通常 JIT 编译器无法承担这些分析的开销。
为了解决这些问题,我们开发了一种在字节码级别工作的算法。通过静态证明某些数组引用是安全的,并使用类文件属性进行注释,支持属性的 JIT 可以避免为数组边界检查生成指令,而无需自己进行分析。带属性的类文件也可以被提前编译器使用,如 IBM 的 Java 高性能编译器。
Java 需要进行两个边界检查,即下界检查和上界检查。数组的下界始终为常量零,上界检查将索引与数组长度进行比较。在流行的架构(如 IA - 32 和 PowerPC)上,通过无符号比较指令进行上界检查即可实现两个检查,因为当负整数被解释为无符号整数时,它总是大于正整数。
此外,消除数组边界检查通常还与消除空指针访问有关