首页 > 代码库 > [Java] HashMap 导致的高 CPU 使用率
[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 使用率
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。