[Java] HashMap 导致的高 CPU 使用率

Posted TonyYPZhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java] HashMap 导致的高 CPU 使用率相关的知识,希望对你有一定的参考价值。

 今天在生产环境遇到一个问题,Java 应用程序的 cpu 使用比例很高,导致整台机器的 cpu 使用率高达 90% ,正常情况下是 20% 左右。

把 Thread dump 导出来,利用 IBM Thread Analyzer for Java 工具进行分析。总共有60 多个在线线程,其中有 15 个线程都在执行同一个文件中的同一句代码,最顶层的调用是 HashMap.get() 。

HashMap 的底层数据结构是数组 + 链表进行存储,链表用于处理 hash 碰撞的情况。正常情况下链接是线性链表,当数据结构在并发情况下被污染了,导致出现环形链表,则会出现程序的无限循环。

15 个线程在同一时间都在执行同一行代码,是很不正常的情况。当线程调用 HashMap.get 并在链表上搜索时,碰巧遇到的是被污染的环形链接,就能解释得通这个异常情况了。

HashMap 是非线程安全,在多线程并发访问时,有可能出现环形链表。详细且清晰的分析,参考:

A Beautiful Race Condition

Explain the timing causing HashMap.put() to execute an infinite loop

 

附:关于 HashMap 源码阅读笔记

Map / HashMap - 源代码学习笔记

以上是关于[Java] HashMap 导致的高 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

Java HashMap

深入理解JAVA集合系列三:HashMap的死循环解读

深入理解JAVA集合系列三:HashMap的死循环解读

java并发容器和框架

2.Java集合-ConcurrentHashMap实现原理及源码分析

疫苗:Java HashMap的死循环