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

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)文章

  • 解決SpringCloud Config結(jié)合github無法讀取配置的問題

    解決SpringCloud Config結(jié)合github無法讀取配置的問題

    這篇文章主要介紹了解決SpringCloud Config結(jié)合github無法讀取配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java 異常處理小結(jié),從入門到精通

    Java 異常處理小結(jié),從入門到精通

    這篇文章主要介紹了Java 異常處理小結(jié),從入門到精通,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JDBC插入數(shù)據(jù)返回?cái)?shù)據(jù)主鍵代碼實(shí)例

    JDBC插入數(shù)據(jù)返回?cái)?shù)據(jù)主鍵代碼實(shí)例

    這篇文章主要介紹了JDBC插入數(shù)據(jù)返回?cái)?shù)據(jù)主鍵代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Logstash配置Java日志格式的方法小結(jié)

    Logstash配置Java日志格式的方法小結(jié)

    Logstash 是用于日志收集的開源工具,通常與 Elasticsearch 和 Kibana 一起使用,形成 ELK Stack,Logstash 非常靈活,可以通過配置文件(通常是 .conf 文件)來定義數(shù)據(jù)的輸入、處理和輸出,本文給大家介紹了Logstash配置Java日志格式的方法,需要的朋友可以參考下
    2024-09-09
  • springboot整合netty框架實(shí)現(xiàn)站內(nèi)信

    springboot整合netty框架實(shí)現(xiàn)站內(nèi)信

    Netty 是一個(gè)基于NIO的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡(jiǎn)單的開發(fā)出一個(gè)網(wǎng)絡(luò)應(yīng)用,這篇文章主要介紹了springboot整合netty框架的方式小結(jié),需要的朋友可以參考下
    2022-12-12
  • SpringBoot 集成 ShedLock 分布式鎖的示例詳解

    SpringBoot 集成 ShedLock 分布式鎖的示例詳解

    ShedLock是一個(gè)在分布式環(huán)境中使用的定時(shí)任務(wù)框架,用于解決在分布式環(huán)境中的多個(gè)實(shí)例的相同定時(shí)任務(wù)在同一時(shí)間點(diǎn)重復(fù)執(zhí)行的問題,本文重點(diǎn)給大家介紹SpringBoot 分布式鎖ShedLock的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-08-08
  • 詳解Spring 注解之@Import 注入的各種花活

    詳解Spring 注解之@Import 注入的各種花活

    這篇文章主要介紹了詳解Spring 注解之@Import 注入的各種花活,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • @Bean注解和@Configuration、@Component注解組合使用的區(qū)別

    @Bean注解和@Configuration、@Component注解組合使用的區(qū)別

    這篇文章主要介紹了@Bean注解和@Configuration、@Component注解組合使用的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • eclipse中maven插件安裝教程

    eclipse中maven插件安裝教程

    這篇文章主要為大家詳細(xì)介紹了eclipse中maven插件安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • java原裝代碼完成pdf在線預(yù)覽和pdf打印及下載

    java原裝代碼完成pdf在線預(yù)覽和pdf打印及下載

    本文主要介紹了java原裝代碼完成pdf在線預(yù)覽和pdf打印及下載的方法,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02

最新評(píng)論

会泽县| 天门市| 南溪县| 吴桥县| 青铜峡市| 张家港市| 元阳县| 略阳县| 宜黄县| 股票| 新竹县| 阿城市| 长治市| 安陆市| 安陆市| 凤山县| 响水县| 奇台县| 通山县| 梓潼县| 鄂伦春自治旗| 汉沽区| 岫岩| 延庆县| 安阳县| 崇信县| 乌拉特前旗| 咸宁市| 孝昌县| 潞城市| 调兵山市| 安泽县| 巴彦县| 彩票| 灵川县| 工布江达县| 莱阳市| 墨玉县| 若尔盖县| 亚东县| 栖霞市|