讀碼農翻身之Java虛擬機的堆

回顧一下java內存區域劃分:
在這裏插入圖片描述
1、Heap中主要保存對象
2、垃圾回收:java程序員只需要將對象給new出來,扔到heap中,但是從來不把它delete掉,所以需要有垃圾回收機制來刪掉這些對象。而這其中也涉及到一些算法

如 可達性分析算法:橙色的對象都是不可達對象,可以回收
在這裏插入圖片描述

3、Heap的詳解
可以把Heap想象成一大片空間,爲了方便管理,把heap劃分爲多個區域,然後把那些java對象在其中搬來搬去。
在這裏插入圖片描述
規定:新創建出來的對象,是保存在新生代中的,如果新生代住不下了,就進行垃圾回收(Minor GC),回收以後還住不下,那就把一些壽命比較就的對象轉移到老年代中去。如何區分對象的壽命呢?在heap中的對象都會設置一個年齡計數器,每次java對象經歷過一次GC,那麼就將年齡加1.

爲什麼要在新生代分出Eden、Survivor1、Survivor2這樣的區域呢?(Eden意思是伊甸園,在聖經中應該是象徵着無憂無慮的好地方)
這是因爲想要實現一個複製算法:
在這裏插入圖片描述
分爲兩個區域,每次只用其中的一個。當區域1用完了,就做垃圾回收,把存活的都搬到另外一個區域。這種來回顛倒使用兩個區域,雖然效率高,沒有碎片,但是浪費的空間很巨大,每次只能用一半!後來發現了規律,大部分在新生代的對象都活不了多長時間,基本上一次垃圾回收就刪除得差不多了。所以對這個算法進行了改進,將新生代分爲了三個部分:Eden、Survivor1、Survivor2,他們的比例是8:1:1
每次只使用Eden和其中一個Survivor,當垃圾回收時,把這兩塊區域中還活着的對象複製到另外一個Survivor,如果Survivor放不下,就放入老年代。如果老年代也滿了, 那麼就能做一次Full GC!

4、Off-Heap—堆外內存
在這裏插入圖片描述
複製數據太麻煩了,可以在java代碼中直接分配一塊屬於off-heap的內存。
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章