1. 程式人生 > >什麼情況下會發生堆記憶體溢位,棧記憶體溢位,結合例項說明

什麼情況下會發生堆記憶體溢位,棧記憶體溢位,結合例項說明

一、 棧溢位(StackOverflowError)
棧是執行緒私有的,他的生命週期與執行緒相同,每個方法在執行的時候都會建立一個棧幀,用來儲存區域性變量表,運算元棧,動態連結,方法出口燈資訊。區域性變量表又包含基本資料型別,物件引用型別(區域性變量表編譯器完成,執行期間不會變化)

所以我們可以理解為棧溢位就是方法執行是建立的棧幀超過了棧的深度。那麼最有可能的就是方法遞迴呼叫產生這種結果。

public class JvmTest {
    private int i = 0;
    public void a(){
        System.out.println(i++);
        a();
    }
    public static void main(String[] args) {
        JvmTest j = new JvmTest();
        j.a();
    }
}
輸出結果:

如何解決:

我們需要使用引數 -Xss 去調整JVM棧的大小

解決後效果如下

但是需要注意遞迴程式的風險。

二、 堆溢位(OutOfMemoryError:java heap space)
heap space表示堆空間,堆中主要儲存的是物件。如果不斷的new物件則會導致堆中的空間溢位

public class JvmTest {
    public static void main(String[] args) {
        List<String> aList = new ArrayList<String>();
        try{
            while(true){
                aList.add("asdasdasdas");
            }
        }catch(Throwable e){
            System.out.println(aList.size());
            e.printStackTrace();
        }
    }
}
異常資訊:

可以通過 -Xmx4096M 調整堆的總大小

三、 永久代溢位(OutOfMemoryError: PermGen space)
由於JDK7、8移除永久帶,所以上述程式碼在JDK1.6的情況中會出現永久帶溢位的現象。
--------------------- 

轉載:https://blog.csdn.net/qq_31615049/article/details/82980799