现网内存问题定位总结
前段时间,现网遇到一个很奇葩的问题,server会莫名其妙的重启。个人功力有限,这个问题搞了好久才找到问题原因,现在就把此类问题的基本定位方法梳理一下,也算是一个总结吧。
搞java(或其他JVM语言)的人都知道,jdk里自带了几个很牛逼的工具(jmap/jstack/jstat),是定位java问题的利器,首先要知道这几个工具的使用,然后结合linux的相关工具(top/ps/vmstat等),再通过gc日志和程序日志的分析,逐步找到问题产生的原因。
一. JDK相关
(1) Jstat
此命令可以指定很多参数,可以查看gc和内存使用信息。如-class可以显示加载class数量,-gc可以动态显示java堆各区情况、gc次数等,-gcutil可以动态显示堆各区使用情况、gc次数等,-gccapacity可以查看各个区大小分配情况,我一般使用gc比较多,因为它显示的信息更详细更全。
(2) Jstack
此命令可以打印当前各线程栈信息,相当于程序的一个快照,可以看到各个进程都在做什么,对定位问题非常有用。
(3) Jmap
此命令可以对java堆进行更详细的解剖,-heap可以看各区分配和使用情况,-histo可以看各个类型所占用空间,-dump可以将当前进程dump下来,使用jhat或者Mat进行分析,定位内存泄露等问题。
(4) Jvm参数
Jvm有很多种gc类型可以选择,还有很多个参数。hive是用户相应为先的