1. 程式人生 > >JAVA虛擬機器:新生代和老年代GC

JAVA虛擬機器:新生代和老年代GC

Java堆可以分為新生代和老年代兩個區,其中新生代又可以分為一個Eden區和兩個Survivor區,兩個Survivor區分別被命名為From和To以示區分,新生代和老年代的比例為1:2,它們共同組成堆的記憶體區,所以新生代佔堆的1/3,老年代佔2/3,但這個比例可以修改,下面分別來介紹一下新生代和老年代。

1、【新生代】

新生代分為三個區域,一個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、Minor GC是發生在新生代中的垃圾收集,採用的複製演算法;

2、新生代中每次使用的空間不超過90%,主要用來存放新生的物件;

3、Minor GC每次收集後Eden區和一塊Survivor區都被清空;

2、【老年代】

老年代裡面存放都是生命週期長的物件,對於一些較大的物件(即需要分配一塊較大的連續記憶體空間),是直接存入老年代的,還有很多從新生代的Survivor區域中熬過來的物件。

老年代中使用的是Full GC,Full GC所採用的是標記-清除演算法。老年代中的Full GC不像Minor GC操作那麼頻繁,並且進行一次Full GC所需要的時間要比Minor GC的時間長。

總結:

1、老年代中使用Full GC,採用的標記-清除演算法

相關推薦

JAVA虛擬機器新生代年代GC

Java堆可以分為新生代和老年代兩個區,其中新生代又可以分為一個Eden區和兩個Survivor區,兩個Survivor區分別被命名為From和To以示區分,新生代和老年代的比例為1:2,它們共同組成

JVM垃圾收集器(一) —— 概念新生代年代、並行併發

在上篇文章中我們講到了垃圾回收的幾種演算法。垃圾收集演算法是記憶體回收的方法論,而垃圾收集器是垃圾回收的具體實現。 在瞭解垃圾收集器之前,本篇文章先來簡單的說一下新生代和老年代、並行和併發的概念。 新生代和老年代 從記憶體回收的角度來看,一般我們可以將Java堆分

Java堆中的新生代年代以及相應的垃圾收集演算法

新生代 主要是用來存放新生的物件,會頻繁建立物件,所有垃圾收集會頻繁進行回收。在新生代中,每次垃圾收集時都發現有大批物件死去,只有少量存活,那就選用複製演算法,只需要付出少量存活物件的複製成本就可以完成收集。 複製演算法將記憶體分為三個區:一塊較大的Eden空間和兩塊較小的Su

java虛擬機器記憶體分配之新生代年代GC

1. Java堆中各代分佈: 圖1:Java堆中各代分佈 Young:主要是用來存放新生的物件。 Old:主要存放應用程式中生命週期長的記憶體物件。 Permanent:是指記憶體的永久儲存區域,主要存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域. 它和

java新生代年代

1.為什麼會有年輕代我們先來屢屢,為什麼需要把堆分代?不分代不能完成他所做的事情麼?其實不分代完全可以,分代的唯一理由就是優化GC效能。你先想想,如果沒有分代,那我們所有的物件都在一塊,GC的時候我們要找到哪些物件沒用,這樣就會對堆的所有區域進行掃描。而我們的很多物件都是朝生夕死的,如果分代的話,我們把新建立

