踩坑!JDK8中HashMap依然会死循环
★★★建议星标我们★★★
文章插图
文章插图
2020年Java原创面试题库连载中
【000期】Java最全面试题库思维导图
【020期】JavaSE系列面试题汇总(共18篇)
【028期】JavaWeb系列面试题汇总(共10篇)
【042期】JavaEE系列面试题汇总(共13篇)
【049期】数据库系列面试题汇总(共6篇)
【053期】中间件系列面试题汇总(共3篇)
【065期】数据结构与算法面试题汇总(共11篇)
【076期】分布式面试题汇总(共10篇)
【077期】综合面试题系列(一)
【078期】综合面试题系列(二)
【079期】综合面试题系列(三)
【080期】综合面试题系列(四)
【081期】综合面试题系列(五)
【082期】综合面试题系列(六)
【083期】综合面试题系列(七)
【084期】综合面试题系列(八)
【085期】综合面试题系列(九)
【086期】综合面试题系列(十)
【087期】综合面试题系列(十一)
【088期】综合面试题系列(十二)
【089期】综合面试题系列(十三)
更多内容 , 点击上面蓝字查看
文章插图
作者:Aaron_涛
blog.csdn.net/qq_33330687/article/details/101479385
是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题 , 虽然HashMap依然说线程不安全 , 但是不会造成服务器load飙升的问题 。
然而事实并非如此 。 少年可曾了解一种红黑树成环的场景 , =v=
【踩坑!JDK8中HashMap依然会死循环】今日在查看监控时候发现 , 某一台机器load飙升
文章插图
感觉问题不对劲 , ssh大法登陆机器 , top , top -Hp,jstack , jmap四连击保存下来堆栈 , cpu使用最高的线程 , 内存信息准备分析 。
首先查看使用最耗费cpu的线程堆栈信息
cat stack | grep -i 34670 -C10 --color
文章插图
我勒个去 , HashMap , 猜测八成死循环了 , 但是我们使用的JDK8 , 在8中通过栈封闭的链表替换 , 解决了扩容死循环的问题 。 疑惑 , 继续往下看 。
根据堆栈信息 , root方法是问题所在 , 点开HashMap源码
文章插图
好嘛 , load飙高 , 代码有个for语句 , 我觉得铁定死循环了 , 看代码情况只可能是两个红黑树节点的父亲节点相互引用才可以导致无法走出这个for语句 。
然而这都是我的猜测 , 我没有证据 。 而且让我追红黑树的代码 , 也是需要耗费大量时间的事情 , 我需要快速验证我的猜测 。
我之前dump下来了堆内存信息 , 我通过jhat 命令生成html的内存信息页面
文章插图
然后输入http://localhost:7000查看
我先找业务代码中持有这个HashMap的对象 , 然后点进去查询内部信息
文章插图
文章插图