欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-07 19:46:37
...

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

背景

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

第一步

首先使用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缓存,能够得到提高服务的响应速度。

相关标签: 服务器 内存