欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場(chǎng)景

 更新時(shí)間:2024年04月22日 08:51:50   作者:橙哥分享  
這篇文章主要介紹了關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

jvm的垃圾回收器以及觸發(fā)full gc的場(chǎng)景

JVM(Java虛擬機(jī))的垃圾回收器有很多種,主要包括以下幾種:

  • Serial收集器:串行收集器是最古老、最穩(wěn)定的收集器。它使用單個(gè)線程進(jìn)行垃圾收集工作,在進(jìn)行垃圾回收時(shí)會(huì)暫停所有用戶線程。
  • ParNew收集器:ParNew是Serial收集器的多線程版本,也被稱為“并行年輕代收集器”,可以與CMS收集器配合使用。
  • Parallel收集器:Parallel收集器是一種多線程并行的垃圾收集器,用于新生代和老年代的回收。
  • CMS收集器:CMS(Concurrent Mark-Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,主要用于老年代的垃圾回收。
  • G1收集器:G1(Garbage-First)收集器是一種面向服務(wù)端應(yīng)用的垃圾收集器,逐步取代CMS收集器,具有更可控的停頓時(shí)間和高效的并發(fā)能力。

除了上述列出的垃圾回收器之外,還有其他一些實(shí)驗(yàn)性質(zhì)或特定用途的收集器,如ZGC(Z Garbage Collector)和Shenandoah等。

不同的垃圾回收器適用于不同的場(chǎng)景和需求,開發(fā)人員可以根據(jù)應(yīng)用的特點(diǎn)選擇合適的垃圾回收器來(lái)優(yōu)化性能。

Full GC(Full Garbage Collection)是Java中一種對(duì)整個(gè)堆內(nèi)存進(jìn)行清理和整理的操作,它會(huì)停止應(yīng)用程序的所有線程,包括Young Generation和Old Generation的內(nèi)存區(qū)域都會(huì)被掃描和回收。

Full GC通常發(fā)生在以下幾種情況下:

  • 當(dāng)Eden區(qū)滿了,并且觸發(fā)Minor GC后,存活對(duì)象無(wú)法全部晉升到Survivor區(qū)時(shí),會(huì)將剩余的對(duì)象直接放入老年代,如果老年代空間不足以容納這些對(duì)象,就會(huì)觸發(fā)Full GC。
  • 在Old Generation中進(jìn)行大對(duì)象分配時(shí),如果無(wú)法找到足夠的連續(xù)空間來(lái)分配該大對(duì)象,也會(huì)觸發(fā)Full GC。
  • 永久代(在JDK 8之前)或元空間(在JDK 8及更高版本)內(nèi)存不足時(shí),可能會(huì)觸發(fā)Full GC。
  • 顯式調(diào)用System.gc()方法,通知虛擬機(jī)執(zhí)行Full GC。
  • CMS(Concurrent Mark-Sweep)垃圾收集器在并發(fā)標(biāo)記階段出現(xiàn)"Concurrent Mode Failure"時(shí),會(huì)導(dǎo)致一次Full GC。

需要注意的是,F(xiàn)ull GC的頻繁發(fā)生會(huì)影響系統(tǒng)的性能,因此在實(shí)際開發(fā)中需要合理設(shè)置堆內(nèi)存大小、優(yōu)化程序設(shè)計(jì)以盡量減少Full GC的發(fā)生。

jvm垃圾回收面試題

如何判斷對(duì)象是否死亡(兩種方法)

引用計(jì)數(shù)法對(duì)象 + 一個(gè)引用計(jì)數(shù)器,引用 +1;失效 -1;任何時(shí)候計(jì)數(shù)器為 0 的對(duì)象就是不可能再被使用的。

這個(gè)方法實(shí)現(xiàn)簡(jiǎn)單,效率高,但是目前主流的虛擬機(jī)中并沒有選擇這個(gè)算法來(lái)管理內(nèi) 存,其最主要的原因是它很難解決對(duì)象之間相互循環(huán)引用的問(wèn)題。

可達(dá)性分析算法 “GC Roots” 對(duì)象為起點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,節(jié)點(diǎn)所走過(guò)的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連的話,則證明此對(duì)象是不可用的。

可作為 GC Roots 的對(duì)象包括下面幾種:

  • 虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象
  • 本地方法棧(Native 方法)中引用的對(duì)象
  • 方法區(qū)中類靜態(tài)屬性引用的對(duì)象
  • 方法區(qū)中常量引用的對(duì)象
  • 所有被同步鎖持有的對(duì)象

簡(jiǎn)單的介紹一下強(qiáng)引用、軟引用、弱引用、虛引用

(虛引用與軟引用和弱引用的區(qū) 別、使用軟引用能帶來(lái)的好處)。

JDK1.2 前,傳統(tǒng)引用定義:reference 類型數(shù)據(jù)存儲(chǔ)數(shù)值代表另一塊內(nèi)存的起始地址。

JDK1.2 后,引用擴(kuò)充,分為強(qiáng)、軟、弱、虛四種(引用強(qiáng)度逐漸減弱)

強(qiáng)引用,垃圾回收器不回收。當(dāng)內(nèi)存不足,Java 虛擬機(jī)拋出 OutOfMemoryError 錯(cuò)誤

軟引用,內(nèi)存空間足夠,不回收。內(nèi)存不足,回收??蓪?shí)現(xiàn)內(nèi)存敏感的高速緩存。 如果軟引用的對(duì)象被垃圾回收,jvm把軟引用加入關(guān)聯(lián)引用隊(duì)列。

