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

时间:2012-11-07 15:14:42

标签: performance jvm

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

原则上,如果没有proof-carrying code(PCC)基础设施,就不能以安全的方式完成。 PCC允许您在class文件中嵌入您的安全推理。在课程加载时检查您的嵌入式校样。如果证明中存在缺陷,则不加载该类。

如果JVM曾经允许你在不需要正式证据的情况下放弃运行时检查,那么,正如SecurityMatt所说的那样,它会破坏Java作为安全平台的原始哲学。

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

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

答案 1 :(得分:2)

Java的一个关键特性是它不需要“信任”开发人员来进行边界检查。这消除了“缓冲区溢出”安全漏洞,这些漏洞可能导致攻击者能够在您的应用程序中执行任意代码。

通过允许开发人员关闭边界检查的能力,Java将丢失其关键特性之一 - 无论Java开发人员有多么错误,他/她的代码中都不会有任何可利用的缓冲区溢出。 / p>

如果您想使用程序员可信赖的语言来管理他们自己的边界检查,我可以建议使用C ++。这使您能够分配没有自动边界检查的数组(new int []),并使用内置边界检查(std :: vector)分配数组。

此外,我强烈建议在指责边界检查应用程序中的速度损失之前,执行一些 BENCHMARKING 以确定代码中是否存在可能导致瓶颈的其他位置。< / p>

对于编译器目标,您可能会发现像MSIL这样的字节码语言比Java字节码更适合您的需求。 MSIL是强类型的,并且没有您在Java中发现的许多低效率。