1,Out Of Memery 內存耗盡
1,1 產生原因
1.1.1 內存用完【堆內存】
package com.cnblogs.mufasa; import org.junit.Test; import java.util.ArrayList; public class Model { @Test public void test(){ ArrayList<Integer> arr=new ArrayList<>(); while (true){ arr.add(1); } } } /* java.lang.OutOfMemoryError: Java heap space */
1.1.2 沒有退出的遞歸調用
- 如果我們寫一段程序不斷的進行遞歸調用,而且沒有退出條件,就會導致不斷地進行壓棧。類似這種情況,JVM 實際會拋出 StackOverFlowError;當然,如果 JVM 試圖去擴展棧空間的的時候失敗,則會拋出 OutOfMemoryError。
- 對於老版本的 Oracle JDK,因為永久代的大小是有限的,並且 JVM 對永久代垃圾回收(如,常量池回收、卸載不再需要的類型)非常不積極,所以當我們不斷添加新類型的時候,永久代出現 OutOfMemoryError 也非常多見,尤其是在運行時存在大量動態類型生成的場合;類似 Intern 字符串緩存占用太多空間,也會導致 OOM 問題。對應的異常信息,會標記出來和永久代相關:“java.lang.OutOfMemoryError: PermGen space”。
- 隨着元數據區的引入,方法區內存已經不再那么窘迫,所以相應的 OOM 有所改觀,出現 OOM,異常信息則變成了:“java.lang.OutOfMemoryError: Metaspace”。
1,2 如何解決
1,3 注意事項
2,Stack Over Flow 堆棧溢出
2,1 產生原因
package com.cnblogs.mufasa.SOF; import org.junit.Test; public class SOF_validate1 { public void recursive(){ int cnt=0; StringBuilder sb=new StringBuilder(); while (cnt<1){ sb.append(new String(""+cnt)); cnt++; } recursive(); } @Test public void test(){ recursive();//沒有退出條件的遞歸 } } /* java.lang.StackOverflowError */
2,2 如何解決
2,3 注意事項