軟引用加速垃圾回收,維護(hù)系統(tǒng)安全,防止(OOM)等問(wèn)題的產(chǎn)生。

弱引用,弱、軟區(qū)別——弱對(duì)象生命周期更短。不管內(nèi)存空間是否足夠,都回收。

虛引用,虛引用不決定對(duì)象生命周期。在任何時(shí)候可能被垃圾回收。虛引用跟蹤對(duì)象被垃圾回收的活動(dòng)。

虛引用與軟引用和弱引用的區(qū)別: 虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。

如何判斷一個(gè)常量是廢棄常量

1. JDK1.7 之前,運(yùn)行時(shí)常量池 (字符串常量池)→→方法區(qū), 方法區(qū)實(shí)現(xiàn)永久代

2. JDK1.7 字符串常量池→→堆, 運(yùn)行時(shí)常量池→→方法區(qū)。

3. JDK1.8 元空間 取代 永久代, 字符串常量池→→堆, 運(yùn)行時(shí)常量池→→方法區(qū),方法區(qū)實(shí)現(xiàn)元空間

字符串常量池中存在字符串 "abc",當(dāng)前沒有任何 String 對(duì)象引用,就說(shuō)明常量 "abc" 就是廢棄常量,如果這時(shí)發(fā)生內(nèi)存回收,"abc" 被清理。

如何判斷一個(gè)類是無(wú)用的類

  • 該類所有實(shí)例被回收。
  • ClassLoader 被回收。
  • java.lang.Class 對(duì)象不被引用,無(wú)法通過(guò)反射訪問(wèn)。

垃圾收集有哪些算法,各自的特點(diǎn)?

標(biāo)記-清除/復(fù)制/整理、分代收集

標(biāo)記-清除算法“標(biāo)記”出所有不回收對(duì)象,“清除”回收沒有被標(biāo)記對(duì)象。

1. 效率問(wèn)題 2. 空間問(wèn)題(標(biāo)記清除后會(huì)產(chǎn)生大量不連續(xù)的碎片)

標(biāo)記-復(fù)制算法內(nèi)存分為兩塊, 每次用一塊。一塊用完,將存活對(duì)象復(fù)制到另一塊, 然后清理使用的空間。每次對(duì)內(nèi)存一半回收。

標(biāo)記-整理算法“標(biāo)記”出所有不回收對(duì)象,所有存活對(duì)象向一端移動(dòng),清理端邊界以外內(nèi)存。

分代收集算法根據(jù)對(duì)象存活周期不同將內(nèi)存分為幾塊。一般將 java 堆分為新生代和老年代。

比如新生代中,每次收集都會(huì)有大量對(duì)象死去,選擇”標(biāo)記-復(fù)制“算法,付出少量對(duì)象的復(fù)制成本。老年代的對(duì)象存活率比較高,必須選擇“標(biāo)記-清除”或“標(biāo)記-整理”算法進(jìn)行垃圾收集。

HotSpot 為什么要分為新生代和老年代?

