寫Java代碼分別使堆溢出,棧溢出


轉自:http://fxlzs2000.iteye.com/blog/1786407

轉自:http://my.oschina.net/sdrkyj/blog/143410

前言

primitive type: 基本類型,像int、double就是。
wrapped type:包裝類型,int—>Integer,double—>Decimal

基本類型跟就是不可實例化的,可以直接初始化、賦值、運算。不可調用方法,不可放入容器(要求必須是類實例才行)。
包裝類型就是把基本類型變成一個類實例,一定要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 //最大堆大小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM