OutOfMemoryError異常的常見原因

2020-12-17 程式設計師一代碼搬運工

為啥會出現OutOfMemoryError

內存中加載的數據量過於龐大,如一次從資料庫取出過多數據; 集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;

代碼中存在死循環或循環產生過多重複的對象實體; 使用的第三方軟體中的BUG; 啟動參數內存值設定的過小;

OutOfMemoryError幾種情況

最常見的有這3種

java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: GC overhead limit exceeded

(堆內存溢出)java.lang.OutOfMemoryError: Java heap space

Java heap space,Java應用程式創建的對象存放在這片區域,垃圾回收(Garbage Collection)也發生在這塊區域。通常一些比較「重型」的操作可能會導致該異常,比如:需要創建大量的對象,層次比較深的遞歸操作等。

解決方案有兩種,一是優化應用,找到消耗大量內存的地方,然後優化代碼或者算法。這種方式比較推薦,但是難度比較大,尤其是在產品環境中出現這種問題,開發人員不能很好的重現問題。第二種方案是提升Java heap size,這種方式雖然感覺有點治標不治本,但是可行性非常高,操作簡單。

如果是在tomcat中,出現的這種問題,解決辦法是在{tomcat_dir}/bin/catalina.bat中找到如下幾行:

在後面加上一行(數字根據自己的需要調整):

set CATALINA_OPTS=-Xms512m -Xmx512m(方法區內存溢出)java.lang.OutOfMemoryError: PermGen space

Perm Gen Size(Permanent Generation Size),用來存儲被加載的類的定義(class definition)和元數據(metadata),比如:Class Object和Method Object等。這是內存中的一塊永久保存區域,JVM的垃圾回收不會觸及這塊區域。通常在加載一個非常大的項目的時候才會出現該異常。

如果是在tomcat中出現這個問題,解決辦法是在{tomcat_dir}/bin/catalina.bat中添加如下一行:

set CATALINA_OPTS=-server -Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512mjava.lang.OutOfMemoryError: GC overhead limit exceeded

這個錯誤會出現在這個場景中:GC佔用了多餘98%(默認值)的CPU時間卻只回收了少於2%(默認值)的堆空間。目的是為了讓應用終止,給開發者機會去診斷問題。一般是應用程式在有限的內存上創建了大量的臨時對象或者弱引用對象,從而導致該異常。雖然加大內存可以暫時解決這個問題,但是還是強烈建議去優化代碼,後者更加有效。

首先,你可以關閉JVM這個默認的策略:

1 java -XX:-UseGCOverheadLimit JavaApp 其次,你也可以嘗試去加大Heap Size:

1 java -Xmx512m JavaApp 注意:在修改Tomcat的catalina.bat(*.sh)中的內容時,網上有很多都是說直接修改JAVA_OPTS,按照Apache官方的說法是:

Note: Do not use JAVA_OPTS to specify memory limits. You do not need much memory for a small process that is used to stop Tomcat. Those settings belong to CATALINA_OPTS.

預防OutOfMemoryError從我做起

導致java.lang.OutOfMemoryError的根本原因是程序不健壯

圈起來,這句話是重點

怎麼做?

1、儘早釋放無用對象的引用2、使用字符串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立佔用內存一塊區域3、儘量少用靜態變量,因為靜態變量存放在永久代(方法區),永久代基本不參與垃圾回收4、避免在循環中創建對象5、開啟大型文件或從資料庫一次拿了太多的數據很容易造成內存溢出,所以在這些地方要大概計算一下數據量的最大值是多少,並且設定所需最小及最大的內存空間值。

windows環境中直接到jdk安裝目錄bin文件夾下雙擊jvisualvm.exe打開,或者在cmd下輸入jvisualvm回車。查看更多信息

更多jvm學習

jvm基礎概念理解

jvm內存模型詳解記錄

jvm中的堆和棧(面試總結)

jvm類加載過程

