一、棧
棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器,當超過變量的作用域后,java會自動釋放掉為該變量分配的內存空間,該內存空間可以立刻被另作他用。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧數據可以共享。
那些數據存放在棧中?
基本數據類型(int, short, long, byte, float, double, boolean, char)的變量存放於棧中。
對象的引用存放於棧中。
棧數據共享具體指什么意思?(方法區中的常量池)
int a = 3; int b = 3;
編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找有沒有字面值為3的地址,沒找到,就開辟一個存放3這個字面值的地址,然后將a指向3的地址。接着處理int b = 3;在創建完b的引用變量后,由於在棧中已經有3這個字面值,便將b直接指向3的地址。這樣,就出現了a與b同時均指向3的情況。即共享了3這個棧數據。
另外,比較特殊的是String,雖然String類型不是簡單的基本數據類型,但是當用String a="abc"這樣的語法定義String變量的時候,會把數據存儲在棧中,因此也會有上面所說的數據共享特性。
java的八種基本類型(Byte Short、Integer、Long、Character、Boolean、Float、Double),除Float及Double意外,其它六種都實現了常量池,但是他們只在大於等於-128且小於等於127時才能使用常量池,如果不在此范圍內,則會new一個出來,保存在堆內存中。
二、堆
堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器。堆數據在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占着內存,在隨后的一個不確定的時間被垃圾回收器釋放掉。但缺點是,由於要在運行時動態分配內存,存取速度較慢。
那些數據存放在堆中?
堆內存用於存放由new創建的對象和數組,即堆主要是用來存儲對象的。Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。
三、方法區中的靜態存儲區
存儲static聲明的靜態變量