JVM-堆內存

1. java堆內存介紹

java的堆內存能夠類比於計算機的內存,是存儲整個機器數據的地方。java

(1)jvm一塊兒動就建立java堆。類比計算機一塊兒動就加載內存。算法

(2)全部的線程共享。類比計算機全部進程共享一個內存。jvm

(3)是存放實例對象的地方。線程

 

2. 堆內存圖示

 

 

 

3. 堆內存劃分

主要分爲年輕代(佔堆內存1/3)和老年代(佔堆內存2/3)。年輕代又分爲eden(佔年輕代8/10),from(佔年輕代1/10),to(佔年輕代1/10)。下面開始分別介紹。對象

老年代:存儲大對象和一些生命週期長的對象。blog

年輕代:存儲佔內存少而且生命週期短的對象。生命週期

 

那麼問題來了,對象的大小比較好說,直接比較佔的空間就行;生命週期長短,這玩意怎麼算呢?這就是下面要介紹的eden,from,to進程

一個對象被new出來以後,是在eden中的。而new對象的操做很頻繁,new的對象多了,eden裝不下了,就須要對eden進行gc(垃圾回收),發生在eden中的這種小級別的gc叫作minor gc。內存

 

4. minor gc(young gc)

先介紹一下eden,from,to垃圾回收

eden:對象出生的地方

from:保存倖存數據的地方

to:空的倖存區

 

minor gc的過程以下:(參考上圖紅色的標線)

(1)把eden中活着的對象放到to中,並標記年齡爲1。(有一部分可能會被垃圾回收掉)

(2)把from中的活着的對象 age+1(有一部分可能會被垃圾回收掉)。若是age達到閾值(默認15歲),就直接放到老年代中;若是age未達到閾值,就放到to中。

(3)通過步驟(2),to裏面保存了存活的對象,from反而清空了。這時候將from和to進行標記切換,from變to,to變from。(備註:當to滿了的時候,直接將to裏面的數據所有放入老年代)

 

總結:

minor gc使用複製刪除算法,能減小空間碎片。

全部的Minor GC都會中止應用程序的全部線程,不過這個過程很是短暫。

 

5. major gc(full gc)

採用的是標記-清除算法。

老年代的對象都是程序認爲生命力比較頑強的,不是那麼容易死掉的,因此不必頻繁的進行full gc。並且老年代的數據比新生代多的多,執行起來也比較耗時。

由於標記清除算法的弊端,會形成不少的內存碎片,當一個大對象進來,沒有足夠存儲他的連續空間的時候,就會執行Full gc。執行完以後就有足夠且連續的空間來存放新的對象了。

相關文章
相關標籤/搜索