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

JVM回收跨代垃圾的方式詳解

 更新時間:2024年02月27日 08:26:02   作者:半畝方塘立身  
在Java堆內存中,年輕代和老年代之間存在的對象相互引用,假設現在要進行一次新生代的YGC,但新生代中的對象可能被老年代所引用的,為了找到新生代中的存活對象,不得不遍歷整個老年代,這樣明顯效率很低下,那么如何快速識別并回收這種引用對象呢

1. 跨代引用概述

在Java堆內存中,年輕代和老年代之間存在的對象相互引用,假設現在要進行一次新生代的YGC,但新生代中的對象可能被老年代所引用的,為了找到新生代中的存活對象,不得不遍歷整個老年代。這樣明顯效率很低下,那么如何快速識別并回收這種引用對象呢?

這就不得不提到Card Table(卡表)和 Remember Set(記憶集,簡稱RSet)了。

2. 跨代引用的處理方式

2.1 卡表(Card Table)

卡表是一種用于跟蹤年輕代對象被老年代對象引用的數據結構。它將堆內存劃分為一系列固定大小的區(qū)域(卡片),每個卡片記錄了年輕代對象被老年代對象引用的情況。在老年代垃圾回收時,垃圾收集器會掃描卡表,以確定哪些年輕代對象是存活的,即被老年代對象引用。

在 JVM 中,一個 card 的大小(通常是)512字節(jié)。在多線程并行收集時,每個線程可以批量掃描多個 card,一批 card 被稱為一個 stride。默認一個 stride 含有 256個 card,即每個線程要每次掃描 512 * 256 = 128 K 的內存區(qū)域。stride數量太多就會導致線程在stride之間切換的開銷增加,進而導致 GC Pause 增長, strides 太少恐怕也會導致單次掃描的時間增長,進而影響整個 GC Pause 。

2.2 記憶集(Remembered Sets)

伴隨 G1 垃圾收集器的誕生,傳統(tǒng)的老年代和新生代都從物理上的連續(xù)空間,變成了一個個物理上不連續(xù)的空間 region

JVM 針對這些Region 提供了一個數據結構,也就是 CSet(Collection Set),存儲任意年代的region。

物理上不連續(xù)的 region 造成了新生代和老年的引用破碎化,新生代引用老年代,所以產生了 old->youngyoung->old的跨代對象引用,這時候 JVM 只要掃描 CSet 中的 R Set 即可。

邏輯上說每個Region都有一個RSet,RSet記錄了其他Region中的對象引用本Region中對象的關系。

每個Region會在自身的Remembered Set中紀錄下來自其他Region的指向自身的Card位置。這個Remembered Set是一個Hash Table,Key是別的Region的起始地址,Value是一個集合,里面的元素是Card Table的Index。

RSet、Card和Region的關系

下圖表示了RSet、Card和Region的關系: 

圖中是相互引用的三個region。R1 和 R3 的被細分到了card table 級別。R2 被 R1 和 R3的某些區(qū)域引用,所以 R2 的 RSet 會記錄到 R1 和 R2 的區(qū)域索引,即產生某些循環(huán)引用的作用。

一個 Region 的 RSet 如果有值,至少可以證明這個區(qū)域是有引用的;一個區(qū)域如果無值,則可以認為這個區(qū)域不可達,可以不掃描這個區(qū)域(Card Table 可以減少 Minor GC 掃描 old 區(qū)來理解 young 區(qū)的時間,RSet 則可以減少掃描生成 CSet 選取候選 region 的時間)。

在做YGC的時候,只需要選定young generation region的RSet作為根集,這些RSet記錄了old->young的跨代引用,避免了掃描整個old generation。而mixed gc的時候,old generation中記錄了old->old的 RSet,young->old的引用由掃描全部young generation region(的 card table)得到,這樣也不用掃描全部old generation region。所以RSet的引入大大減少了GC的工作量。

2.3 處理器屏障(Processor Barriers)

處理器屏障是一種硬件支持的機制,用于跟蹤對象之間的引用關系。當發(fā)生引用修改時,處理器屏障可以監(jiān)測到對內存的訪問,并通知垃圾收集器。垃圾收集器可以根據這些信息來更新引用關系,確??绱帽徽_處理。

3. 總結

