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

java垃圾回收之實(shí)現(xiàn)串行GC算法

 更新時(shí)間:2022年01月25日 08:57:34   作者:金色夢(mèng)想  
學(xué)習(xí)了GC算法的相關(guān)概念之后,?我們將介紹在JVM中這些算法的具體實(shí)現(xiàn)。首先要記住的是,?大多數(shù)JVM都需要使用兩種不同的GC算法?——?一種用來清理年輕代,?另一種用來清理老年代

我們可以選擇JVM內(nèi)置的各種算法。如果不通過參數(shù)明確指定垃圾收集算法, 則會(huì)使用宿主平臺(tái)的默認(rèn)實(shí)現(xiàn)。本章會(huì)詳細(xì)介紹各種算法的實(shí)現(xiàn)原理。

下面是關(guān)于Java 8中各種組合的垃圾收集器概要列表,對(duì)于之前的Java版本來說,可用組合會(huì)有一些不同:

YoungTenuredJVM options
Incremental(增量GC)Incremental-Xincgc
SerialSerial-XX:+UseSerialGC
Parallel ScavengeSerial-XX:+UseParallelGC -XX:-UseParallelOldGC
Parallel NewSerialN/A
SerialParallel OldN/A
Parallel ScavengeParallel Old-XX:+UseParallelGC -XX:+UseParallelOldGC
Parallel NewParallel OldN/A
SerialCMS-XX:-UseParNewGC -XX:+UseConcMarkSweepGC
Parallel ScavengeCMSN/A
Parallel NewCMS-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
G1-XX:+UseG1GC

看起來有些復(fù)雜, 不用擔(dān)心。主要使用的是上表中黑體字表示的這四種組合。其余的要么是被廢棄(deprecated), 要么是不支持或者是不太適用于生產(chǎn)環(huán)境。所以,接下來我們只介紹下面這些組合及其工作原理:

  • 年輕代和老年代的串行GC(Serial GC)
  • 年輕代和老年代的并行GC(Parallel GC)
  • 年輕代的并行GC(Parallel New) + 老年代的CMS(Concurrent Mark and Sweep)
  • G1, 負(fù)責(zé)回收年輕代和老年代

Serial GC(串行GC)

Serial GC 對(duì)年輕代使用 mark-copy(標(biāo)記-復(fù)制) 算法, 對(duì)老年代使用 mark-sweep-compact(標(biāo)記-清除-整理)算法. 顧名思義, 兩者都是單線程的垃圾收集器,不能進(jìn)行并行處理。兩者都會(huì)觸發(fā)全線暫停(STW),停止所有的應(yīng)用線程。

因此這種GC算法不能充分利用多核CPU。不管有多少CPU內(nèi)核, JVM 在垃圾收集時(shí)都只能使用單個(gè)核心。

要啟用此款收集器, 只需要指定一個(gè)JVM啟動(dòng)參數(shù)即可,同時(shí)對(duì)年輕代和老年代生效:

java -XX:+UseSerialGC com.mypackages.MyExecutableClass

該選項(xiàng)只適合幾百M(fèi)B堆內(nèi)存的JVM,而且是單核CPU時(shí)比較有用。 對(duì)于服務(wù)器端來說, 因?yàn)橐话闶嵌鄠€(gè)CPU內(nèi)核, 并不推薦使用, 除非確實(shí)需要限制JVM所使用的資源。大多數(shù)服務(wù)器端應(yīng)用部署在多核平臺(tái)上, 選擇 Serial GC 就表示人為的限制系統(tǒng)資源的使用。 導(dǎo)致的就是資源閑置, 多的CPU資源也不能用來降低延遲,也不能用來增加吞吐量。

下面讓我們看看Serial GC的垃圾收集日志, 并從中提取什么有用的信息。為了打開GC日志記錄, 我們使用下面的JVM啟動(dòng)參數(shù):

-XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps

產(chǎn)生的GC日志輸出類似這樣(為了排版,已手工折行):

****-05-26T14:45:37.987-0200: 
        151.126: [GC (Allocation Failure) 
        151.126: [DefNew: 629119K->69888K(629120K), 0.0584157 secs] 
        1619346K->1273247K(2027264K), 0.0585007 secs]
    [Times: user=0.06 sys=0.00, real=0.06 secs]
