您好,登錄后才能下訂單哦!
如何解決jvm內存溢出java.lang.OutOfMemoryError: GC overhead limit exceeded問題,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
java.lang.OutOfMemoryError: GC overhead limit exceeded 2020-06-16 10:44:22.004 [http-nio-8083-exec-91] ERROR o.a.c.core.ContainerBase.[Tomcat].[localhost] - Exception Processing ErrorPage[errorCode=0, location=/error] org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:175) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
用ps命令查出該jar的運行的pid,然后查看java堆的詳細信息,發現確實內存已經99%了。
原因1:初始內存配置確實太小
原因2:相關代碼邏輯問題導致內存溢出
jmap -heap PID
這里暫時是先加大Heap Size:
-Xmx4000m -Xms4000m
調整后:
重點檢查代碼邏輯問題,如果是代碼的問題, 增加堆內存只能推遲產生java.lang.OutOfMemoryError,最終還是會內存溢出。
JVM啟動參數共分為三類:
標準參數(-),所有的JVM實現都必須實現這些參數的功能,而且向后兼容;
非標準參數(-X),指的是JVM底層的一些配置參數,這些參數在一般開發中默認即可,不需要任何配置。但是在生產環境中,并不保證所有jvm實現都滿足,所以為了提高性能,往往需要調整這些參數,以求系統達到最佳性能。另外這些參數不保證向后兼容,也即是說“如有變更,恕不在后續版本的JDK通知”(這是官網上的原話);
非Stable參數(-XX),這類參數在jvm中是不穩定的,不適合日常使用的,后續也是可能會在沒有通知的情況下就直接取消了,需要慎重使用。
三個主要域:新域、舊域以及永久域。
JVM生成的所有新對象放在新域中。一旦對象經歷了一定數量的垃圾收集循環后,便進入舊域。而在永久域中是用來存儲JVM自己的反射對象的,如class和method對象,而且GC(Garbage Collection)不會在主程序運行期對永久域進行清理(主要原因)。其中新域和舊域屬于堆,永久域是一個獨立域并且不認為是堆的一部分。
各主要參數的作用
-Xms:設置jvm內存的初始大小
-Xmx:設置jvm內存的最大值
-Xmn:設置新域的大小(這個似乎只對 jdk1.4來說是有效的,后來就廢棄了)
-Xss:設置每個線程的堆棧大小(也就是說,在相同物理內存下,減小這個值能生成更多的線程)
-XX:NewRatio :設置新域與舊域之比,如-XX:NewRatio = 4就表示新域與舊域之比為1:4
-XX:NewSize:設置新域的初始值
-XX:MaxNewSize :設置新域的最大值
-XX:PermSize:設置永久域的初始值
-XX:MaxPermSize:設置永久域的最大值
-XX:SurvivorRatio=n:設置新域中Eden區與兩個Survivor區的比值。(Eden區主要是用來存放新生的對象,而兩個 Survivor區則用來存放每次垃圾回收后存活下來的對象)
關于如何解決jvm內存溢出java.lang.OutOfMemoryError: GC overhead limit exceeded問題問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。