JVM學習(三)——堆和棧的區別

在學習JVM運行機制的時候,運行時數據內存分為堆內存和棧內存;記得看Thking in Java時,曾看到過,棧內存存放的是基本類型的變量和對象的引用;而堆內存存放的則是對象;


堆內存

作用是用于存儲Java中的對象和數組,當我們new一個對象或者創建一個數組的時候,就會在堆內存中開辟一段空間給它,用于存放

堆內存的特點

1.堆可以看做隊列,先進先出,后進后出

2.堆可以動態分配內存大小,生存期也不必事先告訴編譯器;因為其時運行時動態分配內存的;

3.運行時動態分配內存,存取速度慢

new對象在堆中的分配

由JVM的自動辣雞回收器管理

棧內存

棧內存是Java的另一種內存,主要是用來執行程序用的,比如:基本類型的變量和對象的引用變量

棧內存的特點

1.先進后出,后進先出
2.存取速度比堆快,僅次于寄存器;堆數據可共享
3.存在棧中的數據大小和生存周期是確定的,缺乏靈活性

棧內存分配機制

棧內存可以稱為一級緩存,由垃圾回收器自動回收

數據共享

int a = 3;
int b = 3;

1.編譯器處理int a = 3;創建a的引用;在棧中查找是否有3這個值;若沒有則將3存放,a指向3;

2.處理int b = 3;創建b的引用;在棧中找到了3,直接賦值;

3.若a = 4;則將a指向4;

棧和堆的區別

JVM是基于堆棧的虛擬機.JVM為每個新創建的線程都分配一個堆棧.也就是說,對于一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作

差異

1.堆內存用來存放由new創建的對象和數組。
2.棧內存用來存放方法或者局部變量等
3.堆是先進先出,后進后出
4.棧是后進先出,先進后出

相同

1.都是屬于Java內存的一種
2.系統都會自動去回收它,但是對于堆內存一般開發人員會自動回收它


出處:http://blog.csdn.net/u011546655/article/details/52170470

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容