国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java虛擬機(JVM)垃圾收集器、新生代、老年代、永久代以及內(nèi)存分配策略

這篇具有很好參考價值的文章主要介紹了Java虛擬機(JVM)垃圾收集器、新生代、老年代、永久代以及內(nèi)存分配策略。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java新生代和老年代,JVM,jvm,java,算法

1. 垃圾收集器以及新生代、老年代、永久代

1.1 講一下新生代、老年代、永久代的區(qū)別

java新生代和老年代,JVM,jvm,java,算法

  • 在 Java 中,堆被劃分成兩個不同的區(qū)域:新生代 ( Young )、老年代 ( Old )。而新生代 ( Young ) 又被劃分為三個區(qū)域:Eden、From Survivor、To Survivor。這樣劃分的目的是為了使 JVM 能夠更好的管理堆內(nèi)存中的對象,包括內(nèi)存的分配以及回收。
  • 新生代中一般保存新出現(xiàn)的對象,所以每次垃圾收集時都發(fā)現(xiàn)大批對象死去,只有少量對象存活,便采用了復制算法,只需要付出少量存活對象的復制成本就可以完成收集。
  • 老年代中一般保存存活了很久的對象,他們存活率高、沒有額外空間對它進行分配擔保,就必須采用“標記-清理”或者“標記-整理”算法。
  • 永久代就是JVM的方法區(qū)。在這里都是放著一些被虛擬機加載的類信息,靜態(tài)變量,常量等數(shù)據(jù)。這個區(qū)中的東西比老年代和新生代更不容易回收。

1.2 Minor GC、Major GC、Full GC是什么

  • Minor GC是新生代GC,指的是發(fā)生在新生代的垃圾收集動作。由于java對象大都是朝生夕死的,所以Minor GC非常頻繁,一般回收速度也比較快。(一般采用復制算法回收垃圾)
  • Major GC是老年代GC,指的是發(fā)生在老年代的GC,通常執(zhí)行Major GC會連著Minor GC一起執(zhí)行。Major GC的速度要比Minor GC慢的多。(可采用標記清楚法和標記整理法)
  • Full GC是清理整個堆空間,包括年輕代和老年代

1.3 Minor GC、Major GC、Full GC區(qū)別及觸發(fā)條件

  • Minor GC 觸發(fā)條件一般為:
    • eden區(qū)滿時,觸發(fā)MinorGC。即申請一個對象時,發(fā)現(xiàn)eden區(qū)不夠用,則觸發(fā)一次MinorGC。
    • 新創(chuàng)建的對象大小 > Eden所??臻g時觸發(fā)Minor GC
  • Major GC和Full GC 觸發(fā)條件一般為:
    Major GC通常是跟full GC是等價的
    • 每次晉升到老年代的對象平均大小>老年代剩余空間
    • MinorGC后存活的對象超過了老年代剩余空間
    • 永久代空間不足
    • 執(zhí)行System.gc()
    • CMS GC異常
    • 堆內(nèi)存分配很大的對象

1.4 為什么新生代要分Eden和兩個 Survivor 區(qū)域?

  • 如果沒有Survivor,Eden區(qū)每進行一次Minor GC,存活的對象就會被送到老年代。老年代很快被填滿,觸發(fā)Major GC.老年代的內(nèi)存空間遠大于新生代,進行一次Full GC消耗的時間比Minor GC長得多,所以需要分為Eden和Survivor。
  • Survivor的存在意義,就是減少被送到老年代的對象,進而減少Full GC的發(fā)生,Survivor的預篩選保證,只有經(jīng)歷15次Minor GC還能在新生代中存活的對象,才會被送到老年代。
  • 設置兩個Survivor區(qū)最大的好處就是解決了碎片化,剛剛新建的對象在Eden中,經(jīng)歷一次Minor GC,Eden中的存活對象就會被移動到第一塊survivor space S0,Eden被清空;等Eden區(qū)再滿了,就再觸發(fā)一次Minor GC,Eden和S0中的存活對象又會被復制送入第二塊survivor space S1(這個過程非常重要,因為這種復制算法保證了S1中來自S0和Eden兩部分的存活對象占用連續(xù)的內(nèi)存空間,避免了碎片化的發(fā)生)

1.5 Java堆老年代( Old ) 和新生代 ( Young ) 的默認比例?

  • 默認的新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) –XX:NewRatio 來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。老年代 ( Old ) = 2/3 的堆空間大小。
  • 其中,新生代 ( Young ) 被細分為 Eden 和 兩個 Survivor 區(qū)域,Edem 和倆個Survivor 區(qū)域比例是 = 8 : 1 : 1 ( 可以通過參數(shù) –XX:SurvivorRatio 來設定 ),
  • 但是JVM 每次只會使用 Eden 和其中的一塊 Survivor 區(qū)域來為對象服務,所以無論什么時候,總是有一塊 Survivor 區(qū)域是空閑著的。

