hashMap的get()方法,错用并发造成cpu和负载高

一次线上问题的解决

线上发现服务cpu使用达到98%,负载高达200多,64核心cpu,下面介绍解决过程:

1.top命令查出占用cpu高的进程pid

2.使用jstack -l pid >dump.txt 获取dump文件

3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制

4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题

=====================================================

1.使用top命令

2.jstack -l pid >dump.txt 获取dump文件

3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制  ,10587转换成十六进制后为295B,转换成小写为295b

4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题

cat dump.txt | grep -10 295b

发现问题在hashMap的get方法,count发现有200多个的runnable状态在调用hashMap的get方法,经过查找ServiceBuilder的第592行发现在一个公共静态方法中使用了一个类全局变量的HashMap作为 共享变量被并发使用,第592行是get方法,经过查找发现在1.7的get方法中有e.next();方法造成cpu无限循环。于是把HashMap改成了ConcurrentHashMap.问题应该解决了,待上线验证。(注该问题不一定会100%发生)

另见(关于hashMap的循环bug):http://ifeve.com/hashmap-infinite-loop/

时间: 2024-10-23 14:57:12

hashMap的get()方法,错用并发造成cpu和负载高的相关文章

网站访问慢,服务器负载高-系列查找问题方法

如果以后出现报警各网站无法ping通,或者服务器负载过高,可通过以下几条途径查找原因: 1,查看访问日志,查看是否有访问异常,如有,过滤IP,进行IP封装 cat access.log | awk '{print $1}' | sort | uniq –c | sort –n >/tmp/ip.txt netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort –n 2,查看网卡是否有严重丢包现象,ifconfig查

大型技术网站的技术( 高并发、大数据、高可用、分布式....)(一)

面对高并发.大流量.高可用.海量数据.用户分布广泛.网络情况复杂这类网站系统我们如何应对??? 第一阶段   一台服务器不行就上多台服务器    1.应用程序与数据服务分离        将应用程序.数据库.文件等资源放在一台服务器上,面对海量用户的访问只可能是崩崩崩的挂掉. so? 我们知道的是应用服务器.数据库服务器.文件服务器这三块对服务器的要求是不同的,应用服务器就需要大大的CPU来处理复杂的业务逻辑,数据库服务器需要快速磁盘检索      和 数据缓存也就是要大内存,而文件服务器要求的

Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_view); myview = ViewUtils.find(this, R.id.myview); getViewSize("onCr

win8系统电脑出现CPU使用频率过高的修复方法分享

我们在电脑的使用中,如果是面对电脑的小伙伴都我们在电脑的使用中如果CPU的使用中出现了使用频率过高的话我们的电脑会不会运行就会变慢呢,今天看到有小伙伴在问,我们的win8系统电脑出现CPU的使用频率过高怎么解决呢,今天小编就来跟大家分享一下win8系统电脑出现CPU使用频率过高的修复方法分享. 具体的方法和详细的步骤如下: 1.从任务管理器中我们可以发现,打开家庭组功能后后,硬盘会一直保持读写状态,我们将其关闭,首先右键点左下角图标打开菜单,选择"控制面板",在"查看方式&q

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

hashmap的put方法详解

今天面试到map的put方法,参考https://blog.csdn.net/weixin_38480293/article/details/79405352 HashMap 首先呢 它是一个集合类,非线程安全,key.value(键值)对存储格式.常见的api有put,get,size,remove等方法 在此呢介绍一下jdk1.8中的hashmap.put方法, 我们在使用put方法的时候会传进key和value参数 在我们将这两个参数传入后, 第一步,我们的put方法会去判断这个hashm

HashMap及hashcode()方法的简单介绍

当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了:如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的ha

HashMap的resezi方法中尾部遍历出现死循环问题 Tail Traversing (多线程)

一.背景介绍: 在看HashMap源码是看到了resize()的源代码,当时发现在将old链表中引用数据复制到新的链表中时,发现复制过程中时,源码是进行了反序,此时是允许反序存储的,同时这样设计的效率要高,不用采用尾部插入,每次都要遍历到尾部. 下面对该原理进行总结: JDK1.7的HashMap在实现resize()时,新table[]的列表采用LIFO方式,即队头插入.这样做的目的是:避免尾部遍历.尾部遍历是为了避免在新列表插入数据时,遍历队尾的位置.因为,直接插入的效率更高. 直接采用队头

java中HashMap的基本方法使用

遍历,添加词,等等 package test; import java.util.HashMap; import java.util.Iterator; import java.util.ArrayList; import java.util.Collection; import java.util.Map.Entry; import java.util.Set; public class test6 { public static void main(String[] args) { Hash