java棧溢出與堆溢出

基本類型跟就是不可實例化的,可以直接初始化、賦值、運算。不可調用方法,不可放入容器(要求必須是類實例纔行)。
包裝類型就是把基本類型變成一個類實例,一定要new才產生,可以調用方法,可以放入容器。
首先要搞清楚堆棧裏放的什麼東西:

棧存儲運行時聲明的變量——對象引用(或基礎類型, primitive)內存空間,堆分配每一個對象內容(實例)內存空間。

一個變量可以先後指向多個對象實例;數組、鏈表等可以存放對多個實例對象內容的引用關係。沒有引用關係的對象內容按說被虛擬機回收(recycled,destroy,在C++叫delete,在C叫free)。 棧的實現是先入後出的, 相似的集裝箱那種貨艙。 堆是隨機存放的, 相似於現在的停車場。 記得曾經,有一本遊戲的外國書, 說遊戲要分配好棧空間和堆空間; 在開始時候分配固定容量的空間, 有不同的自頂向下和從下向上的地址空間分配。

stackoverflow , 總是在無限遞歸調用時候可以看見(google也經常有同名網站的結果)。

堆內存滿, 可以通過無限new實現。

================================

在JAVA中,可以使用關鍵字new來創建Java對象。例如,

ArrayList list = new ArrayList();

實際上,在創建完上面的一個對象後,在JVM中,會把new出來的對象存放在堆內存中,

同時,在方法棧中存放着對象的引用關係。

如果想要堆溢出,比較簡單,可以循環創建對象或大的對象;

如果想要棧溢出,可以遞歸調用方法,這樣隨着棧深度的增加,JVM 維持着一條長長的方法調用軌跡,直到內存不夠分配,產生棧溢出。因此,可以使用下面簡單的代碼實現堆溢出和棧溢出。

public class Test {
    public void testHeap(){
        for(;;){
              ArrayList list = new ArrayList (2000);
          }
    }
    int num=1;
    public void testStack(){
        num++;
        this.testStack();
     }
    
    public static void main(String[] args){
        Test  t  = new Test ();
        t.testHeap();
        t.testStack();   
    }
}

另外,Java虛擬機的堆大小如何設置:命令行

java –Xms128m //JVM佔用最小內存

       –Xmx512m //JVM佔用最大內存

       –XX:PermSize=64m //最小堆大小

       –XX:MaxPermSize=128m //最大堆大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章