JDK8中HashMap会死循环的原因

介绍

今天就跟大家聊聊有关JDK8中HashMap会死循环的原因,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

首先查看使用最耗费cpu的线程堆栈信息

cat stack | grep -i 34670 -C10 --color

JDK8中HashMap会死循环的原因

我勒个去,HashMap,猜测八成死循环了,但是我们使用的JDK8,在8中通过栈封闭的链表替换,解决了扩容死循环的问题。疑惑,继续往下看。

根据堆栈信息,root方法是问题所在,点开HashMap源码

JDK8中HashMap会死循环的原因

好嘛,load飙高,代码有个for语句,我觉得铁定死循环了,看代码情况只可能是两个红黑树节点的父亲节点相互引用才可以导致无法走出这个for语句。

然而这都是我的猜测,我没有证据。而且让我追红黑树的代码,也是需要耗费大量时间的事情,我需要快速验证我的猜测。

我之前dump下来了堆内存信息,我通过jhat 命令生成html的内存信息页面

JDK8中HashMap会死循环的原因

然后输入http://localhost:7000查看

我先找业务代码中持有这个HashMap的对象,然后点进去查询内部信息

JDK8中HashMap会死循环的原因

因为数据都放在table中,点击Table字段,查看其内容

JDK8中HashMap会死循环的原因

table中存在唯一的一个TreeNode节点,这肯定是已经变成了红黑树了

点进去查看

JDK8中HashMap会死循环的原因

点击parent字段信息

JDK8中HashMap会死循环的原因

0x72745d828与0x72745d7b8两个TreeNode节点的Parent引用都是对方

后续打算深入研究一下红黑树什么场景会造成这个原因。

看完上述内容,你们对JDK8中HashMap会死循环的原因有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

JDK8中HashMap会死循环的原因