卡表只解決 youngGC 掃老年代的問題,而 RSet 則解決了(G1 對)所有 Region 的掃描問題??ū硗ㄟ^對外引用提示我們應該掃描什么區(qū)域,這樣我們可以避開不用掃描的區(qū)域;RSet通過對內引用提示我們應該掃描什么區(qū)域,這樣我們可以避開不用掃描的區(qū)域。

跨代引用的垃圾回收是Java虛擬機中一個復雜而重要的問題。通過合理設計和優(yōu)化記憶集、卡表等數據結構,并結合并發(fā)標記-清除算法、處理器屏障等技術,可以有效地處理跨代引用,保證垃圾回收的效率和穩(wěn)定性,從而提高Java應用程序的性能和可靠性。

以上就是JVM回收跨代垃圾的方式詳解的詳細內容,更多關于JVM回收跨代垃圾的資料請關注腳本之家其它相關文章!

相關文章

  • Java中的Sentinel持久化規(guī)則啟動

    Java中的Sentinel持久化規(guī)則啟動

    這篇文章主要介紹了Java中的Sentinel持久化規(guī)則啟動,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 解決java攔截器獲取POST入參導致@RequestBody參數丟失問題

    解決java攔截器獲取POST入參導致@RequestBody參數丟失問題

    文章講述了在Java開發(fā)中使用攔截器獲取POST請求入參時,由于流關閉導致`@RequestBody`參數丟失的問題,并提出了一種解決方案,解決方案包括自定義方法、防止流丟失、過濾器和攔截器的合理組織和使用,最終確保了參數的正確傳遞
    2024-11-11
  • Mybatis中如何使用sum對字段求和

    Mybatis中如何使用sum對字段求和

    這篇文章主要介紹了Mybatis中如何使用sum對字段求和,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Mybatis調用SQL?Server存儲過程的實現示例

    Mybatis調用SQL?Server存儲過程的實現示例

    在軟件開發(fā)過程中,經常會使用到存儲過程,本文就來介紹一下Mybatis調用SQL?Server存儲過程的實現示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Java基礎知識雜文

    Java基礎知識雜文

    這篇文章主要介紹了Java基礎知識雜文,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 詳解java注解相關知識

    詳解java注解相關知識

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著java注解的使用展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java中的this、super、final關鍵字詳解

    Java中的this、super、final關鍵字詳解

    這篇文章主要介紹了Java中的this、super、final關鍵字詳解,它在方法內部使用,表示這個方法所屬對象的引用,它在構造器內部使用,表示該構造器正在初始化的對象,this 可以調用類的屬性、方法和構造器,需要的朋友可以參考下
    2023-09-09
  • MyBatis-Plus如何關閉SQL日志打印詳解

    MyBatis-Plus如何關閉SQL日志打印詳解

    在使用mybatisplus進行開發(fā)時,日志是一個非常有用的工具,它可以幫助我們更好地了解和調試我們的代碼,這篇文章主要給大家介紹了關于MyBatis-Plus如何關閉SQL日志打印的相關資料,需要的朋友可以參考下
    2024-03-03
  • 關于在使用Lombok時maven?install找不到符號問題的解決辦法

    關于在使用Lombok時maven?install找不到符號問題的解決辦法

    Maven環(huán)境下開發(fā)項目時,尤其是涉及Lombok或其他依賴時,IDE會在構建和編譯過程中進行注解處理,這篇文章主要介紹了關于在使用Lombok時maven?install找不到符號問題的解決辦法,需要的朋友可以參考下
    2025-10-10
  • Java實現word,pdf轉html并保留格式

    Java實現word,pdf轉html并保留格式

    這篇文章主要為大家詳細介紹了如何使用Java實現將word,pdf轉換為html并保留格式,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-07-07

最新評論

荣昌县| 定安县| 云南省| 苗栗县| 礼泉县| 鹤峰县| 东台市| 阿克苏市| 玉树县| 嘉峪关市| 天水市| 孙吴县| 依安县| 资阳市| 凤翔县| 安多县| 循化| 贺兰县| 和政县| 壶关县| 龙川县| 蕉岭县| 临西县| 海原县| 阳春市| 旌德县| 来宾市| 江津市| 广昌县| 苏尼特左旗| 荃湾区| 义马市| 嘉黎县| 乌兰县| 灌南县| 承德市| 惠来县| 乌什县| 博乐市| 襄垣县| 陵川县|