1.6 為什么要這樣分代:

  • 其實主要原因就是可以根據(jù)各個年代的特點進行對象分區(qū)存儲,更便于回收,采用最適當?shù)氖占惴ǎ?
    • 新生代中,每次垃圾收集時都發(fā)現(xiàn)大批對象死去,只有少量對象存活,便采用了復制算法,只需要付出少量存活對象的復制成本就可以完成收集。
    • 而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須采用“標記-清理”或者“標記-整理”算法。
  • 新生代又分為Eden和Survivor (From與To,這里簡稱一個區(qū))兩個區(qū)。加上老年代就這三個區(qū)。數(shù)據(jù)會首先分配到Eden區(qū)當中(當然也有特殊情況,如果是大對象那么會直接放入到老年代(大對象是指需要大量連續(xù)內(nèi)存空間的java對象)。當Eden沒有足夠空間的時候就會觸發(fā)jvm發(fā)起一次Minor GC,。如果對象經(jīng)過一次Minor-GC還存活,并且又能被Survivor空間接受,那么將被移動到Survivor空間當中。并將其年齡設為1,對象在Survivor每熬過一次Minor GC,年齡就加1,當年齡達到一定的程度(默認為15)時,就會被晉升到老年代中了,當然晉升老年代的年齡是可以設置的。

1.7 什么是垃圾回收器他和垃圾算法有什么區(qū)別

  • 垃圾收集器是垃圾回收算法(標記清楚法、標記整理法、復制算法、分代算法)的具體實現(xiàn),不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能會有很在差別。

1.8 說一下 JVM 有哪些垃圾回收器?

  • 如果說垃圾收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。下圖展示了7種作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,還有用于回收整個Java堆的G1收集器。不同收集器之間的連線表示它們可以搭配使用。
    java新生代和老年代,JVM,jvm,java,算法java新生代和老年代,JVM,jvm,java,算法
    • Serial收集器(復制算法): 新生代單線程收集器,標記和清理都是單線程,優(yōu)點是簡單高效;
    • ParNew收集器 (復制算法): 新生代收并行集器,實際上是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn);
    • Parallel Scavenge收集器 (復制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用戶線程時間/(用戶線程時間+GC線程時間),高吞吐量可以高效率的利用CPU時間,盡快完成程序的運算任務,適合后臺應用等對交互相應要求不高的場景;
    • Serial Old收集器 (標記-整理算法): 老年代單線程收集器,Serial收集器的老年代版本;
    • Parallel Old收集器 (標記-整理算法):老年代并行收集器,吞吐量優(yōu)先,Parallel Scavenge收集器的老年代版本;
    • CMS(Concurrent Mark Sweep)收集器(標記-清除算法):老年代并行收集器,以獲取最短回收停頓時間為目標的收集器,具有高并發(fā)、低停頓的特點,追求最短GC回收停頓時間。
    • G1(Garbage First)收集器 ( 標記整理 + 復制算法來回收垃圾 ):Java堆并行收集器,G1收集器是JDK1.7提供的一個新收集器,G1收集器基于“標記-整理”算法實現(xiàn),也就是說不會產(chǎn)生內(nèi)存碎片。此外,G1收集器不同于之前的收集器的一個重要特點是:G1回收的范圍是整個Java堆(包括新生代,老年代),而前六種收集器回收的范圍僅限于新生代或老年代。

1.9 收集器可以這么分配?(了解就好了)

Serial / Serial Old
Serial / CMS
ParNew / Serial Old
ParNew / CMS
Parallel Scavenge / Serial Old
Parallel Scavenge / Parallel Old
G1

1.10 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么區(qū)別?

  • 新生代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS
  • 整堆回收器:G1

新生代垃圾回收器一般采用的是復制算法,復制算法的優(yōu)點是效率高,缺點是內(nèi)存利用率低;老年代回收器一般采用的是標記-整理的算法進行垃圾回收。文章來源地址http://www.zghlxwxcb.cn/news/detail-760133.html

1.11 簡述分代垃圾回收器是怎么工作的?

  • 分代回收器有兩個分區(qū):老生代和新生代,新生代默認的空間占比總空間的 1/3,老生代的默認占比是 2/3。
  • 新生代使用的是復制算法,新生代里有 3 個分區(qū):Eden、To Survivor、From Survivor,它們的默認占比是 8:1:1,它的執(zhí)行流程如下:
    • 把 Eden + From Survivor 存活的對象放入 To Survivor 區(qū);
    • 清空 Eden 和 From Survivor 分區(qū);
    • From Survivor 和 To Survivor 分區(qū)交換,F(xiàn)rom Survivor 變 To Survivor,To Survivor 變 From Survivor。
  • 每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當年齡到達 15(默認配置是 15)時,升級為老生代。大對象也會直接進入老生代。
  • 老生代當空間占用到達某個值之后就會觸發(fā)全局垃圾收回,一般使用標記整理的執(zhí)行算法。以上這些循環(huán)往復就構成了整個分代垃圾回收的整體執(zhí)行流程。

2. 內(nèi)存分配策略

2.1 簡述java內(nèi)存分配與回收策率以及Minor GC和Major GC

  • 所謂自動內(nèi)存管理,最終要解決的也就是內(nèi)存分配和內(nèi)存回收兩個問題。前面我們介紹了內(nèi)存回收,這里我們再來聊聊內(nèi)存分配。
  • 對象的內(nèi)存分配通常是在 Java 堆上分配(隨著虛擬機優(yōu)化技術的誕生,某些場景下也會在棧上分配,后面會詳細介紹),對象主要分配在新生代的 Eden 區(qū),如果啟動了本地線程緩沖,將按照線程優(yōu)先在 TLAB 上分配。少數(shù)情況下也會直接在老年代上分配??偟膩碚f分配規(guī)則不是百分百固定的,其細節(jié)取決于哪一種垃圾收集器組合以及虛擬機相關參數(shù)有關,但是虛擬機對于內(nèi)存的分配還是會遵循以下幾種「普世」規(guī)則:

2.1.1 對象優(yōu)先在 Eden 區(qū)分配

  • 多數(shù)情況,對象都在新生代 Eden 區(qū)分配。當 Eden 區(qū)分配沒有足夠的空間進行分配時,虛擬機將會發(fā)起一次 Minor GC。如果本次 GC 后還是沒有足夠的空間,則將啟用分配擔保機制在老年代中分配內(nèi)存。
    • 這里我們提到 Minor GC,如果你仔細觀察過 GC 日常,通常我們還能從日志中發(fā)現(xiàn) Major GC/Full GC。
    • Minor GC 是指發(fā)生在新生代的 GC,因為 Java 對象大多都是朝生夕死,所有 Minor GC 非常頻繁,一般回收速度也非???;
    • Major GC/Full GC 是指發(fā)生在老年代的 GC,出現(xiàn)了 Major GC 通常會伴隨至少一次 Minor GC。Major GC 的速度通常會比 Minor GC 慢 10 倍以上。

2.1.2 為什么大對象直接進入老年代

  • 所謂大對象是指需要大量連續(xù)內(nèi)存空間的對象,頻繁出現(xiàn)大對象是致命的,會導致在內(nèi)存還有不少空間的情況下提前觸發(fā) GC 以獲取足夠的連續(xù)空間來安置新對象。
  • 前面我們介紹過新生代使用的是標記-清除算法來處理垃圾回收的,如果大對象直接在新生代分配就會導致 Eden 區(qū)和兩個 Survivor 區(qū)之間發(fā)生大量的內(nèi)存復制。因此對于大對象都會直接在老年代進行分配。

2.1.3 長期存活對象將進入老年代

  • 虛擬機采用分代收集的思想來管理內(nèi)存,那么內(nèi)存回收時就必須判斷哪些對象應該放在新生代,哪些對象應該放在老年代。因此虛擬機給每個對象定義了一個對象年齡的計數(shù)器,如果對象在 Eden 區(qū)出生,并且能夠被 Survivor 容納,將被移動到 Survivor 空間中,這時設置對象年齡為 1。對象在 Survivor 區(qū)中每「熬過」一次 Minor GC 年齡就加 1,當年齡達到一定程度(默認 15) 就會被晉升到老年代。
    java新生代和老年代,JVM,jvm,java,算法

到了這里,關于Java虛擬機(JVM)垃圾收集器、新生代、老年代、永久代以及內(nèi)存分配策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • JVM垃圾回收——G1垃圾收集器

    JVM垃圾回收——G1垃圾收集器

    目錄 一、什么是G1垃圾收集器 二、G1垃圾收集器的內(nèi)存劃分 三、G1垃圾收集器的收集過程 ?四、G1收集器的優(yōu)缺點 五、G1收集器的JVM參數(shù)配置 ????????Garbage First(簡稱G1)收集器是垃圾收集器技術發(fā)展史上里程碑式的成果,它摒棄了傳統(tǒng)垃圾收集器的嚴格的內(nèi)存劃分,而是采

    2024年02月05日
    瀏覽(26)
  • JVM--- 垃圾收集器詳細整理

    JVM--- 垃圾收集器詳細整理

    目錄 一、垃圾收集需要考慮的三個事情: 二、垃圾回收針對的區(qū)域 三、如何判斷對象已死 ? ? ? ? 1.引用計數(shù)算法: ? ? ? ? 2.可達性分析算法 四、引用 五、生存還是死亡? 六、回收方法區(qū) 七、垃圾收集算法 ? ? ? ? 1.分代收集理論 2.標記-清除算法 ????????3.標記

    2024年02月19日
    瀏覽(30)
  • JVM ZGC垃圾收集器

    JVM ZGC垃圾收集器

    ZGC(“Z”并非什么專業(yè)名詞的縮寫,這款收集器的名字就叫作Z Garbage Collector)是一款在JDK 11中新加入的具有實驗性質(zhì)[1]的低延遲垃圾收集器,是由Oracle公司研發(fā)的。 ZGC收集器 是一款基于Region內(nèi)存布局的,(暫時)不設分代的,使用了讀屏障、染色指針和內(nèi)存多重映射等技術

    2024年02月10日
    瀏覽(24)
  • 08-JVM垃圾收集器詳解

    08-JVM垃圾收集器詳解

    上一篇:07-垃圾收集算法詳解 如果說收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。 雖然我們對各個收集器進行比較,但并非為了挑選出一個最好的收集器。因為直到現(xiàn)在為止還沒有最好的垃圾收集器出現(xiàn),更加沒有萬能的垃圾收集器,我們能做

    2024年02月09日
    瀏覽(30)
  • 深入理解JVM垃圾收集器

    深入理解JVM垃圾收集器

    相關系列 深入理解JVM垃圾收集算法-CSDN博客 目前市面常見的垃圾收集器有Serial、ParNew、Parallel、CMS、Serial Old、Parallel Old、G1、ZGC以及有二種不常見的Epsilon、Shenandoah的,從上圖可以看到有連線的的垃圾收集器是可以組合使用,是年輕代+老年代。為什么會出現(xiàn)這么多的垃圾收集

    2024年04月09日
    瀏覽(24)
  • JVM:垃圾收集器(7種)

    JVM:垃圾收集器(7種)

    如果兩個收集器之間存在連線,就說明它們可以搭配使用。它們說在的區(qū)域則表示這個收集器屬于新生代收集器還是老年代收集器。其中Serial(串行)、Parallel(并行) ? ? ? ? Serial收集器是最基礎、歷史最悠久的收集器,是HotSpot虛擬機新生代收集器的唯一選擇。這個收集器

    2024年01月20日
    瀏覽(22)
  • JVM的故事——垃圾收集器

    JVM的故事——垃圾收集器

    新生代收集器,最基礎的收集器,單線程。進行垃圾收集時必須暫停其他所有工作線程,stop the world 新生代收集器,實質(zhì)上是serial收集器的多線程版本。除了serial,只有它能和CMS收集器(老年代收集器)配合工作。隨著處理器核心數(shù)越來越多,parnew比serial有著更好的性能。(但如

    2024年02月10日
    瀏覽(29)
  • JVM-垃圾回收(標記算法,收集器)

    JVM-垃圾回收(標記算法,收集器)

    申明:文章內(nèi)容是本人學習極客時間課程所寫,文字和圖片基本來源于課程資料,在某些地方會插入一點自己的理解,未用于商業(yè)用途,侵刪。 原資料地址:課程資料 垃圾回收的基本原理 1 什么是垃圾? 在內(nèi)存中,沒有被引用的對象就是垃圾。 2 如果找到垃圾對象? 引用計

    2024年02月21日
    瀏覽(31)
  • ZGC垃圾收集器-JVM(十五)

    上篇文章說了G1的特性,無分代,復制算法,大內(nèi)存就可以用G1,可預測stw時間等特性。 G1垃圾收集分類-JVM(十四) ZGC收集器 -XX:+UseZGC ZGC(Z Garbage Collector)是在jdk11新加入的低延遲垃圾收集器。 Zgc有四個目標 : 支持至少TB級別堆內(nèi)存回收。(目前4TB) STW保持在10ms之內(nèi)。 吞

    2024年02月16日
    瀏覽(19)
  • G1垃圾收集器-JVM(十三)

    G1垃圾收集器-JVM(十三)

    上篇文章說了CMS垃圾收集器使用以及三色標記如何解決cms的一些問題。分別有初始標記,并發(fā)標記,重新標記,并發(fā)清理,并發(fā)重置。 CMS垃圾收集器三色標記-JVM(十二) G1收集器(Garbage-First) -XX:+UseG1GC 這是一款面向服務器的垃圾收集器,主要針對 設備多核cpu和大內(nèi)存的機

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包