****-05-26T14:45:59.690-0200: 
        172.829: [GC (Allocation Failure) 
        172.829: [DefNew: 629120K->629120K(629120K), 0.0000372 secs]
        172.829: [Tenured: 1203359K->755802K(1398144K), 0.1855567 secs] 
        1832479K->755802K(2027264K), 
        [Metaspace: 6741K->6741K(1056768K)], 0.1856954 secs] 
    [Times: user=0.18 sys=0.00, real=0.18 secs]

此GC日志片段展示了在JVM中發(fā)生的很多事情。 實(shí)際上,在這段日志中產(chǎn)生了兩個(gè)GC事件, 其中一次清理的是年輕代,另一次清理的是整個(gè)堆內(nèi)存。讓我們先來分析前一次GC,其在年輕代中產(chǎn)生。

Minor GC(小型GC)

以下代碼片段展示了清理年輕代內(nèi)存的GC事件:

****-05-26T14:45:37.987-02001 : 151.12622 : [ GC3 (Allocation Failure4 151.126:
[DefNew5 : 629119K->69888K6 (629120K)7 , 0.0584157 secs] 1619346K->1273247K8
(2027264K)9, 0.0585007 secs10] [Times: user=0.06 sys=0.00, real=0.06 secs]11

****-05-26T14:45:37.987-0200 – GC事件開始的時(shí)間. 其中-0200表示西二時(shí)區(qū),而中國(guó)所在的東8區(qū)為 +0800。

151.126 – GC事件開始時(shí),相對(duì)于JVM啟動(dòng)時(shí)的間隔時(shí)間,單位是秒。

GC – 用來區(qū)分 Minor GC 還是 Full GC 的標(biāo)志。GC表明這是一次小型GC(Minor GC)

Allocation Failure – 觸發(fā) GC 的原因。本次GC事件, 是由于年輕代中沒有空間來存放新的數(shù)據(jù)結(jié)構(gòu)引起的。

DefNew – 垃圾收集器的名稱。這個(gè)神秘的名字表示的是在年輕代中使用的: 單線程, 標(biāo)記-復(fù)制(mark-copy), 全線暫停(STW) 垃圾收集器。

629119K->69888K – 在垃圾收集之前和之后年輕代的使用量。

(629120K) – 年輕代總的空間大小。

1619346K->1273247K – 在垃圾收集之前和之后整個(gè)堆內(nèi)存的使用情況。

(2027264K) – 可用堆的總空間大小。

0.0585007 secs – GC事件持續(xù)的時(shí)間,以秒為單位。

[Times: user=0.06 sys=0.00, real=0.06 secs] – GC事件的持續(xù)時(shí)間, 通過三個(gè)部分來衡量:

  • user – 在此次垃圾回收過程中, 所有 GC線程所消耗的CPU時(shí)間之和。
  • sys – GC過程中中操作系統(tǒng)調(diào)用和系統(tǒng)等待事件所消耗的時(shí)間。

  • real – 應(yīng)用程序暫停的時(shí)間。因?yàn)榇欣占?Serial Garbage Collector)只使用單線程, 因此 real time 等于 user 和 system 時(shí)間的總和。

可以從上面的日志片段了解到, 在GC事件中,JVM 的內(nèi)存使用情況發(fā)生了怎樣的變化。此次垃圾收集之前, 堆內(nèi)存總的使用量為 1,619,346K。其中,年輕代使用了 629,119K??梢运愠?老年代使用量為 990,227K。

更重要的信息蘊(yùn)含在下一批數(shù)字中, 垃圾收集之后, 年輕代的使用量減少了 559,231K, 但堆內(nèi)存的總體使用量只下降了 346,099K。 從中可以算出,有 213,132K 的對(duì)象從年輕代提升到了老年代。

此次GC事件也可以用下面的示意圖來說明, 顯示的是GC開始之前, 以及剛剛結(jié)束之后, 這兩個(gè)時(shí)間點(diǎn)內(nèi)存使用情況的快照:

Full GC(完全GC)

理解第一次 minor GC 事件后,讓我們看看日志中的第二次GC事件:

  • user – 在此次垃圾回收過程中, 所有 GC線程所消耗的CPU時(shí)間之和。
  • sys – GC過程中中操作系統(tǒng)調(diào)用和系統(tǒng)等待事件所消耗的時(shí)間。
  • real – 應(yīng)用程序暫停的時(shí)間。因?yàn)榇欣占?Serial Garbage Collector)只使用單線程, 因此 real time 等于 user 和 system 時(shí)間的總和。

和 Minor GC 相比,最明顯的區(qū)別是 —— 在此次GC事件中, 除了年輕代, 還清理了老年代和Metaspace. 在GC事件開始之前, 以及剛剛結(jié)束之后的內(nèi)存布局,可以用下面的示意圖來說明:

以上就是垃圾回收之實(shí)現(xiàn)串行GC算法的詳細(xì)內(nèi)容,更多關(guān)于串行GC算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

原文鏈接:https://plumbr.io/handbook/garbage-collection-algorithms-implementations#parallel-gc

相關(guān)文章

  • 詳解Java JDK動(dòng)態(tài)代理

    詳解Java JDK動(dòng)態(tài)代理

    這篇文章主要介紹了Java JDK動(dòng)態(tài)代理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java 代理的有關(guān)知識(shí),感興趣的朋友可以了解下
    2020-08-08
  • Java如何實(shí)現(xiàn)簡(jiǎn)單后臺(tái)訪問并獲取IP

    Java如何實(shí)現(xiàn)簡(jiǎn)單后臺(tái)訪問并獲取IP

    這篇文章主要介紹了Java如何實(shí)現(xiàn)簡(jiǎn)單后臺(tái)訪問并獲取IP,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • IDEA錯(cuò)誤:找不到或無法加載主類的完美解決方法

    IDEA錯(cuò)誤:找不到或無法加載主類的完美解決方法

    使用IDEA開始就一直在搭建java環(huán)境,許久沒有使用過java,剛開始有些生疏,先建了一個(gè)最簡(jiǎn)單的類可是運(yùn)行的時(shí)候出現(xiàn)錯(cuò)誤:找不到或無法加載主類,下面這篇文章主要給大家介紹了關(guān)于IDEA錯(cuò)誤:找不到或無法加載主類的完美解決方法,需要的朋友可以參考下
    2022-07-07
  • 詳解Java數(shù)組的四種拷貝方式

    詳解Java數(shù)組的四種拷貝方式

    Java數(shù)組一共有四種拷貝方式: for循環(huán)、copyof/copyOfRange、arraycopy和clone。本文將為大家詳細(xì)介紹一下這四種方式,感興趣的可以了解一下
    2022-02-02
  • Spring IOC 能降低耦合的問題分析及解決方法

    Spring IOC 能降低耦合的問題分析及解決方法

    這篇文章主要介紹了Spring IOC 為什么能降低耦合,依賴注入是調(diào)用者僅通過聲明某個(gè)組件就可以獲得組件的控制權(quán),而對(duì)該組件的依賴關(guān)系管理、查找、加載由外部完成,需要的朋友可以參考下
    2022-06-06
  • Leetcode常見鏈表問題及代碼示例

    Leetcode常見鏈表問題及代碼示例

    這篇文章主要介紹了Leetcode常見鏈表問題及代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(34)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(34)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 詳解Java關(guān)于JDK中時(shí)間日期的API

    詳解Java關(guān)于JDK中時(shí)間日期的API

    這篇文章主要介紹了詳解Java關(guān)于JDK中時(shí)間日期的API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java8?Stream?流常用方法合集

    Java8?Stream?流常用方法合集

    這篇文章主要介紹了?Java8?Stream?流常用方法合集,Stream?是?Java8?中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)等操作,下文相關(guān)資料,需要的朋友可以參考一下
    2022-04-04
  • Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)

    Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)

    這篇文章主要介紹了Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)的相關(guān)資料,平方根是一個(gè)數(shù)學(xué)概念,表示一個(gè)數(shù)的正平方根,文中通過代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評(píng)論