`
langzi_xl
  • 浏览: 22457 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

NB的2.2250738585072012e-308

    博客分类:
  • Java
阅读更多

如果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/

0
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics