破解JVM以避免不必要的边界检查和强制转换

men*_*ics 11 performance jvm

有些语言支持足够强大的类型系统,他们可以在编译时证明代码不能解决其边界之外的数组.我的问题是,如果我们要将这样的语言编译到JVM,是否有某种方法可以利用它来提高性能并删除每次访问阵列时发生的数组边界检查?

1)我知道最近的JDK支持一些数组绑定检查消除,但由于我在编译时知道某些调用是安全的,我可以更安全地删除.

2)有些人可能会认为这不会对性能产生太大影响,但肯定会有所影响,尤其是在阵列/计算等重大应用中,例如科学计算.

关于铸造的同样问题.我知道某些东西是某种类型,但Java并不是因为它的有限类型系统.有没有办法告诉JVM"信任我"并跳过任何检查?

我意识到可能没有办法这样做,因为JVM通常是分布式的,用这个功能修改JVM是否合理?这件事已经完成了吗?

这是为JVM编译更强大的类型语言的挫折之一,它仍然受到Java限制的阻碍.

Sai*_*ali 3

原则上,如果没有携带证明代码(PCC) 基础设施,就无法以安全的方式完成此操作。PCC 允许您将安全推理嵌入到class文件中。您的嵌入式证明会在类加载时进行检查。如果证明中有缺陷,则不会加载该类。

如果 JVM 允许您在不需要正式证明的情况下放弃运行时检查,那么,正如 SecurityMatt 所说,它将破坏 Java 作为安全平台的最初理念。

JVM 使用一种特殊形式的 PCC 对方法中的局部变量进行类型检查。类加载机制使用所有局部变量类型信息来检查其正确性,但之后会被丢弃。但这是 JVM 中使用的 PCC 概念的唯一实例。据我所知,JVM 没有通用的 PCC 基础设施。

我曾经听说 JavaCard 平台存在一个支持 Java 的一小部分的平台。我不确定这是否对您的问题有帮助。