假如你現在還在為自己的技術擔憂,假如你現在想提升自己的工資,假如你想在職場上獲得更多的話語權,假如你想順利的度過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,區域性變數表所需的記憶體空間在編譯期確定,當進入一個方法時,方法在棧幀中所需要分配的區域性變數控制元件是完全確定的,不可動態改變大小。