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

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

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

JVM 的 GC 是指垃圾回收,主要是對堆內存的回收。

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

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

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

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

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

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

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

二、JVM中的堆結構

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

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

這便是 JVM 中堆的結構和各部分默認的比例,當然這些比例都可通過對應 JVM 參數來調整。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、JVM完整的GC流程

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

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

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

【處理方式】:保存堆??煺杖罩?、分析內存泄漏、調整內存設置控制垃圾回收頻率,選擇合適的垃圾回收器等。

總結

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

相關文章

  • 詳細了解MyBatis的異常處理機制

    詳細了解MyBatis的異常處理機制

    本文將對MyBatis的異常體系以及異常使用進行學習,MyBatis版本是3.5.6,作為一款成熟的ORM框架,MyBatis有自己一套成熟的異常處理體系,,需要的朋友可以參考下
    2023-06-06
  • spring MVC實踐需要注意的地方

    spring MVC實踐需要注意的地方

    這篇文章主要介紹了spring MVC實踐需要注意的地方,幫助大家更好的理解和學習使用spring MVC,感興趣的朋友可以了解下
    2021-03-03
  • 使用Vue+Spring Boot實現(xiàn)Excel上傳功能

    使用Vue+Spring Boot實現(xiàn)Excel上傳功能

    這篇文章主要介紹了使用Vue+Spring Boot實現(xiàn)Excel上傳,需要的朋友可以參考下
    2018-11-11
  • Java?SpringBoot核心源碼詳解

    Java?SpringBoot核心源碼詳解

    這篇文章主要為大家介紹了Java?SpringBoot核心源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Java由淺入深講解繼承上

    Java由淺入深講解繼承上

    繼承就是可以直接使用前輩的屬性和方法。自然界如果沒有繼承,那一切都是處于混沌狀態(tài)。多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作
    2022-04-04
  • mybatis?log4j2打印sql+日志實例代碼

    mybatis?log4j2打印sql+日志實例代碼

    在學習mybatis的時候,如果用log4j2來協(xié)助查看調試信息,則會大大提高學習的效率,加快debug速度,下面這篇文章主要給大家介紹了關于mybatis?log4j2打印sql+日志的相關資料,需要的朋友可以參考下
    2022-08-08
  • Java結合Vue項目打包并進行服務器部署

    Java結合Vue項目打包并進行服務器部署

    本文主要介紹了Java結合Vue項目打包并進行服務器部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java分支結構程序設計實例詳解

    Java分支結構程序設計實例詳解

    這篇文章主要介紹了Java分支結構程序設計例題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • springboot+redis過期事件監(jiān)聽實現(xiàn)過程解析

    springboot+redis過期事件監(jiān)聽實現(xiàn)過程解析

    這篇文章主要介紹了springboot+redis過期事件監(jiān)聽實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • IDEA 單元測試報錯:Class not found:xxxx springboot的解決

    IDEA 單元測試報錯:Class not found:xxxx springb

    這篇文章主要介紹了IDEA 單元測試報錯:Class not found:xxxx springboot的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論