面試題解答系列:堆裏面的分區:Eden,survival from to,老年代,各自的特色

在垃圾回收算法中,有一個算法稱之爲複製算法。其基本思想是把內存分爲大小相等的2塊,每次只在其中一塊區域內進行內存分配,當發生GC時,將這塊區域內存活的對象複製到另一個區域內,而後對這塊區域進行Full GC,這樣能夠保證內存的連續性,減小了空間碎片的產生.而後這種方式犧牲了一半的內存使用空間。Eden區與Survior區的概念也由此得來。java

一、Eden區算法

Edeb區位於JVM中的新生代,是新對象分配內存的地方,因爲堆是全部線程共享的,因此在堆上分配內存須要加鎖。數組

而Sun JDK爲了提高效率,會爲每一個新建的線程分配一個獨立的內存區域,這塊區域稱之爲TLAB(Thread Location Allocation學習

Buffer).在TLAB上分配內存是不須要進行加鎖的,因此Eden區域的對象內存分配會優先在TLAB上進行.如果對象過大或者是TLAB的內存空間使用完,則對象的內存分配會在堆上進行。若是Eden區內存耗盡,則會觸發Minor GC(Young GC)。線程

二、From Survivor和To Survivor區cdn

針對新生代對象"朝夕生死"的特色,將新生代劃分爲3塊區域u,分別爲Eden、From Survior、ToSurvior,比例爲8:1:1。對象

From和To是相對的,每次Eden和From發生Minor GC時,會將存活的對象複製到To區域,並清除內存。To區域內的對象每存活一次,它的"age"就會+1,當達到某個閾值(默認爲15)時,ToSurvior區域內的對象就會被轉移到老年代。內存

能夠經過設置參數-XX:MaxTenuringThreshold來設置晉升的年齡。字符串

虛擬機提供了一個參數:-XX PertenureSizeThreshold 使得大於這個參數的對象直接在老年代中分配內存,這樣就避免了在Eden區域以及Survior區域進行大量的內存複製。虛擬機

三、老年代

老年代中是存活時間久的大對象(很長的字符串或者是數組),所以老年代使用標記-整理算法。當老年代容量滿的時候,會觸發一次MajorGC (FullGC)

若是有什麼問題能夠私信我,還有一些關於java資料均可以私信問我要。

歡迎你們掃下方二維碼加java學習技術交流羣,一塊兒夯實基礎,提高自我價值

相關文章
相關標籤/搜索