标签:机器 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 是非线程安全,在多线程并发访问时,出现环形链表的介绍参考:
Explain the timing causing HashMap.put() to execute an infinite loop
附:关于 HashMap 源码阅读笔记
标签:机器 ons 阅读 异常 线性 dump for 导出 ibm
原文地址:http://www.cnblogs.com/TonyYPZhang/p/6041312.html