常見的垃圾回收器有哪些?

Serial 收集器一個(gè)單線程收集器。新生代采用標(biāo)記-復(fù)制算法,老年代采用標(biāo)記-整理算法。簡(jiǎn)單高效。適合Client 模式下的虛擬機(jī)

ParNew 收集器是 Serial 收集器的多線程版本,能與 CMS 收集器工作。適合Server 模式下的虛擬機(jī)

Parallel Scavenge 收集器Parallel Scavenge 收集器關(guān)注點(diǎn)是吞吐量(運(yùn)行用戶代碼時(shí)間與 CPU 總消耗時(shí)間的比值)。CMS 等垃圾收集器 關(guān)注點(diǎn)是用戶線程的停頓時(shí)間(提高用戶體驗(yàn))。

Serial Old 收集器 Serial 收集器的老年代版本,一個(gè)單線程收集器。兩大用途:JDK1.5 以前與 Parallel Scavenge 收集器搭配使用,另一種用途是作為 CMS 收集器的后備方案。

Parallel Old 收集器 Parallel Scavenge 收集器的老年代版本。使用多線程和“標(biāo)記-整理”算法。在注重吞吐量 以及 CPU 資源的場(chǎng)合,優(yōu)先考慮 Parallel Scavenge 收集器和 Parallel Old 收集 器。

CMS(Concurrent Mark Sweep)收集器一種獲取最短回收停頓時(shí)間為目標(biāo)的收集器。 第一款并發(fā)收集器,第一次實(shí)現(xiàn)垃圾收集線程與用戶線程同時(shí)工作。優(yōu)點(diǎn):并發(fā)收集、低停頓。缺點(diǎn):CPU 資源敏感; 無(wú)法處理浮動(dòng)垃圾; “標(biāo)記-清除”算法結(jié)束時(shí)產(chǎn)生大量空間碎片。

  • 初始標(biāo)記: 暫停所有線程,記錄 root 相連對(duì)象
  • 并發(fā)標(biāo)記: 同時(shí)開啟 GC 和用戶線程,閉包記錄可達(dá)對(duì)象。
  • 重新標(biāo)記: 修正并發(fā)標(biāo)記期間標(biāo)記產(chǎn)生變動(dòng)的標(biāo)記記錄
  • 并發(fā)清除: 開啟用戶線程,同時(shí) GC 線程對(duì)未標(biāo)記的區(qū)域做清掃。

G1 (Garbage-First)一款面向服務(wù)器的垃圾收集器。高概率滿足 GC 停頓時(shí)間要求,高吞吐量性能特征。被視為 JDK1.7 中 HotSpot 虛擬機(jī)的一個(gè)重要進(jìn)化特征。

  • 并行與并發(fā):G1 充分利用 CPU、多核環(huán)境,縮短 Stop-The-World 停頓時(shí)間。
  • 分代收集:保留分代概念。
  • 空間整合:G1 整體“標(biāo)記-整理”;局部“標(biāo)記-復(fù)制”。
  • 可預(yù)測(cè)的停頓:G1 除了追求低停頓外,建立可預(yù)測(cè)的停頓時(shí)間模型。

G1 收集器的運(yùn)作: 初始標(biāo)記 并發(fā)標(biāo)記 最終標(biāo)記 篩選回收

G1 收集器在后臺(tái)維護(hù)了一個(gè)優(yōu)先列表,每次根據(jù)允許的收集時(shí)間,優(yōu)先選擇回收價(jià)值 最大的 Region(這也就是它的名字 Garbage-First 的由來(lái)) 。

ZGC 收集器 與 CMS 中的 ParNew 和 G1 類似,ZGC 也采用標(biāo)記-復(fù)制算法,不過(guò) ZGC 對(duì)該算法做了重大改進(jìn)。

介紹一下 CMS,G1 收集器。 Minor Gc 和 Full GC 有什么不同呢?

部分收集 (Partial GC)

新生代收集(Minor GC / Young GC):只對(duì)新生代進(jìn)行垃圾收集;老年代收集(Major GC / Old GC):只對(duì)老年代進(jìn)行垃圾收集。需要注意的是 Major GC 在有的語(yǔ)境中也用于指代整堆收集;混合收集(Mixed GC):對(duì)整個(gè)新生代和部分老年代進(jìn)行垃圾收集。

