探究JDK7 HashMap并发扩容的原因及导致CPU100%
发布时间
阅读量:
阅读量
问题
当单线程运行时使用HashMap不会出现问题。随着代码优化后增加了多线程处理,在某一特定时间出现后CPU一直占用100%。通过检查堆栈信息令人意外地发现所有线程均卡死在hashMap.get()方法调用中。服务重启之后问题消失,在过段时间可能又复现了。
原因分析
在了解来龙去脉之前,我们先看看HashMap的数据结构。
在内部实现中, HashMap通过一个Entry数组来存储键值对.每当需要添加一对键值时,系统会运用哈希算法计算出对应的索引.具体而言,算法通过计算键的哈希码并对数组长度执行模运算 hash & (length-1) 来确定插入的位置.如果该索引位置已有键值存在,则表明发生了碰撞(哈希冲突),从而形成链表结构.
如果发生哈希冲突,则最糟糕的情况下会导致所有元素都被分配到同一个位置,并最终形成一个较长的链表结构。在这种情况下获取一个值时(即调用get方法),算法需要遍历整个链表才能找到目标数据项(即目标节点),从而导致时间复杂度达到O(n))。因此,在设计HashMap时需要注意选择合适的哈希算法以及合理设置初始容量参数等关键因素以保证系统的性能。”
在向容器中插入新节点的过程中,在该键不在现有映射中时(即该键尚未被预先定义),系统将执行以下操作:首先检查当前数据结构的负载水平是否已接近最大容量(预设比例为数组大小的75%)。如果负载
全部评论 (0)
还没有任何评论哟~
