JAVA虛擬機之-JVM調優內存介紹

一.新生代、老年代、永久代

新生代分爲三個區域,一個Eden區和兩個Survivor區,它們之間的比例爲(8:1:1),這個比例也是可以修改的。通常情況下,對象主要分配在新生代的Eden區上,少數情況下也可能會直接分配在老年代中。Java虛擬機每次使用新生代中的Eden和其中一塊Survivor(From),在經過一次Minor GC後,將Eden和Survivor中還存活的對象一次性地複製到另一塊Survivor空間上(這裏使用的複製算法進行GC),最後清理掉Eden和剛纔用過的Survivor(From)空間。將此時在Survivor空間存活下來的對象的年齡設置爲1,以後這些對象每在Survivor區熬過一次GC,它們的年齡就加1,當對象年齡達到某個年齡(默認值爲15)時,就會把它們移到老年代中。

在新生代中進行GC時,有可能遇到另外一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象,這些對象將直接通過分配擔保機制進入老年代;
在這裏插入圖片描述

1.Eden區

Eden區位於Java堆的年輕代,是新對象分配內存的地方,由於堆是所有線程共享的,因此在堆上分配內存需要加鎖。而Sun JDK爲提升效率,會爲每個新建的線程在Eden上分配一塊獨立的空間由該線程獨享,這塊空間稱爲TLAB(Thread Local Allocation Buffer)。在TLAB上分配內存不需要加鎖,因此JVM在給線程中的對象分配內存時會盡量在TLAB上分配。如果對象過大或TLAB用完,則仍然在堆上進行分配。如果Eden區內存也用完了,則會進行一次Minor GC(young GC)。

2.Survivor from to

Survival區與Eden區相同都在Java堆的年輕代。Survival區有兩塊,一塊稱爲from區,另一塊爲to區,這兩個區是相對的,在發生一次Minor GC後,from區就會和to區互換。在發生Minor GC時,Eden區和Survivalfrom區會把一些仍然存活的對象複製進Survival to區,並清除內存。Survival to區會把一些存活得足夠舊的對象移至年老代。

3.年老代

年老代裏存放的都是存活時間較久的,大小較大的對象,因此年老代使用標記整理算法。當年老代容量滿的時候,會觸發一次Major GC(full GC),回收年老代和年輕代中不再被使用的對象資源。

二.總結:

  1. Minor GC是發生在新生代中的垃圾收集,採用的複製算法;
  2. 新生代中每次使用的空間不超過90%,主要用來存放新生的對象;
  3. Minor GC每次收集後Eden區和一塊Survivor區都被清空;
  4. 老年代中使用Full GC,採用的標記-清除算法;

參考資源:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章