1.现象
线上后台任务的java进程处于假死状态
2.排查过程
1.查看假死的进程ID
ps -ef | grep sku
2.将该进程的所有线程信息打印输出至指定文件
jstack -F 8843 >> jstack-8843.log
3.查看该日志文件前500行的信息
head -n 500 jstack-8843.log
No deadlocks found,代表没有发现死锁,所有的线程都处于BLOCKED状态
4.查看GC的情况,每隔2s打印一次,一共打印20次
jstat -gc 8843 2000 20
发现gc的次数在疯狂增长,其次在该进程业务日志中发现java.lang.OutOfMemoryError: GC overhead limit exceeded
GC overhead limt exceed检查是Hotspot VM 1.6定义的一个策略,通过统计GC时间来预测是否要OOM了,提前抛出异常,防止OOM发生。Sun 官方对此的定义是:“并行/并发回收器在GC回收时间过长时会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。用来避免内存过小造成应用不能正常工作。“
3.结论
基本可以判断为程序的内存设置过小,导致频繁GC,引起假死,调整 -Xms -Xmx 即可