记一次OOM(GC overhead limit exceeded)异常
最近在用thrift写一个文本挖掘的服务。在测试某个接口的时候出现如下异常:
服务端GC日志如下:
参数GCoverhead limit exceeded是在jdk1.6引入的:
大概意思就如果系统大量的时间都在GC(98%)而回收的效果不明显(2% heap空间),就会抛出这个异常。实际这是一个JVM预判性的异常,也就是说抛出这个异常的时候没有真正的内存溢出。
由此得出结论:
1. OOM根本原因是heap空间不足,在服务端添加参数-Xmx1024M –Xms1024M,异常消失。
2. OOM异常使线程退出,当没有非deamon线程的时候进程就退出了。GC日志是进程退出时打的,OOM是在线程中发生的,这也就是从GC上看不出异常的原因。