Java中的堆內存、棧內存、靜態存儲區


一、棧

棧的優勢是,存取速度比堆要快,僅次於直接位於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聲明的靜態變量

 


免責聲明!

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



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