OutOfMemoryError: GC Overhead Limit Exceeded错误处理

OutOfMemoryError: GC Overhead Limit Exceeded错误处理

最近线上遇到一个问题,服务日志正常打印,但是接口调不通,重启服务后正常。

为了找到问题所在,那就翻日志,究竟是哪里出现异常,结果发现 OutOfMemoryError: GC Overhead Limit Exceeded 错误。

OutOfMemoryError: GC Overhead Limit Exceeded错误处理_第1张图片

初步判断有内存溢出。但是没有dump日志,不好分析。所以在启动脚本中加上了:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/psm/psm/logs/gc/  ,将OutOfMemoryError 的dump日志打印保存,

一段时间之后又遇到这种问题。现在有dump文件可以看了。服务器相应目录里有这种文件名:java_pid6705.hprof,download下来用jdk自带的jvisualvm.exe打开,在java的bin目录里能找到这个工具。

如图:

OutOfMemoryError: GC Overhead Limit Exceeded错误处理_第2张图片

点击错误线程到相应的错误位置

OutOfMemoryError: GC Overhead Limit Exceeded错误处理_第3张图片

按描述基本可以看出问题所在。

结合日志查询可得出结论:

结果是:有人查询数据的时候没有限制分页,直接把pagesize放到最大,查询出来的数据太多,导致内存超出了限制。

解决方法:限制分页数,设置默认值

其他情况解决方案,网上也有很多如:

           增加堆大小,启动脚本添加参数-Xmx1024m

           关闭GC Overhead limit:-XX:-UseGCOverheadLimit (都建议不推荐此方法,个人也不推荐,有可能会引发其他问题如java.lang.OutOfMemoryError: Java heap space错误)

 

 

你可能感兴趣的:(java)