码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-11-08 07:49:29      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:机器   ons   阅读   异常   线性   dump   for   导出   ibm   

 今天在生产环境遇到一个问题,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 使用率

标签:机器   ons   阅读   异常   线性   dump   for   导出   ibm   

原文地址:http://www.cnblogs.com/TonyYPZhang/p/6041312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!