您的位置:首页 > 其它

记一次问题排查的过程-服务器内存问题

2017-11-21 21:35 666 查看

记一次问题排查服务器内存问题

背景

工作中突然发现服务器的内存使用率特别高,这是不正常的,带着疑问,想一探究竟,下面是排查的过程。

第一步

首先使用top命令,free -h命令查看内存使用情况和cpu使用的情况,发现有个应用内存使用率异常的高,如下图,根据内存占比,找到对应行的pid,使用下面的命令根据pid找到自己的应用

ps-ef|grep #pid#




第二步

既然已经拿到了我们可以dump堆的文件出来进行分析了,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用,谨慎使用

命令如下:

jmap -dump:format=b,file="/opt/snapshot/"$PID".hprof" $PID


第三步

使用java的内存分析工具memory analyzer(下载地址:https://www.eclipse.org/mat/)开始分析dump的文件,下图便是分析工具出的报告,通过报告可以看出,Google的缓存貌似有些问题,该对象内存已经占用了505M了,占虚拟机heap总量的76.88%,带着这些现象我们进行下一步



第四步

既然已经看到了具体的类有问题,那么下面开始定位代码。通过分析类中使用缓存的地方,发现缓存设置的时间过长,并且存的对象很大,长时间不回收,造成服务器内存压力很大,通过改变缓存策略(减少缓存时间,减少存入的对象数量,设置上限),问题便迎刃而解。

总结

服务器线上应用难免会出现各种问题,只要细心排查,耐心找原因,一步一步总会把问题的根源揪出来,通过这次的排查,发现缓存的使用方式不合适,这对自己以后正确合理使用缓存敲响警钟,能用分布式缓存就尽量不要采用类似guava,map这种本地缓存,当然真的有场景特别需要本地缓存,只要能忍受得了内存的消耗也可以。对于参数比较少且变化很少的接口建议使用cdn缓存,能够得到提高服务的响应速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: