排查java应用linux环境内存占用过高的问题

一、问题场景

在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况。当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器负载15左右。进入应用的实时日志,发现日志每打印四五秒后,会暂停一分多钟。这代表着由于内存耗尽,导致cpu高负载,最终导致应用程序不能正常运行,断断续续。严重影响生产环境的运行速率。

二、解决方案

1、线上救急的临时方案:

(1)让运营停止审核,即停止继续往堵塞应用中送数据。

内存队列中的数据让它慢慢下放,经过几个小时的下放后,断断续续由每次四五秒到十几秒最终到几十秒,当内存队列中的数据全部清空后,断断续续仍然存在,但是要好了很多,基本是正常半分钟,暂停半分钟。这时候内存占用仍然没有明显的下降。

(2)重启服务,内存当即释放掉,所有问题得到了临时解决。
(3)将应用的Xmx由16G调高到52G,服务器是64G内存的。
(4)时刻关注这台服务器的内存cpu占用,每晚凌晨重启。

2、解决根本问题,有参考 https://www.javazhiyin.com/34154.html

(1)输入命令:top -c,查看占用内存过高的进程信息
(2)输入命令:jmap -histo:live PID > xxx.log,vim查看内存中的存活对象统计,找出业务相关的类名
(3)如果第(2)步仍然不能定位到代码中的具体对象,输入命令:jmap -dump:live,format=b,file=xxx.hprof PID

这个命令会将内存里的所有信息都输出,生成hprof文件。我16G的内存占用,输出的文件大小为1.6G。注意:这个命令会导致应用暂时挂起,所以谨慎使用。我的应用当时挂起了约10s。

(4)文件大小不是很大的话,使用jdk自带的jhat命令即可,输入命令:jhat -J-mx2G -port 7170,该命令可以查看内存占用的对象
(5)如果文件太大,可以下载到本地使用jdk自带的 jvisualvm 工具进行分析。下面详细讲怎么使用jvisualvm定位内存占用问题。

二、使用jvisualvm定位内存占用问题

1、jvisualvm.exe的文件路径在java安装路径的bin目录下

我的是 C:\Program Files\Java\jdk1.8.0_60\bin

2、打开储存堆信息的 hprof 文件

(1)注意图中 文件类型 选择【堆 Dump(。hprof,.*)】,否则hprof文件不会显示

image.png

(2)设置jvisualVM的启动堆内存

在使用 jvisualVM 的时候,加载1.6G的 hprof 文件,提示内存不足,然后中断。原来 jvisualVM 也需要设置java堆内存,于是修改Java_home/lib/visualvm/etc/visualvm.conf 文件中 visualvm_default_options="-J-client -J-Xms24 -J-Xmx256m",把256调大,本案例中设置成了1024m,然后重启jvisualVM即可


image.png

3、如果有内存泄漏,概要界面会显示它的线程,

本案例中不存在内存泄漏问题


image.png

4、进入界面具体分析

(1)如图,点击【类】,可以看到占用 内存较多的对象。

如果有应用代码中的对象,那么就破案了。此案例中 TbKeywordBan占用较高,但是应该不是主因。


image.png
(2)我们分别双击点开占用内存很多的 HashMap$Node、AtomicInteger、Long。观察引用他们的父级对象。

多点开几个进行观察,都发现了 ExpiryMap 这个类,到此处,就已经破案了。


image.png

5、找到业务代码中的 ExpiryMap.java,分析它的内存占用情况,进行java代码层面的调优工作。

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