1. 使用top命令查看机器的各个信息
可能出现的情况说明:
1) 虚拟内存占满,CPU占满,——jvm正在做垃圾回收
2)CPU占满——可能有死循环或者死锁
3)内存占满——发生内存泄露
2. 查看进程号
3. 打印出进程的堆栈信息(jstackPID >stack.log)
4. 打印堆信息 (jmap –histo:livePID)
注意:这个jmap使用的时候jvm是处在假死状态的,只能在服务瘫痪的时候为了解决问题来使用,否则会造成服务中断。
num:排序
#instance:实例个数
#bytes:占用字节数
class name 类名称
从上图中可以看出,该进程char 有9762815个,占用了393222592字节,其中String类型的对象有9762373个,而String的底层是由char数组来存储的
String包括一个对象头占8个字节——UID long
一个char数组占16个字节——value[] char
一个char数组的引用占4个字节——hash int
内容[]
5. 如果是GC说明他还在进程里面,查看进程信息,因为是数据库转成java String,所以直接查找getString 找到线程的信息然后逐个排查。
6. 根据报错信息发现是数据库中的某个sql语句查询出大量的数据放入内存中,导致不停的进行GC,程序卡死。