当转换的对象数据量过大,使用JSON.toJSON()方法导致内存溢出。具体报错如下:
2019-08-05 10:42:28.403 [TxId : , SpanId : ] ERROR [http-nio-80-exec-8] c.u.f.t.c.e.GlobalExceptionHandler:151- unknown exception = Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1054)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
原因是代码中打印日志,使用了JSON.toJSON(),而对象数据过于庞大导致的。解决办法是将该打印日志给删除。但是因为处理的数据量巨大,后面还可能在其他地方抛出内存溢出。
这里的GC overhead limit exceeded
是JVM的一种推断,如果垃圾回收耗费了98%的时间,但是回收的内存还不到2%,那么JVM会认为即将发生OOM,让程序提前结束。可以使用-XX:-UseGCOverheadLimit,关掉这个特性。但是这么做没有意义,关掉这个特性,程序最终还是会报OOM,说到底要么是内存不足,要么是内存泄漏。