JVM年輕代、年老代、永久代

編程語言 Java虛擬機 歷史 一路軍事 2017-04-12

年輕代:

HotSpot JVM把年輕代分為了三部分:1個Eden區和2個Survivor區(分別叫From和To),每次新創建對象時,都會分配到Eden區,當Eden區沒有足夠的空間進行分配時,虛擬機將發起一次Minor GC 。這些對象經過第一次Minor GC後,如果仍然存活,將會被移到Survivor區“From”,在Minor GC開始時,對象只會存在於Eden區和名為“From”的Survivor區,Survivor區“To”是空的,然後開始進行GC,Eden區中所有存活的對象都會被複制到“To”,而在“From”區中,仍存活的對象會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設置,默認15)的對象會被移動到年老代中,沒有達到閾值的對象會被複制到“To”區域。經過這次GC後,Eden區和From區已經被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為“To”的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到“To”區被填滿,“To”區被填滿之後,會將所有此時還存活的對象移動到年老代中。

年老代:

在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命週期較長的對象

永久帶:

存儲的是java的類信息,包括解析得到的方法、屬性、字段等等。永久帶基本不參與垃圾回收。在jdk1.8之前,通過-XX:PermSize=64m -XX:MaxPermSize=128m來調整永久代大小,在jdk1.8之後,永久代被移除,原本存儲在永久代的數據將存放在一個叫做元空間的本地內存區域,通過 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m來調整元空間大小

注:

大對象(需要大量連續內存空間的java對象,比如很長的字符串or數組)會直接分配在老年代

相關推薦

推薦中...