中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解JVM的GC overhead limit exceeded錯誤

發布時間:2021-10-23 16:23:54 來源:億速云 閱讀:584 作者:柒染 欄目:云計算

如何理解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 就會拋出這個錯誤。

如何理解JVM的GC overhead limit exceeded錯誤

java.lang.OutOfMemoryError: GC overhead limit exceeded 錯誤只在連續多次 GC 都只回收了不到2%的極端情況下才會拋出。假如不拋出 GC overhead limit 錯誤會發生什么情況呢? 那就是 GC 清理的這么點內存很快會再次填滿,迫使 GC 再次執行。這樣就形成惡性循環,CPU 使用率一直是 100%,而 GC 卻沒有任何成果。系統用戶就會看到系統卡死。以前只需要幾毫秒的操作,現在需要好幾分鐘才能完成。

下面我們來看一個產生“GC overhead limit exceeded” 錯誤的例子:

如何理解JVM的GC overhead limit exceeded錯誤

為了能夠更快的看到效果,我們可以設置一下 JVM 的參數:

如何理解JVM的GC overhead limit exceeded錯誤

需要注意的是,不同的 GC 算法。產生的錯誤信息也不相同,有的可能會產生 java.lang.OutOfMemoryError: Java heap space 錯誤。

關于具體的 GC 算法,我給大家一張關于 Java8 GC 算法的列表,我后面再具體的寫文章來講。

如何理解JVM的GC overhead limit exceeded錯誤

我們在說說上面產生 OutOfMemoryError 錯誤的代碼吧。Map 在進行 rehash 時拋出了 java.lang.OutOfMemoryError 錯誤消息。如果使用其他垃圾收集算法,比如 -XX:+UseConcMarkSweepGC,或者 -XX:+UseG1GC,錯誤將被默認的 exception handler 所捕獲,但是沒有 stacktrace 信息,因為在創建 Exception 時沒辦法填充 stacktrace 信息。

再比如,有些廠商的 JVM 在 Win7x64,Java8 環境配置如下 UseG1GC:

如何理解JVM的GC overhead limit exceeded錯誤

結果產生的錯誤信息卻是:

如何理解JVM的GC overhead limit exceeded錯誤

上面這些真實的案例表明,在資源受限的情況下,無法準確預測程序會死于哪種具體的原因。所以在這類錯誤面前,不能綁死某種特定的錯誤處理順序。

有的人在解決 “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錯誤的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

神池县| 福清市| 嘉义市| 鹿泉市| 桐庐县| 古蔺县| 日照市| 东辽县| 台北县| 郴州市| 屏边| 铁岭县| 咸阳市| 桓台县| 墨脱县| 温州市| 高阳县| 嘉善县| 海伦市| 高淳县| 石狮市| 牡丹江市| 宁化县| 句容市| 农安县| 深水埗区| 同仁县| 西充县| 蒲江县| 东山县| 社会| 麦盖提县| 庆阳市| 新安县| 山阴县| 永昌县| 绩溪县| 水城县| 磐安县| 云阳县| 陆良县|