GC overhead limt exceed 导致的java进程假死

我们两清 提交于 2019-11-26 10:56:35

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 即可

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!