新生代:剛出生不久的對(duì)象皮官,存放在新生代里面脯倒,存放不是經(jīng)常被使用的對(duì)象
老年代:存放比較活躍的對(duì)象,存放經(jīng)常被引用的對(duì)象
垃圾回收在新生代比較頻繁
什么是垃圾回收機(jī)制
- 不定時(shí)去堆內(nèi)存中清理不可達(dá)對(duì)象捺氢。不可達(dá)的對(duì)象并不會(huì)馬上就會(huì)直接回收藻丢, 垃圾收集器在一個(gè)Java程序中的執(zhí)行是自動(dòng)的,不能強(qiáng)制執(zhí)行摄乒,即使程序員能明確地判斷出有一塊內(nèi)存已經(jīng)無(wú)用了悠反,是應(yīng)該回收的,程序員也不能強(qiáng)制垃圾收集器回收該內(nèi)存塊馍佑。程序員唯一能做的就是通過(guò)調(diào)用System.gc 方法來(lái)"建議"執(zhí)行垃圾收集器斋否,但其是否可以執(zhí)行,什么時(shí)候執(zhí)行卻都是不可知的拭荤。這也是垃圾收集器的最主要的缺點(diǎn)茵臭。當(dāng)然相對(duì)于它給程序員帶來(lái)的巨大方便性而言,這個(gè)缺點(diǎn)是瑕不掩瑜的舅世。
public class Test {
public static void main(String[] args) {
Test test = new Test();
test = null;
System.gc(); // 手動(dòng)回收垃圾
}
@Override
protected void finalize() throws Throwable {
// gc回收垃圾之前調(diào)用
System.out.println("垃圾回收機(jī)制...");
}
}
新生代與老年代
Java 中的堆是 JVM 所管理的最大的一塊內(nèi)存空間笼恰,主要用于存放各種類的實(shí)例對(duì)象。
在 Java 中歇终,堆被劃分成兩個(gè)不同的區(qū)域:新生代 ( Young )、老年代 ( Old )逼龟。新生代 ( Young ) 又被劃分為三個(gè)區(qū)域:Eden评凝、From Survivor、To Survivor腺律。
這樣劃分的目的是為了使 JVM 能夠更好的管理堆內(nèi)存中的對(duì)象奕短,包括內(nèi)存的分配以及回收宜肉。
堆的內(nèi)存模型大致為:
默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過(guò)參數(shù) –XX:NewRatio 來(lái)指定 )翎碑,即:新生代 ( Young ) = 1/3 的堆空間大小谬返。老年代 ( Old ) = 2/3 的堆空間大小。其中日杈,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個(gè) Survivor 區(qū)域遣铝,這兩個(gè) Survivor 區(qū)域分別被命名為 from 和 to,以示區(qū)分莉擒。
默認(rèn)的酿炸,Edem : from : to = 8 : 1 : 1 ( 可以通過(guò)參數(shù) –XX:SurvivorRatio 來(lái)設(shè)定 ),即: Eden = 8/10 的新生代空間大小涨冀,from = to = 1/10 的新生代空間大小填硕。
根據(jù)垃圾回收機(jī)制的不同,Java堆有可能擁有不同的結(jié)構(gòu)鹿鳖,最為常見(jiàn)的就是將整個(gè)Java堆分為
新生代和老年代扁眯。其中新生帶存放新生的對(duì)象或者年齡不大的對(duì)象,老年代則存放老年對(duì)象翅帜。
新生代分為den區(qū)姻檀、s0區(qū)、s1區(qū)藕甩,s0和s1也被稱為from和to區(qū)域施敢,他們是兩塊大小相等并且可以互相角色的空間。
絕大多數(shù)情況下狭莱,對(duì)象首先分配在eden區(qū)僵娃,在新生代回收后,如果對(duì)象還存活腋妙,則進(jìn)入s0或s1區(qū)默怨,之后每經(jīng)過(guò)一次
新生代回收,如果對(duì)象存活則它的年齡就加1骤素,對(duì)象達(dá)到一定的年齡后匙睹,則進(jìn)入老年代。