前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >踩坑了,JDK8中HashMap依然会产生死循环问题!

踩坑了,JDK8中HashMap依然会产生死循环问题!

作者头像
全栈程序员站长
发布2021-06-25 09:44:46
6280
发布2021-06-25 09:44:46
举报
文章被收录于专栏:全栈程序员必看

作者:Aaron_涛

blog.csdn.net/qq_33330687/article/details/101479385

是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题。

然而事实并非如此。少年可曾了解一种红黑树成环的场景,=v=

今日在查看监控时候发现,某一台机器load飙升

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

感觉问题不对劲,ssh大法登陆机器,top,top -Hp,jstack,jmap四连击保存下来堆栈,cpu使用最高的线程,内存信息准备分析。

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

代码语言:javascript
复制
cat stack | grep -i 34670 -C10 --color
踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

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

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

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

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

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

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

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

点进去查看

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

点击parent字段信息

踩坑了,JDK8中HashMap依然会产生死循环问题!
踩坑了,JDK8中HashMap依然会产生死循环问题!

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

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

原文始发于微信公众号(全栈程序员社区):踩坑了,JDK8中HashMap依然会产生死循环问题!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/103563.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档