我遇到了一个有趣的情况。同事提交了一些更改,这些更改无法在我的计算机上从IDE(Eclipse)或命令行(Maven)进行编译。在编译过程中出现的问题表现在100%CPU并且只杀死进程将有助于阻止它。经过一些分析后,找到并解决了问题的原因。事实证明,其中一个接口是“双d = 2.2250738585072012e-308”(最后没有分号)。以下剪辑重复了它。
public class WeirdCompilationIssue {
double d = 2.2250738585072012e-308
}
为什么编译器会挂起?语言边缘情况?
答案 0 :(得分:16)
这是JVM的String-to-double转换算法中的一个错误:http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
如果尝试在运行时解析该字符串,则可以获得相同的挂起。编译器挂起,因为它使用相同的代码(毕竟它是一个Java程序)。
更新:此问题现在有一个CVE标识符(CVE-2010-4476)和a patch(对于Oracle JVM,也适用于OpenJDK)。
根据the patch,这一切归结为一个错误。
答案 1 :(得分:5)
这是一个众所周知的问题,几天后就出现在新闻中。更多信息here。
答案 2 :(得分:3)
这是一个开放的bug超过10年。坏太阳。
Java系统没有受到大规模攻击和死亡的事实证明,地球上真的很少有顽皮的人。
答案 3 :(得分:1)
Oracle发布了一个热门修复程序,可以在这里找到:
http://www.oracle.com/technetwork/java/javase/fpupdater-tool-readme-305936.html
此修补程序适用于java 1.4,1.5和1.6。