OOM线上排查

1,线上故障及修复

线上其中一台服务器于2018-07-10中午12点左右发生了宕机,经排查原因是内存溢出了,之前的服务器配置是1C2G的,紧急进行了配置升级,然后优化了一些JVM的参数。

2,故障排查

JVM发生宕机时会在我们项目的日志路径下生成错误日志文件:jvm_err.log。对其进行分析查找具体的宕机原因。该文件大概包含几部分:日志头文件、导致crash的线程信息、所有线程信息、安全点和锁信息、堆信息、本地代码缓存、编译事件、gc相关记录、jvm内存映射、jvm启动参数、服务器信息

日志头大概说明了宕机的原因

继续查看导致crash的线程信息可以具体的看到哪一块代码有问题:

针对可能造成内存溢出的两个原因具体的分析:

1,查看JVM宕机的堆信息和GC信息

GC信息

看日志分析:JVM总用内存1.2G左右,参看JVM的配置-Xmx1024M -Xms2048M,当JVM想操作系统申请更多的内存来运行的时候,操作系统已经没有更多可用的内存了。

3,JVM参数优化

首先分享一个很好用的网站,一只懂JVM的小狐狸。可以帮我们查询参数、自动生成参数、优化参数等等:http://xxfox.perfma.com/jvm/generate

升级服务后JVM参数如下:

-Xmx4096M -Xms4096M -Xloggc:/home/work/www/promise-sell/var/log/gc.log -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/work/www/promise-sell/var/log -XX:ErrorFile=/home/work/www/promise-sell/var/log/jvm_err.log -XX:ConcGCThreads=1 -XX:ParallelGCThreads=1 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=50M -verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:MaxMetaspaceSize=512M -Djava.rmi.server.hostname={HOSTNAME} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1099

除了重新配置了堆、栈的大小,我们还使用了最新的G1收集器取代了CMS收集器,并配置了可控的回收时间限制。关于G1收集器,有兴趣的小伙儿伴儿自己去了解下吧

4,JVM监控

虽然服务器配置升级后问题得到了解决,但是对于JVM的监控我们做的还远远不够,所以我们需要一些对JVM运行的一个整体的监控,这里我们用了JDK自带的visualvm,在C:\Program Files\Java\jdk1.8.0_161\bin 双击打开jvisualvm.exe即可

1,左侧菜单栏选择【远程】右键选择添加远程主机,这里我们用包卖收车服务器:promise-sell00举例(使用hostname访问需要配置本地host:如172.20.31.208 promise-sell00)

2,右键【promise-sell00】选择添加JMX链接,输入端口号1099,点击确定即可

3,成功后即可看到如下界面

4,VisualGC页面(需要在工具-插件安装VisualGC插件才能看到这个页面)

5,如果你的VisualGC页面显示不受此JVM支持,进行如下的操作:

a)在服务器目录/usr/local/jdk1.8.0_74/bin 下新增文件:jstatd.all.policy

grant codebase “file:/usr/local/jdk1.8.0_74/lib/tools.jar” {
permission java.security.AllPermission;
};

b)当前路径下启动命令:./jstatd -J-Djava.rmi.server.hostname=本机IP -J-Djava.security.policy=jstatd.all.policy -p 2099

c)左侧菜单栏:【172.20.31.298】右键选择【添加jstatd链接】,端口号改成2099

d)再次查看VisualGC即可,如果还是不行,重启一下

6,对转储文件进行分析

7,更多功能需要小伙伴儿多多挖掘啦