Java堆記憶體_Young Gener_Old Generation_新生代年代

                                                  使用JDK8 Java 中的堆是 JVM 所管理的最大的一塊記憶體空間,主要用於存放各種類的例項物件。 在 Java 中,堆被劃分成兩個不同的區域:新生代 ( Young

Java新生代年代

堆記憶體 Java 中的堆是 JVM 所管理的最大的一塊記憶體空間,主要用於存放各種類的例項物件。 在 Java 中,堆被劃分成兩個不同的區域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被劃分為三個區域:Eden、Fr

Java堆空間的劃分新生代年代

預設Eden:S0:S1=8:1:1,因此,新生代中可以使用的記憶體空間大小佔用新生代的9/10,那麼有人就會問,為什麼不直接分成兩個區,一個區佔9/10,另一個區佔1/10,這樣做的原因大概有以下幾種  1.S0與S1的區間明顯較小,有效新生代空間為Eden+S0/S1,因此有效空間就大,增加了記憶體使用率

Java虛擬機器關於JDK8到JDK9-10的一點小變化(tools.jar、dt.jar)

關於JDK8到JDK9-10的一點小變化 JDK在每一次版本升級中,或多或少都會有一些比較重要的變化,或許在你使用的過程中,你就很有可能遇到。 一、Removed or Changed APIs JDK8在升級到9或者10的時候,有一些變化還是蠻顯著的。 今天我在編譯Ope

jvm中新生代年代的理解

堆用於儲存物件例項及陣列值,可以認為Java中所有通過new建立的物件的記憶體都在此分配,Heap中物件所佔用的記憶體由GC進行回收。為了讓記憶體回收更加高效,Sun JDK從1.2開始對堆採用了分代管理的方式。 1. 新生代(New Generation) 大多數情況下Java程式中

Java虛擬機器GC演算法深度解析

   在前面的文章裡介紹了可達性分析演算法,它為我們解決了判定哪些物件可以回收的問題,接下來就該我們的垃圾收集演算法出場了。不同的垃圾收集演算法有各自不同的優缺點,在JVM實現中,往往不是採用單一的一種演算法進行回收,而是採用幾種不同的演算法組合使用,來達到最好的收集效果。接下來

Java虛擬機器記憶體模型詳解

      我們都知道,當虛擬機器執行Java程式碼的時候,首先要把位元組碼檔案載入到記憶體,那麼這些類的資訊都存放在記憶體中的哪個區域呢?當我們建立一個物件例項的時候,虛擬機器要為物件分配記憶體,Java虛擬機器又是如何配分記憶體的呢?這些都涉及到Java虛擬機器的記

Java虛擬機器記憶體分配策略

  Java中提倡的自動記憶體管理機制最終可以歸結為自動化的解決兩個問題:給物件分配記憶體和回收分配給物件的記憶體。在之前的部落格中已經詳細講解了記憶體回收體系及原理,下面我們來探討給物件分配記憶體那些事兒。        物件的記憶體分配,總體

Java虛擬機器類載入機制詳解

    大家知道,我們的Java程式被編譯器編譯成class檔案,在class檔案中描述的各種資訊,最終都需要載入到虛擬機器記憶體才能執行和使用,那麼虛擬機器是如何載入這些class檔案的呢?在載入class檔案的過程中虛擬機器又幹了哪些事呢?今天我們來解密虛擬機器的類載入機制。

Java虛擬機器 Java垃圾回收(GC)機制詳解

轉自:http://www.importnew.com/28413.html 哪些記憶體需要回收? 哪些記憶體需要回收是垃圾回收機制第一個要考慮的問題,所謂“要回收的垃圾”無非就是那些不可能再被任何途徑使用的物件。那麼如何找到這些物件? 1、引用計數法 這個演算法的實現是,給物件中新

深入學習Java虛擬機器記憶體模型

在Java中,分配記憶體和回收記憶體都由JVM自動完成。   內容:首先從作業系統層面簡單介紹實體記憶體的分配和Java執行的記憶體分配之間的關係,明白在Java中使用的記憶體與實體記憶體區別。Java如何使用從實體記憶體申請下來的記憶體,以及如何來劃分它們,如何分配和回收記憶

聊聊 Java 虛擬機器類的載入過程

我們都知道 Java 原始檔通過編譯器 javac 命令能夠編譯生成相應的 class 檔案,即二進位制位元組碼檔案。Java 虛擬機器將描述類或介面的 class 檔案(準確地說,應該是類的二進位制位元組流)載入到記憶體,對資料進行校驗、轉換解析和初始化,最終形成能夠被虛擬機器直接使用的 Java 型別

Java虛擬機器執行時資料區域-《深入理解Java虛擬機器》筆記

以下內容為周志明《深入理解Java虛擬機器》中的內容摘要。寫本文來作為學習筆記。 Java 虛擬機器在執行時會將管理的記憶體劃分成若干個區域,這些區域各有各的用途,以及各自的建立和銷燬的時間。 有些隨著

實戰JAVA虛擬機器G1

G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1擁有獨特的垃圾回收策略,從分代上看,G1依然屬於分代垃圾回收器,它會區分年代和老年代,依然有eden和survivor區,但從堆的結構上看,它並不要求整個eden區、年清代或

實戰JAVA虛擬機器在TLAB上分配物件

TLAB全稱是Thread Local Allocation Buffer 即執行緒本地分配快取,從名字上看是一個執行緒專用的記憶體分配區域。 為什麼需要TLAB這個區域呢?這是為了加速物件分配而生的。由於物件一般會分配在堆上,而堆是全域性共享的。所以存在多個執