日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一次OutOfMemoryError: GC overhead limit exceeded

發布時間:2025/1/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一次OutOfMemoryError: GC overhead limit exceeded 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現象:

由于需要將mysql表中的過期數據在凌晨定時讀取出過濾后轉入到MongoDB,一個轉換SQL達到百行,而且有幾十個,集中運行后程序反饋異常:

Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded

Heap內存:1.5G,程序在Docker容器限制使用內存2G。

監控到內存GC變化:

Heap內存占用驟升至1.2G,然后不停的進行FullGC,而且間隔非常短,從下圖中可以看出PermGen穩定,這也表明讀取的數據由于太大是直接進入了老年代內存。

這時候CPU也彪升接近100%

請求訪問時長也加長,異常反饋。

java.lang.OutOfMemoryError: GC overhead limit exceeded 這種情況發生的原因是程序基本上耗盡了所有的可用內存, GC 也清理不了。

更準確的說法應該是:執行垃圾收集的時間比例太大,有效的運算量太小。默認情況下,如果GC花費的時間超過 98%,并且GC 回收的內存少于 2%,JVM 就會拋出這個錯誤。

網友的解決建議:

有的人在解決 “java.lang.OutOfMemoryError: GC overhead limit exceeded” 錯誤時,配置了下面的啟動參數:

// 不推薦

-XX:-UseGCOverheadLimit

我告訴你,這是一種完全錯誤的做法。因為 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 錯誤的時間。

所以,要想從根本上解決問題,則需要排查內存分配相關的代碼。簡單來說,需要搞清楚一下兩點:

  • 哪類對象占用了最多內存?
  • 這些對象是在哪部分代碼中分配的?

總結

以上是生活随笔為你收集整理的一次OutOfMemoryError: GC overhead limit exceeded的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。