Java 堆棧詳解

java堆內存:是存放對象本身,不存放對象的引用也不存放基本數據類型,jvm中只有一個堆(heap)所有線程共享。

java棧內存:用來存放局部變量(方法中定義的基本數據類型和對象的引用),線程私有,超過變量的作用域,java會自動釋放掉爲該變量分配你的內存空間替工給其他變量使用。

Java自動管理棧和堆,程序員不能直接地設置棧或堆。
在這裏插入圖片描述

堆棧溢出

堆溢出,不斷的創建新的 對象,沒有及時回收導致堆溢出,還有一個創建很大的對象導致堆溢出

public class Heap{
    public static void main(String[] args) {
        ArrayList list=new ArrayList();
        while(true) {
            list.add(new Heap());
        }
    }
}
或者
public class Heap{
    public static void main(String[] args) {
      byte[][] array=new byte[1024*1024][1024*1024];
    }
}

會報錯:java.lang.OutOfMemoryError: Java heap space

棧溢出:一般是遞歸不斷的創建變量造成棧內存不足。

public class Stack{
    public static void main(String[] args) {
        new Stack().test();
    }
    public void test()  {
       test();
    }
}

報錯:
java.lang.StackOverflowError

避免內存泄露:
是在聲明對象引用之前,明確內存對象的有效作用域。在一個函數內有效的內存對象,應該聲明爲 local 變量,與類實例生命週期相同的要聲明爲實例變量……以此類推。第二,在內存對象不再需要時,記得手動將其引用置空。

堆棧溢出解決:
此時可以通過增大jvm的堆內存來解決這個問題,當然了這個是最直接的方式,如果可以優化代碼也是可以的,比如使用單例模式去優化代碼。

在運行Java程序時,有兩個參數可以用於對jvm堆內存的調整:
-Xms(用於設置jvm堆內存的初始大小)
-Xmx(用於設置jvm堆內存的最大可用內存)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章