
新生代:剛出生不久的對(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),最為常見的就是將整個(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)入老年代。