IDEA java.lang.OutOfMemoryError: Java heap space


一、錯誤背景

本地開發環境,使用PostMan或Swagger請求A微服務,而A微服務需要將數據傳遞給B微服務,A微服務的控制台開始報錯,使得A微服務沒有得到正確的響應。

二、關鍵錯誤信息

IDEA java.lang.OutOfMemoryError: Java heap space

三、錯誤原因

錯誤原因是因為A微服務所暴露的接口,接收的數據量實在是太大了,導致Idea內存溢出。

四、解決辦法

在Idea中點擊Edit Configurations,將VM options設置大一點,就能解決這個問題。我將其設置為-Xmx5048m才解決這個問題。

解決問題辦法,主要參考如下鏈接:
IDEA java.lang.OutOfMemoryError: Java heap space

五、OutOfMemoryError的多種情況、原因以及解決方案(本文僅針對這五種進行較為詳細的說明)

1.java.lang.OutOfMemoryError: Java heap space

原因:Heap內存溢出,意味着Young和Old generation的內存不夠。
解決方案:調整java啟動參數 -Xms -Xmx 來增加Heap內存。

2.java.lang.OutOfMemoryError: unable to create new native thread

原因:Stack空間不足以創建額外的線程,要么是創建的線程過多,要么是Stack空間確實小了。
解決方案:由於JVM沒有提供參數設置總的stack空間大小,但可以設置單個線程棧的大小;而系統的用戶空間一共是3G,除了Text/Data/BSS/MemoryMapping幾個段之外,Heap和Stack空間的總量有限,是此消彼長的。因此遇到這個錯誤,可以通過兩個途徑解決:1.通過-Xss啟動參數減少單個線程棧大小,這樣便能開更多線程(當然不能太小,太小會出現StackOverflowError);2.通過-Xms -Xmx 兩參數減少Heap大小,將內存讓給Stack(前提是保證Heap空間夠用)。

3.java.lang.OutOfMemoryError: PermGen space

原因:Permanent Generation空間不足,不能加載額外的類。
解決方案:調整-XX:PermSize= -XX:MaxPermSize= 兩個參數來增大PermGen內存。一般情況下,這兩個參數不要手動設置,只要設置-Xmx足夠大即可,JVM會自行選擇合適的PermGen大小。

4.java.lang.OutOfMemoryError: Requested array size exceeds VM limit

原因:這個錯誤比較少見(試着new一個長度1億的數組看看),同樣是由於Heap空間不足。如果需要new一個如此之大的數組,程序邏輯多半是不合理的。
解決方案:修改程序邏輯吧。或者也可以通過-Xmx來增大堆內存。

5.java.lang.StackOverflowError

原因:這也內存溢出錯誤的一種,即線程棧的溢出,要么是方法調用層次過多(比如存在無限遞歸調用),要么是線程棧太小。
解決方案:優化程序設計,減少方法調用層次;調整-Xss參數增加線程棧大小。

參考資料如下:
Java中的OutOfMemoryError的各種情況及解決和JVM內存結構
面試官:小伙子,你給我說一下Java中什么情況會導致內存泄漏呢?
Java 內存溢出的原因和解決方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM