最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM原理之完整的一次GC流程解讀

 更新時間:2022年12月28日 11:18:40   作者:DayDayUp丶  
這篇文章主要介紹了JVM原理之完整的一次GC流程解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

JVM 的 GC 是指垃圾回收,主要是對堆內(nèi)存的回收。

本文將介紹 JVM 中一次完整的 GC 流程是怎樣的,首先拋出第一個問題,什么樣的對象會是 JVM 回收的目標(biāo)?

一、可達(dá)性分析算法(GC Roots)

有一種引用計數(shù)法,可以用來判斷對象被引用的次數(shù),如果引用次數(shù)為0,則代表可以被回收。

這種實現(xiàn)方式比較簡單,但對于循環(huán)引用的情況束手無策,所以 Java 采用了可達(dá)性分析算法

即判斷某個對象是否與 GC Roots 的這類對象之間的路徑可達(dá),若不可達(dá),則有可能成為回收對象,被判定為不可達(dá)的對象要成為可回收對象必須至少經(jīng)歷兩次標(biāo)記過程,如果在這兩次標(biāo)記過程中仍然沒有逃脫成為可回收對象的可能性,則基本上就真的成為可回收對象了。

在 Java 中,可作為 GC Roots 的對象包括以下幾種:

  • 虛擬機棧(本地變量表)中引用的對象
  • 方法區(qū)中類靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象
  • 本地方法棧中引用的對象

二、JVM中的堆結(jié)構(gòu)

JVM 中的堆可劃分為兩大部分,新生代和老年代,大小比例為1:2,如下:

其中,新生代分為 Eden 區(qū)和  Survivor 區(qū), Survivor 幸存者區(qū)又分為大小相等的兩塊 from 和 to 區(qū)。

這便是 JVM 中堆的結(jié)構(gòu)和各部分默認(rèn)的比例,當(dāng)然這些比例都可通過對應(yīng) JVM 參數(shù)來調(diào)整。

2.1 為何新生代要分為三個區(qū)

這里需要介紹新生代的垃圾回收算法——復(fù)制算法。

該算法的核心是將可用內(nèi)存按容量劃分為大小相等的兩塊,每次回收周期只用其中一塊,當(dāng)這一塊的內(nèi)存用完,就將還存活的對象復(fù)制到另一塊上面,然后把已使用過的內(nèi)存空間清理掉。

  • 優(yōu)點:不必考慮內(nèi)存碎片問題;效率高。
  • 缺點:可用容量減少為原來的一半,比較浪費。

【最優(yōu)設(shè)置】:根據(jù)權(quán)威數(shù)據(jù)分析,90%的對象都是朝生夕死的,所以采用10%的空間用作交換區(qū),因為交換區(qū)必須要有等量的兩個,所以采用復(fù)制算法中新生代中三個區(qū)默認(rèn)分配比例為8:1:1。

2.2 新生代對象的分配和回收

(1)基本上新的對象優(yōu)先在 Eden 區(qū)分配;

(2)當(dāng) Eden 區(qū)沒有足夠空間時,會發(fā)起一次 Minor GC;

(3)Minor GC 回收新生代采用復(fù)制回收算法的改進(jìn)版本,即

  • from 區(qū)和 to 區(qū)的兩個交換區(qū),這兩個區(qū)只有一個區(qū)有數(shù)據(jù)
  • 采用8:1:1的默認(rèn)分配比例(-XX:SurvivorRatio默認(rèn)為8,代表 Eden 區(qū)與 Survivor 區(qū)的大小比例)

2.3 老年代對象的分配和回收

(1)老年代的對象一般來自于新生代中的長期存活對象。這里有一概念叫做年齡閾值,每個對象定義了年齡計數(shù)器,經(jīng)過一次 Minor GC (在交換區(qū))后年齡加1,對象年齡達(dá)到15次后將會晉升到老年代,老年代空間不夠時進(jìn)行 Full GC。當(dāng)然這個參數(shù)仍是可以通過 JVM 參數(shù)(-XX:MaxTenuringThreshold,默認(rèn)15)來調(diào)整。

(2)大對象直接進(jìn)入老年代。即超過 Eden 區(qū)空間,或超過一個參數(shù)值(-XX:PretenureSizeThreshold=30m,無默認(rèn)值)。這樣做的目的是避免在Eden區(qū)及兩個Survivor區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。

(3)對象提前晉升到老年代(組團(tuán))。動態(tài)年齡判定:如果在 Survivor 區(qū)中相同年齡所有對象大小總和大于 Survivor 區(qū)大小的一半,年齡大于或等于該年齡的對象就可以直接進(jìn)入老年代,而無須等到自己的晉升年齡。

三、JVM完整的GC流程

對象的正常流程:Eden 區(qū) -> Survivor 區(qū) -> 老年代。

新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍。

【總結(jié)】:內(nèi)存區(qū)域不夠用了,就會引發(fā)GC,JVM 會“stop the world”,嚴(yán)重影響性能。Minor GC 避免不了,F(xiàn)ull GC 盡量避免。

【處理方式】:保存堆棧快照日志、分析內(nèi)存泄漏、調(diào)整內(nèi)存設(shè)置控制垃圾回收頻率,選擇合適的垃圾回收器等。

總結(jié)

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

相關(guān)文章

  • 深入理解Java設(shè)計模式之原型模式

    深入理解Java設(shè)計模式之原型模式

    這篇文章主要介紹了JAVA設(shè)計模式之原型模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • Struts2實現(xiàn)自定義攔截器的三種方式詳解

    Struts2實現(xiàn)自定義攔截器的三種方式詳解

    這篇文章主要介紹了Struts2實現(xiàn)自定義攔截器的三種方式詳解,一些與系統(tǒng)邏輯相關(guān)的通用功能如權(quán)限的控制和用戶登錄控制等,需要通過自定義攔截器實現(xiàn),本節(jié)將詳細(xì)講解如何自定義攔截器,需要的朋友可以參考下
    2023-07-07
  • Java中的重要核心知識點之繼承詳解

    Java中的重要核心知識點之繼承詳解

    繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因為它允許創(chuàng)建分等級層次的類。繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為
    2021-10-10
  • SpringBoot日志配置SLF4J和Logback的方法實現(xiàn)

    SpringBoot日志配置SLF4J和Logback的方法實現(xiàn)

    日志記錄是不可或缺的一部分,本文主要介紹了SpringBoot日志配置SLF4J和Logback的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Java String的intern用法解析

    Java String的intern用法解析

    這篇文章主要介紹了Java String的intern用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Springboot配置Swagger的實現(xiàn)示例

    Springboot配置Swagger的實現(xiàn)示例

    Swagger 是一種提高 API 開發(fā)和維護(hù)效率的工具,它使開發(fā)者能夠更輕松地構(gòu)建、測試和文檔化 API,本文主要介紹了Springboot配置Swagger的實現(xiàn)示例,感興趣的可以了解一下
    2023-10-10
  • Java設(shè)計模式以虹貓藍(lán)兔的故事講解適配器模式

    Java設(shè)計模式以虹貓藍(lán)兔的故事講解適配器模式

    適配器模式(Adapter?Pattern)是作為兩個不兼容的接口之間的橋梁。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個獨立接口的功能
    2022-04-04
  • Spring配置多數(shù)據(jù)源導(dǎo)致事物無法回滾問題

    Spring配置多數(shù)據(jù)源導(dǎo)致事物無法回滾問題

    這篇文章主要介紹了Spring配置多數(shù)據(jù)源導(dǎo)致事物無法回滾問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java transient關(guān)鍵字原理解析

    Java transient關(guān)鍵字原理解析

    這篇文章主要介紹了Java transient關(guān)鍵字原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java多線程之synchronized關(guān)鍵字的使用

    Java多線程之synchronized關(guān)鍵字的使用

    這篇文章主要介紹了Java多線程之synchronized關(guān)鍵字的使用,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

安丘市| 孙吴县| 兰溪市| 巴林右旗| 涟源市| 普兰县| 深水埗区| 徐闻县| 苗栗市| 凤阳县| 上虞市| 高阳县| 民乐县| 湖州市| 深泽县| 巴青县| 会泽县| 井冈山市| 灵川县| 龙州县| 平阴县| 阿瓦提县| 洛浦县| 随州市| 唐山市| 遂溪县| 任丘市| 清镇市| 全椒县| 泸定县| 五大连池市| 来凤县| 昌宁县| 山东省| 普安县| 邯郸县| 峡江县| 五华县| 无为县| 江陵县| 小金县|