[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 - 源代码学习笔记

时间: 2024-10-24 13:00:02

[Java] HashMap 导致的高 CPU 使用率的相关文章

嵌入式 如何定位死循环或高CPU使用率(linux)

如何定位死循环或高CPU使用率(linux) 确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx 得到如下结果,其中线程2909使用了7.8%的CPU. 2907 2913 0.0 ./xxx 2907 2909 7.8 ./xxx 也可以通过查看/proc中的信息来确定高CPU线程. 打印了4列,线程ID,线程名,用户时间和内核时间

制造高CPU使用率的简单方法

原文:制造高CPU使用率的简单方法 在群里有人问制造CPU占用率高的场景用来做测试.所谓做好事难,干“坏”事还不容易?这个需求有很多方法可以实现,比如使用一些压力测试工具.我首先想 到的是HASH JOIN.这个联接比较消耗CPU资源,拿两大表HASH JOIN一下,最好是包含大字段的,开多几个进程,CPU使用率马上飙升到80-90%! 下面就使用一张系统视图进行HASH JOIN来实现,简单快捷. DECLARE @i BIGINT WHILE (1=1) BEGIN SELECT @i =

【转载】php-fpm的高CPU使用率排查方法

1.CPU使用率监控 sar -P ALL 1 100 输出结果如下:CPU %user %nice %system %iowait %steal %idleall 85.54 0.00 5.69 0.00 0.00 8.76 0 74.75 0.00 25.25 0.00 0.00 0.00 1 98.00 0.00 2.00 0.00 0.00 0.00 2 89.22 0.00 3.92 0.00 0.00 6.86 3 91.00 0.00 2.00 0.00 0.00 7.00 4 7

通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码

http://heylinux.com/archives/1085.html通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码 首先,要感谢我的好朋友 钊花 的经验分享. 相信大家在实际的工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况. 通常这种情况发生时,我们会认为这些问题理所当然的该由开发人员自己去解决,因为操作系统环境是没有任何问题的. 但实际上,我们是可以帮助他们的,效果好的话还可以定位到具体出问题的代码行数,思路如下: 1.通过对CPU与内存的

Linux性能优化从入门到实战:04 CPU篇:CPU使用率

??CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st K

.Net 调式案例—实验4 高CPU(High CPU)回顾

原文地址:http://blog.csdn.net/directionofear/article/details/8033506 如果Web应用程序经常遇到的问题按频率排名的话,我觉得 第一名unhandled exception 第二名high memory 第三名high cpu 这篇文章介绍web应用程序中cpu使用率过高问题相应的数据收集方式和调试问题的方法. 对ASP.NET Web应用程序CPU使用率过高的问题,从宏观上分分类,大概就这么几种情况, 大量请求 过多循环 GC频繁 数据

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 1.jps 获取Java进程的PID. 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈. 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高. 4.echo "obase=16; PID" | bc 将线程的PID转换为16进制. 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID.找到对应的线程栈. 6.分析负载高

一个查询交易导致数据库CPU使用率高的问题

这一阵子在做一个查询交易的压力测试,使用的AIX+informix数据库.应用和数据库分别部署在两台机器上.使用loadrunner进行并发测试.相关表的历史数据是20W级别的.使用20个并发进行测试. 测试过程中,应用服务器负载正常,数据库服务器磁盘.网络使用率正常,但是CPU使用率却是98%左右.觉得很奇怪,因为这台机器是测试环境中性能最好的,表现不应该如此.于是先猜测会不会是informix的参数配置不对,于是搜了些informix参数中影响CPU使用率的参数调了一遍,但是现象依旧.对里面

Oracle查询语句导致CPU使用率过高问题处理

解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项卡中查看占用CPU较高的线程号(TID). 2.在PL/SQL工具中执行以下SQL语句: --根据sql_id获取对应的Sql语句(sql_text,sql_fulltext)select * from v$sqlarea where sql_id in ( --根据addr获取sql_id sel