如果javac后运行如下程序:
class runhang {
public static void main(String[] args){
System.out.println("Test1");
double d = Double.parseDouble("2.2250738585072012e-308");
System.out.println("The value of D is: " + d);
}
}
就会发现程序hung了,并且某一核的CPU使用率接近100%, 查看相应的thread dump是这样:
"main" prio=10 tid=0x08058800 nid=0x8bf runnable [0xb7fce000..0xb7fcf1f8]
java.lang.Thread.State: RUNNABLE
at sun.misc.FloatingDecimal.countBits(FloatingDecimal.java:86)
at sun.misc.FloatingDecimal.doubleToBigInt(FloatingDecimal.java:205)
at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1463)
at java.lang.Double.parseDouble(Double.java:510)
at runhang.main(runhang.java:4)
如果编译如下程序,发现javac会hung住,CPU同样会有单核100%现象:
class compilehang {
public static void main(String[] args){
double d = 2.2250738585072012e-308;
System.out.println("Test: " + d);
}
}
相应的thread dump是:
"main" prio=10 tid=0x08058800 nid=0x91b runnable [0xb7fce000..0xb7fcf1f8]
java.lang.Thread.State: RUNNABLE
at sun.misc.FloatingDecimal.doubleToBigInt(FloatingDecimal.java:201)
at sun.misc.FloatingDecimal.doubleValue(FloatingDecimal.java:1463)
at java.lang.Double.valueOf(Double.java:475)
at com.sun.tools.javac.parser.Parser.literal(Parser.java:526)
at com.sun.tools.javac.parser.Parser.term3(Parser.java:952)
at com.sun.tools.javac.parser.Parser.term2(Parser.java:686)
at com.sun.tools.javac.parser.Parser.term1(Parser.java:657)
at com.sun.tools.javac.parser.Parser.term(Parser.java:613)
at com.sun.tools.javac.parser.Parser.term(Parser.java:595)
at com.sun.tools.javac.parser.Parser.expression(Parser.java:585)
at com.sun.tools.javac.parser.Parser.variableInitializer(Parser.java:1446)
at com.sun.tools.javac.parser.Parser.variableDeclaratorRest(Parser.java:2074)
at com.sun.tools.javac.parser.Parser.variableDeclaratorsRest(Parser.java:2045)
at com.sun.tools.javac.parser.Parser.variableDeclarators(Parser.java:2028)
at com.sun.tools.javac.parser.Parser.blockStatements(Parser.java:1557)
at com.sun.tools.javac.parser.Parser.block(Parser.java:1462)
at com.sun.tools.javac.parser.Parser.block(Parser.java:1476)
at com.sun.tools.javac.parser.Parser.methodDeclaratorRest(Parser.java:2532)
at com.sun.tools.javac.parser.Parser.classOrInterfaceBodyDeclaration(Parser.java:2481)
at com.sun.tools.javac.parser.Parser.classOrInterfaceBody(Parser.java:2408)
at com.sun.tools.javac.parser.Parser.classDeclaration(Parser.java:2253)
at com.sun.tools.javac.parser.Parser.classOrInterfaceOrEnumDeclaration(Parser.java:2191)
at com.sun.tools.javac.parser.Parser.typeDeclaration(Parser.java:2180)
at com.sun.tools.javac.parser.Parser.compilationUnit(Parser.java:2126)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:509)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)
at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:801)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
at com.sun.tools.javac.main.Main.compile(Main.java:353)
at com.sun.tools.javac.main.Main.compile(Main.java:279)
at com.sun.tools.javac.main.Main.compile(Main.java:270)
at com.sun.tools.javac.Main.compile(Main.java:69)
at com.sun.tools.javac.Main.main(Main.java:54)
呵呵,有意思吧,当然这么严重的BUG,Oracle自然得运用FPU。
至于BUG内幕,大家可以参考http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/