整堆收集 (Full GC):收集整個(gè) Java 堆和方法區(qū)。

Minor GC觸發(fā)條件:當(dāng)Eden區(qū)滿時(shí),觸發(fā)Minor GC。

Full GC觸發(fā)條件

  • 通過(guò)Minor GC后進(jìn)入老年代的平均大小大于老年代的可用內(nèi)存。如果發(fā)現(xiàn)統(tǒng)計(jì)數(shù)據(jù)說(shuō)之前Minor GC的平均晉升大小比目前old gen剩余的空間大,則不會(huì)觸發(fā)Minor GC而是轉(zhuǎn)為觸發(fā)full GC。
  • 老年代空間不夠分配新的內(nèi)存(或永久代空間不足,但只是JDK1.7有的,這也是用元空間來(lái)取代永久代的原因,可以減少Full GC的頻率,減少GC負(fù)擔(dān),提升其效率)。
  • 由Eden區(qū)、From Space區(qū)向To Space區(qū)復(fù)制時(shí),對(duì)象大小大于To Space可用內(nèi)存,則把該對(duì)象轉(zhuǎn)存到老年代,且老年代的可用內(nèi)存小于該對(duì)象大小。
  • 調(diào)用System.gc時(shí),系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis查詢無(wú)記錄時(shí)的返回值問(wèn)題

    MyBatis查詢無(wú)記錄時(shí)的返回值問(wèn)題

    這篇文章主要介紹了MyBatis查詢無(wú)記錄時(shí)的返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • MyBatis-Plus代碼生成器的使用詳解

    MyBatis-Plus代碼生成器的使用詳解

    這篇文章主要介紹了MyBatis-Plus代碼生成器的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring3 MVC請(qǐng)求參數(shù)獲取的幾種方法小結(jié)

    Spring3 MVC請(qǐng)求參數(shù)獲取的幾種方法小結(jié)

    本篇文章主要介紹了Spring3 MVC請(qǐng)求參數(shù)獲取的幾種方法小結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • SpringBoot接口調(diào)用之后報(bào)404問(wèn)題的解決方案

    SpringBoot接口調(diào)用之后報(bào)404問(wèn)題的解決方案

    這篇文章主要介紹了SpringBoot接口調(diào)用之后報(bào)404問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-06-06
  • springboot操作ldap全過(guò)程

    springboot操作ldap全過(guò)程

    這篇文章主要介紹了springboot操作ldap全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺談Java開發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地

    淺談Java開發(fā)架構(gòu)之領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD落地

    DDD(Domain-Driven Design 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))是由Eric Evans最先提出,目的是對(duì)軟件所涉及到的領(lǐng)域進(jìn)行建模,以應(yīng)對(duì)系統(tǒng)規(guī)模過(guò)大時(shí)引起的軟件復(fù)雜性的問(wèn)題
    2021-06-06
  • springboot用戶數(shù)據(jù)修改的詳細(xì)實(shí)現(xiàn)

    springboot用戶數(shù)據(jù)修改的詳細(xì)實(shí)現(xiàn)

    用戶管理功能作為所有的系統(tǒng)是必不可少的一部分,下面這篇文章主要給大家介紹了關(guān)于springboot用戶數(shù)據(jù)修改的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 淺談java定時(shí)器的發(fā)展歷程

    淺談java定時(shí)器的發(fā)展歷程

    這篇文章主要介紹了淺談java定時(shí)器的發(fā)展歷程,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Mybatis velocity腳本的使用教程詳解(推薦)

    Mybatis velocity腳本的使用教程詳解(推薦)

    很多朋友不清楚在mybatis可以使用各種腳本語(yǔ)言來(lái)定義Mapper文件里面的動(dòng)態(tài)SQL;目前mybatis支持的腳本語(yǔ)言有XML(默認(rèn)的);Velocity和Freemarker三種。下面通過(guò)本文給大家介紹Mybatis velocity腳本的使用,一起看看吧
    2016-11-11
  • SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的實(shí)戰(zhàn)案例

    SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的實(shí)戰(zhàn)案例

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的實(shí)戰(zhàn)案例,文中通過(guò)示例代碼和圖文展示介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2024-01-01

最新評(píng)論