top:查看CPU负载
free :查看内存使用情况
total used free shared buffers cached
Mem: 3859356 3697132 162224 12 107688 1724812
-/+ buffers/cache: 1864632 1994724
Swap: 4194300 79932 4114368
df:查看磁盘使用情况
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 3997376 778440 3009224 21% /
tmpfs 4026828 0 4026828 0% /dev/shm
/dev/vda2 3997376 24544 3763120 1% /home
/dev/vda5 24637820 19741428 3638204 85% /usr
/dev/vda3 3997376 232628 3555036 7% /var
排除磁盘情况后,如果CPU负载特别高: Java 进程,并不做大量 CPU 运算,正常情况下,CPU 应该在 100~200% 之间,出现这种 CPU 飙升的情况,要么走到了死循环,要么就是在做大量的 GC
使用 jstat -gc pid [interval] 命令查看了 java 进程的 GC 状态:
jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
GC非常频繁的情况下应该是内存泄漏:
使用 jstack pid > jstack.log 保存线程栈;
使用 jmap -dump:format=b,file=heap.hprof pid 保存堆现场;
提示:堆文件导出比较大,并且默认是二进制数据,可以使用JDK自带工具例如:(jvisualvm)进行分析
补充:获取JVM的dmp文件有两中方式:
1. JVM启动时增加两个参数,出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
生成堆文件地址:
-XX:HeapDumpPath=/home/test/jvmlogs/
2. 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件
jmap -dump:live,format=b,file=/opt/soft/heap.hprof pid
第一种方式在JVM出现内存溢出是自动生成堆文件,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响,所以推荐使用第一种方式;
以上步骤均为帮助快速排查问题,定位问题的方式,具体解决问题仍需要分析具体代码