Jvm(27.14.2),理解升級---堆,棧,方法區

weixin_33958585發表於2018-09-22

假如你現在還在為自己的技術擔憂,假如你現在想提升自己的工資,假如你想在職場上獲得更多的話語權,假如你想順利的度過35歲這個魔咒,假如你想體驗BAT的工作環境,那麼現在請我們一起開啟提升技術之旅吧,詳情請點選http://106.12.206.16:8080/qingruihappy/index.html

看完GC的回收策略之後,我們再來看一下堆,棧,方法區的互動。

首先我們必須牢記一句話,棧是堆和方法區的引用,學的越多對這句話的理解要越深。

1,這裡的堆主要是對區域性變數表來說的。

2,棧的記憶體地址是遠遠小於堆得,因為在棧中只是物件的引用。

3,gc回收只是回收堆記憶體,不用考慮棧的記憶體,因為棧的資料結構就是一旦出棧就會釋放的。

棧也是JAVA虛擬機器自動管理的,(不是由gc)棧類似一個集合(不過是有固定的容量),是由很多元素(專業術語:棧幀)組合起來的,在我們碼程式碼的時候,每呼叫一個方法,在執行的時候,JAVA虛擬機器就會自動在記憶體中分配對應的一塊空間,那麼這塊空間就是一個

棧幀,也就自然屬於棧了,而當方法呼叫結束後,對應的棧幀就會被釋放掉,那麼因為

JAVA程式從main方法開始執行,那麼JAVA虛擬機器就會在記憶體中分配一塊main方法的棧幀,如果main方法裡沒有呼叫其它方法,那麼,main方法呼叫結束後,會把main方法棧幀釋放掉,此時,棧裡沒有了棧幀,程式結束。

4,使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

5,堆因為是不連續的,所以分配的記憶體是在執行期確認的,因此大小不固定。

棧是連續的,所以分配的記憶體大小要在編譯期就確認,大小是固定的

6,堆主要用來存放物件的,棧主要是用來執行程式的

7,(1)堆主要放new的物件,而棧放基本型別和控制程式碼,控制程式碼指向的是堆。

(2)垃圾回收的時候回收的是堆,棧比較難回收,一般不回收(這個才是問你的原因,呵

呵)。

8,棧記憶體:

 

程式在棧記憶體中執行

 

棧中存的是基本資料型別和堆中物件的引用

 

棧是執行時的單元

 

棧解決程式的執行問題,即程式如何執行,或者說如何處理資料

 

一個執行緒一個獨立的執行緒棧

 

堆記憶體:

 

程式執行所需的大部分資料儲存在堆記憶體中

 

堆中存的是物件

 

堆是儲存的單元,堆只是一塊共享的記憶體

 

堆解決的是資料儲存的問題,即資料怎麼放,放在哪兒

 

所有執行緒共享堆記憶體

9,區域性變數表所需的記憶體空間在編譯期確定,當進入一個方法時,方法在棧幀中所需要分配的區域性變數控制元件是完全確定的,不可動態改變大小

假如你現在還在為自己的技術擔憂,假如你現在想提升自己的工資,假如你想在職場上獲得更多的話語權,假如你想順利的度過35歲這個魔咒,假如你想體驗BAT的工作環境,那麼現在請我們一起開啟提升技術之旅吧,詳情請點選http://106.12.206.16:8080/qingruihappy/index.html

相關文章