JVM CPU高问题排查

好好地码代码呢,突然接到线上的告警,说是CPU飙高。然后就稀里哗啦的连上线上的服务器,使用top命令查看了一下CPU情况,发现我们的服务CPU占到600%。然后就开始定位CPU占用高的线程。主要有以下几步:

查询出问题的服务进程id  : ps -ef | grep mrf-center | grep -v grep
查询该进程内最耗费CPU的线程  top -Hp pid
转换线程id为16进制  printf "%x\n" 21742
查找特定线程的信息  jstack 21711 | grep 54ee

具体的定位过程可以参考大神你假笨的文章如何定位消耗CPU最多的线程
最后定位出这样一个线程

好了,问题来了,CPU占用过高不是因为业务代码中有CPU密集型任务或者是死循环造成的,而是因为GC太频繁导致的。好,那就验证一下吧。

那gc情况来看可以看出以下几个问题

  • 老年代和年轻代快占满了
  • 频繁Full GC,但是回收效果不好
  • 两个Survivor区有时候都是空的

由此可以猜想频繁Full GC是因为老年代快占满了,而老年代慢了不是因为eden区中的对象因为年龄到了可以晋升为老年代的年龄,而是因为Eden区中有大对象,导致在进行minor gc后,无法回收的对象过大导致没法放进Survivor区,从而只能放进老年代。

所以用一句总结就是,大对象很可怕,朝生夕死的大对象更可怕

那接下来就需要验证自己的猜想,使用jmap命令来dump出jvm的内存

jmap -dump:format=b,file=mm2.dump pid

注意,jmap命令会导致jvm停滞,线上慎用。

下面就是使用工具来分析一下堆内存文件了,推荐使用MAT工具(eclipse 插件)。不过我不太推荐在eclipse中安装这个插件,因为在分析堆内存的时候比较耗费内存,而eclipse又是比较耗费内存的,所以我推荐使用stand-alone的mat工具,可以在此下载

但是,不幸的是你可能打不开这个工具,并且报下面这个错误

Java was started but returned exit code=13 

这个问题可以参照下面这个来解决Java was started but returned exit code=13

还有就是,一般堆内存文件都比较大,比较耗费内存。所以为了加载得比较快的话,可以调整一下文件
MemoryAnalyzer.ini中的最大堆内存 。比如我就调整为2G了。-Xmx2048m

好了,完事具备,只欠分析堆内存了。
查看histogram图,然后按照retained heap 排序,可以看到这个PageData占用了将近600M的内存。

为什么就看PageData类型的对象呢,因为这个对象是我们系统中定义的对象,所以优先看

再看一下支配树


好了,发现是因为PageData中的List中装了非常多的HashMap对象。由此可见是因为从数据库中查询了过多的对象导致的。

这样就大概知道了是因为代码中有一个不合理的查询。下面即使定位是哪一个查询了。

其实在看到支配树的数据的时候也大概能知道是哪一个表中的数据了,再结合一下查询就大概知道了。

不过我是从线程栈中看到的(可以通过使用jstack命令来dump出线程栈)

好了,至此就定位出问题了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,015评论 11 349
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,413评论 3 83
  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 1,331评论 1 0
  • Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频...
    Rick617阅读 7,222评论 1 9
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,580评论 0 7