一、錯誤背景
本地開發環境,使用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 內存溢出的原因和解決方法