相關焦點

  • 我的世界out of memory怎麼辦 out of memory解決辦法
    of memory,不知道怎麼回事,當我們遇到我的世界out of memory怎麼辦呢?   從錯誤消息顯示的原因是:java虛擬機(JVM)內存空間不足造成。out of memory在java開發中還是偶爾會遇到,下面我來給你說明下具體原因:   內存是運行電腦時非常關鍵的載體,你的每一步操作都會臨時存儲在內存中,內存有固定大小比如2G,那麼開機時可能你的內存只佔了500M,隨後你打開遊戲,遊戲就會把數據臨時寫到內存中,這時慢慢的內存佔用可能就升到1G了,這是內存升高的原因。
  • 教你寫Bug,常見的 OOM 異常分析
    1.2 原因分析無限遞歸循環調用(最常見原因),要時刻注意代碼中是否有了循環調用方法而無法退出的情況native 代碼有棧上分配的邏輯,並且要求的內存還不小,比如 java.net.SocketInputStream.read0 會在棧上要求分配一個
  • OutOfMemoryError解決方案
    OME的發生OutOfMemoryError異常可以說是一個比較棘手的問題,Java中所有的對象都存儲在堆中,通常如果JVM無法再分配新的內存,內存耗盡,垃圾回收無法及時回收內存,就會拋出OutOfMemoryError。我這次遇到的OME錯誤如圖:
  • Win10系統CF出現out of memory的解決步驟!
    【PConline資訊】Win10系統CF出現了outofmemory怎麼辦?很多用戶在玩CF的時候,出現了系統提示outofmemory的情況,出現這種情況的原因有很多,下面小編就和大家分享下Win10系統CF出現了outofmemory的具體解決步驟。
  • 最常見的10種Java異常問題!
    前言本文總結了有關Java異常的十大常見問題。目錄檢查型異常(checked) vs. 非檢查型異常(Unchecked)為什麼在try代碼塊中聲明的變量不能在catch或者finally中被引用?為什麼 Double.parseDouble(null) 和 Integer.parseInt(null) 拋出的異常不一樣呢?
  • Java程式設計師必備:異常的十個關鍵知識點
    - NullPointerException空指針異常- ArithmeticException出現異常的運算條件時,拋出此異常- IndexOutOfBoundsException數組索引越界異常- ClassNotFoundException找不到類異常- IllegalArgumentException(非法參數異常)
  • 如何根治龍之谷out of memory的頑疾
    想必很多谷友都會遇到outofmemory的問題,比如說每次我們剛剛打開吉娃娃的大門時,萬惡的outofmemory就彈出來了,這讓人實為頭疼,恨不得直接拿滑鼠往顯示器上砸了!而且屢試不爽~是在無奈。
  • 小叮噹爬蟲基礎(三):cookie、代理設置、error異常處理
    而對cookie的使用以及基本的反爬措施---代理設置,error異常處理等是十分重要的。3.urllib中的error異常處理在urllib中error的異常中,HTTPError和URLError這兩種最為常見。
  • 攔截PHP各種異常和錯誤,發生致命錯誤時進行報警(一)
    在開發的時候可以查看各種錯誤、異常,但是在線上就把錯誤顯示的關閉。上面的情形看似很科學,有人解釋為這樣很安全,別人看不到錯誤,以免洩露重要信息...但是你有沒有遇到這種情況,線下好好的,一上線卻運行不起來也找不到原因...一個腳本,跑了好長一段時間,一直沒有問題,有一天突然中斷了,然後了也沒有任何記錄都不造啥原因...
  • Python異常處理,告別xxxxError
    這個提前預防的動作稱為異常處理(exception handling)。總之異常處理就是為了防患於未然。本帖的內容如下:try-excepttry-except-elsetry-except-else-finally拋出 Exception總結異常處理最常見的語句就是 try-except 組合,細分又有三種類型:知道錯誤但不確定類型,
  • 深入分析Java虛擬機堆和棧及OutOfMemory異常產生原因
    堆可能存在如下異常情況:如果計算需要的堆比自動存儲管理系統提供的堆多,將拋出OutOfMemoryError錯誤。方法區中可能出現如下異常:如果方法區域中的內存無法滿足分配請求時,將拋出OutOfMemoryError錯誤。
  • 絕地求生大逃殺內存不足怎麼辦 絕地求生out of memory解決辦法
    絕地求生大逃殺內存不足怎麼辦 絕地求生out of memory解決辦法時間:2017-10-23 21:09   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:絕地求生大逃殺內存不足怎麼辦 絕地求生out of memory解決辦法 《絕地求生大逃殺》的配置是很多玩家比較關心的問題,隨著遊戲的火爆程度越來越高
  • CF內存不足 out of memory怎麼解決
    玩cf出現outof memory,是很多玩家的煩惱。
  • 9種常見的OOM場景演示!
    1.2 原因分析無限遞歸循環調用(最常見原因),要時刻注意代碼中是否有了循環調用方法而無法退出的情況native 代碼有棧上分配的邏輯,並且要求的內存還不小,比如 java.net.SocketInputStream.read0 會在棧上要求分配一個
  • Python 裝飾器填坑指南 | 最常見的報錯信息、原因和解決方案
    裝飾器學習資料,推薦參考 RealPythonhttps://realpython.com/primer-on-python-decorators/本文主要匯總記錄 Python 裝飾器的常見踩坑經驗,列舉報錯信息、原因和解決方案,供大家參考。
  • 絕地求生爆內存怎麼辦 內存不足out of memory解決教程
    今天小編為大家帶來的便是關於遊戲中玩家電腦內存夠的情況下提示內存不足out of memory解決教程,... 絕地求生被玩家吐槽最多的應該就是優化問題,雖然官方對於優化問題非常重視,目前還是有非常多的問題。
  • 使用Mybatis導致的OutOfMemoryError錯誤
    因為是生產上的問題,我們需要定位根本原因,查了那兩臺機器的日誌,發現有OutOfMemoryError錯誤,錯誤信息如下這個是現象,不是導致OutOfMemoryError的根本原因,但是這個方法確實會額外佔用一些內存。
  • C++:15---異常機制
    ]){if(len<=0)throw length_error("長度過低");}catch(length_error error){cout<<error.what()<<endl;}}五、棧展開演示案例下面的代碼
  • Bios常見錯誤代碼介紹!
    2.cmos check sum error-defaults loaded  中文:cmos 執行全部檢查時發現錯誤,要載入系統預設值。  3.press esc to skip memory test  中文:正在進行內存檢查,可按esc鍵跳過。
  • .NET內存包裝類 Memory 和 Span 相關類型
    = owner.Memory; WriteInt32ToBuffer(value, memory); DisplayBufferToConsole(memory.Slice(0, value.ToString().Length)); } catch (FormatException