java培训吧 关注:116,350贴子:396,576
  • 7回复贴,共1

JVM抛出一个奇怪的StackOverflow异常

只看楼主收藏回复

hashCode()方法直接堆栈溢出,会是什么原因引起的?
注: 异常是在获取一个Map结果之后,toString()时抛出。
java.lang.StackOverflowError
at java.util.Date.getTimeImpl(Date.java:889)
at java.util.Date.getTime(Date.java:885)
at java.sql.Timestamp.getTime(Timestamp.java:146)
at java.util.Date.hashCode(Date.java:994)
at java.sql.Timestamp.hashCode(Timestamp.java:529)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
… 显示全部


1楼2015-09-30 08:49回复
    一点也不奇怪。在Oracle JDK8 / OpenJDK 8的实现里,只要把一个HashMap作为key或value加到它自己里面就可以造出题主给的stack trace。


    2楼2015-09-30 09:04
    回复
      一点也不奇怪。在Oracle JDK8 / OpenJDK 8的实现里,只要把一个HashMap作为key或value加到它自己里面就可以造出题主给的stack trace。
      看我刚做的例子:https://gist.github.com/rednaxelafx/930f8979473185cfc0a0


      3楼2015-09-30 10:27
      回复
        顺带:刚去OpenJDK的core-libs-dev邮件列表报了这个行为,看大家怎么看:StackOverflowError on HashMap.hashCode() due to self reference


        4楼2015-09-30 11:20
        回复
          StackOverflowError on HashMap.hashCode() due to self reference
          请问这个是什么意思?


          5楼2015-09-30 11:40
          回复
            解释”这个概念在这里已经有点模糊了,理解它的过程就行了,不必下一个“精确”的定义;
            而我自己仍然赞成“java是编译型语言”的说法,因为“编译”其本质就是“把一个相对高级的语言转换为另一个相对低级的语言”,而由java -> class文件的编译已经满足了这个特征; 而后面你要说jvm是“解释执行”的,那其实硬件对于机器码又何尝不是“解释执行”呢?


            10楼2015-09-30 15:47
            回复
              当你学习编程已经到了某一程度,并且依然热爱编程,你会发现,现在有动力去学那以前觉得枯燥无味的英语和数学了。


              11楼2015-09-30 16:30
              回复