新生代与老年代区别
堆內存的劃分,怎么劃分呢,在堆內存中有一個比較大的劃分的,新生代和老年代,在新生代里面又會劃分幾個區域,EDEN區,s0和s1區,為什么要做這樣的劃分,S0和S1大小都是相同的,相等的,目的是什么目的呢,是為了做復制算法的一個交換,復制算法的最大的一個優點是什么呢,減少碎片化,S0和S1大小是完全相等的,我去畫一個非常詳細的一個圖1. 首先這是一個堆內存圖,默認的新生代和老年代的比例劃分是多少,就是1比2,老年代比新生代要大兩倍,所以這里我們可以這樣畫,按照等份來畫,左邊一份,右邊兩份,這個是默認的,你們也可以把新生代和老年代配置成相同的比例,這里我們可以把它叫做新生代,右邊的可以叫做老年代,有人可能就有疑問了,新生代到底干嘛用的,老年代到底是做什么目的的,新生代和老年代的表達含義是什么意思,剛出生不久的就放在新生代里面,這邊為什么會叫做老年代呢,會講到計數法,計數法到時候會詳細說的,引用計數法,這個引用計數法GC頻繁去回收的時候,剛出生不久對象會存在新生代里面去,如果你要是經常被使用,我用引用計數法做一個統計,我發現每次在回收的時候都在被使用,一旦達到15次以后,你就會從新生代里面晉升到老年代里面,老年代里面主要是存放比較活躍的對象,存放經常被引用的對象,新生代主要是存放不是經常使用的對象,比如我先做new了一個對象User(),假如他等于user1 = new User(),這個時候的user1是存在什么地方呢我們放在新生代里面去,這個時候會經歷GC的層層考驗,你會發現經常被使用,我就會把它放到老年代里面去,垃圾回收機制,一般是在新生代里面比較頻繁,還是在老年代里比較頻繁,垃圾回收機制一般在新生代比較頻繁,老年代雖然也有,但是很少,既然你的對象經常被使用,那我需要回收干嘛,你已經經過這么多考驗了,老年代回收的次數比較少,如果你那個對象不是經常被使用的對象,就會存在新生代里面,如果是經常被使用的對象,被GC已經驗證過很多次的,會進入到老年代里面去,在新生代里面又會分一個區,第一個區叫做EDEN區,EDEN區什么意思呢,新生代還有S0區和S1區,S0和S1區要相等的,有的地方把S0叫做from區,S1叫to區,但是都是一個概念,但是我喜歡叫S0和S1區,S0區和S1區大小相等的,在講垃圾回收機制的時候會講的,一個剛出生對象的話,我會把它放到EDEN區里面,放在eden區的時候,我的GC進行回收的時候,發現你會經常被使用,這才進入到S0里去,如果我發現你在S0區也會被經常使用的話,這個時候我才會放到老年代里面去,老年代里面是很少被回收的,除非你內存滿的情況下,才進行回收的,這就是我講的一個老年代和新生代的一個區別
?
總結
- 上一篇: finalize方法作用
- 下一篇: 如何判断对象是否存活之引用计数发