您好,登錄后才能下訂單哦!
如何理解JVM的GC overhead limit exceeded錯誤,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
java 中有幾個難兄難弟,比如我昨天寫的 java.lang.OutOfMemoryError: Java heap space 和今天要寫的 java.lang.OutOfMemoryError: GC overhead limit exceeded 等。要搞清這些知識,就需要深入的理解 JVM 底層原理和實現機制。
那么我們今天就具體來說說 java.lang.OutOfMemoryError: GC overhead limit exceeded 吧!
我們都知道,Java 語言的一大優勢就是內存管理,也就是垃圾回收機制。相比其他語言,如:C++等,它們這些語言中并沒有自動內存回收機制, 需要程序員手工編寫代碼來進行內存分配和釋放, 以重復利用堆內存。
也正是因為 Java 語言有自動垃圾回收機制,所以一些程序員在使用不當的情況下,會發生一系列你意想不到的 OutOfMemoryError。關于 OutOfMemoryError 錯誤,目前一共有 8 種,我們一一的來搞定它們!
java.lang.OutOfMemoryError: GC overhead limit exceeded 這種情況發生的原因是程序基本上耗盡了所有的可用內存, GC 也清理不了。
更準確的說法應該是:執行垃圾收集的時間比例太大,有效的運算量太小。默認情況下,如果GC花費的時間超過 98%,并且GC 回收的內存少于 2%,JVM 就會拋出這個錯誤。
java.lang.OutOfMemoryError: GC overhead limit exceeded 錯誤只在連續多次 GC 都只回收了不到2%的極端情況下才會拋出。假如不拋出 GC overhead limit 錯誤會發生什么情況呢? 那就是 GC 清理的這么點內存很快會再次填滿,迫使 GC 再次執行。這樣就形成惡性循環,CPU 使用率一直是 100%,而 GC 卻沒有任何成果。系統用戶就會看到系統卡死。以前只需要幾毫秒的操作,現在需要好幾分鐘才能完成。
下面我們來看一個產生“GC overhead limit exceeded” 錯誤的例子:
為了能夠更快的看到效果,我們可以設置一下 JVM 的參數:
需要注意的是,不同的 GC 算法。產生的錯誤信息也不相同,有的可能會產生 java.lang.OutOfMemoryError: Java heap space 錯誤。
關于具體的 GC 算法,我給大家一張關于 Java8 GC 算法的列表,我后面再具體的寫文章來講。
我們在說說上面產生 OutOfMemoryError 錯誤的代碼吧。Map 在進行 rehash 時拋出了 java.lang.OutOfMemoryError 錯誤消息。如果使用其他垃圾收集算法,比如 -XX:+UseConcMarkSweepGC,或者 -XX:+UseG1GC,錯誤將被默認的 exception handler 所捕獲,但是沒有 stacktrace 信息,因為在創建 Exception 時沒辦法填充 stacktrace 信息。
再比如,有些廠商的 JVM 在 Win7x64,Java8 環境配置如下 UseG1GC:
結果產生的錯誤信息卻是:
上面這些真實的案例表明,在資源受限的情況下,無法準確預測程序會死于哪種具體的原因。所以在這類錯誤面前,不能綁死某種特定的錯誤處理順序。
有的人在解決 “java.lang.OutOfMemoryError: GC overhead limit exceeded” 錯誤時,配置了下面的啟動參數:
我告訴你,這是一種完全錯誤的做法。因為 UseGCOverheadLimit 這樣使用并不能真正地解決問題,只能推遲一點 out of memory 錯誤發生的時間,到最后還得進行其他處理。指定這個選項,會將原來的 java.lang.OutOfMemoryError: GC overhead limit exceeded 錯誤掩蓋,變成更常見的 java.lang.OutOfMemoryError: Java heap space 錯誤消息。
有時候觸發 GC overhead limit 錯誤的原因, 是因為分配給JVM的堆內存不足。這種情況下只需要增加堆內存大小即可。
在大多數情況下, 增加堆內存并不能解決問題。例如程序中存在內存泄漏, 增加堆內存只能推遲產生 java.lang.OutOfMemoryError: Java heap space 錯誤的時間。
看完上述內容,你們掌握如何理解JVM的GC overhead limit exceeded錯誤的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。