轉自: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 //最大堆大小