国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM實(shí)戰(zhàn)(18)——模擬Full GC

這篇具有很好參考價(jià)值的文章主要介紹了JVM實(shí)戰(zhàn)(18)——模擬Full GC。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO

聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬

學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)!

階段1、深入多線程

階段2、深入多線程設(shè)計(jì)模式

階段3、深入juc源碼解析

階段4、深入jdk其余源碼解析

階段5、深入jvm源碼解析

一、簡介

上一章,我們已經(jīng)進(jìn)行了一次對象晉升的模擬,本章我們將繼續(xù)結(jié)合代碼示例做實(shí)驗(yàn),來看看老年代的GC是如何觸發(fā)的。

1.1 JVM內(nèi)存參數(shù)

我們的示例程序基于JDK1.8,JVM參數(shù)如下:
-XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3145728 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

上述給新生代分配了10MB空間,老年代也是10MB,參數(shù)注意一點(diǎn):

  • -XX:PretenureSizeThreshold=3145728:超過3MB的大對象直接進(jìn)入老年代

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

二、示例程序

2.1 程序源碼

示例程序代碼如下:

    public class Demo1 {
        public static void main(String[] args) {
            byte[] array1 = new byte[4 * 1024 * 1024];
            array1 = null;
    
            byte[] array2 = new byte[2 * 1024 * 1024];
            byte[] array3 = new byte[2 * 1024 * 1024];
            byte[] array4 = new byte[2 * 1024 * 1024];
            byte[] array5 = new byte[128 * 1024];
    
            byte[] array6 = new byte[2 * 1024 * 1024];
        }
    }

2.2 JVM內(nèi)存模型

我們根據(jù)上述代碼來分析下內(nèi)存中的對象分配。首先創(chuàng)建4MB的數(shù)組對象,由于超過大對象閾值3MB,所以直接進(jìn)入老年代:

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

接著array1失去引用,然后在Eden區(qū)分配3個(gè)2MB數(shù)組和1個(gè)128KB數(shù)組:

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

然后,執(zhí)行代碼byte[] array6 = new byte[2 * 1024 * 1024],希望在Eden區(qū)繼續(xù)創(chuàng)建一個(gè)2MB的數(shù)組。顯然,Eden區(qū)的空間不足了,此時(shí)即將觸發(fā)Young GC。

2.3 程序執(zhí)行

我們執(zhí)行程序,得到以下GC日志:

    0.260: [GC (Allocation Failure) 0.261: [ParNew (promotion failed): 8142K->8797K(9216K), 0.0035404 secs]0.264: [CMS: 8194K->6772K(10240K), 0.0064863 secs] 12238K->6772K(19456K), [Metaspace: 3227K->3227K(1056768K)], 0.0103195 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
    0.272: [GC (CMS Initial Mark) [1 CMS-initial-mark: 6772K(10240K)] 9112K(19456K), 0.0004078 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.273: [CMS-concurrent-mark-start]
    0.274: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.274: [CMS-concurrent-preclean-start]
    0.274: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    0.274: [CMS-concurrent-abortable-preclean-start]
    Heap
     par new generation   total 9216K, used 2422K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
      eden space 8192K,  29% used [0x00000000fec00000, 0x00000000fee5d898, 0x00000000ff400000)
      from space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
      to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
     concurrent mark-sweep generation total 10240K, used 6772K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
     Metaspace       used 3233K, capacity 4496K, committed 4864K, reserved 1056768K
      class space    used 350K, capacity 388K, committed 512K, reserved 1048576K

三、日志分析

我們先來看下日志中的下面這行,這是本輪GC情況的概要說明:

    0.260: [GC (Allocation Failure) 0.261: [ParNew (promotion failed): 8142K->8797K(9216K), 0.0035404 secs]0.264: [CMS: 8194K->6772K(10240K), 0.0064863 secs] 12238K->6772K(19456K), [Metaspace: 3227K->3227K(1056768K)], 0.0103195 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

ParNew (promotion failed): 8142K->8797K(9216K), 0.0035404 secs:?:這行表明ParNew首先進(jìn)行了一次Young GC,但是發(fā)現(xiàn)Eden區(qū)內(nèi)的對象全部被引用著,一個(gè)都回收不掉。于是會(huì)嘗試將存活對象轉(zhuǎn)移到Survivor,是Survivor空間不足,所以又會(huì)嘗試轉(zhuǎn)移到老年代,但是老年代可用空間也只有6MB,容納不了3個(gè)2MB和1個(gè)128KB數(shù)組,所以就會(huì)觸發(fā)下面的Full GC。

[CMS: 8194K->6772K(10240K), 0.0064863 secs] 12238K->6772K(19456K), [Metaspace: 3227K->3227K(1056768K)], 0.0103195 secs:?從這里可以看到,CMS垃圾回收器執(zhí)行了Full GC,F(xiàn)ull GC會(huì)對老年代進(jìn)行Old GC,并是和上面的Young GC關(guān)聯(lián)的,同時(shí)還會(huì)對元數(shù)據(jù)區(qū)(永久代)進(jìn)行回收。

因?yàn)?,老年代雖然容納不了全部3個(gè)2MB數(shù)組和1個(gè)128KB數(shù)組,但是可以容納2個(gè)2MB數(shù)組,所以會(huì)先將這兩個(gè)2MB數(shù)組對象轉(zhuǎn)移到老年代:

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

然后,發(fā)現(xiàn)剩下的一個(gè)2MB數(shù)組和128KB數(shù)組實(shí)在放不下了,就會(huì)進(jìn)行一次Old GC([CMS: 8194K->6772K(10240K), 0.0064863 secs] ),可以看到老年代空間最終變成了6772KB。

因?yàn)镃MS進(jìn)行Old GC時(shí)先對老年代清理,回收掉沒有引用的那個(gè)4MB數(shù)組,然后將新生代中的2MB數(shù)組和128KB數(shù)組轉(zhuǎn)移到老年代:

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

最后,F(xiàn)ull GC完畢后,byte[] array6 = new byte[2 * 1024 * 1024]這行代碼對應(yīng)的2MB數(shù)組被成功分配到Eden區(qū):

JVM實(shí)戰(zhàn)(18)——模擬Full GC,jvm專題,jvm

四、總結(jié)

本章通過GC日志分析了一個(gè)觸發(fā)老年代GC的案例,即新生代存活對象太多,放不進(jìn)Survivor區(qū),同時(shí)也放不進(jìn)老年代,此時(shí)就會(huì)觸發(fā)CMS的Full GC。
當(dāng)然,觸發(fā)老年代GC的另一種情況就是:當(dāng)老年代內(nèi)存占用達(dá)到一定的比例,通過?-XX:CMSInitiatingOccupancyFaction參數(shù)可以設(shè)置這個(gè)比例,JDK1.6中默認(rèn)是92%。文章來源地址http://www.zghlxwxcb.cn/news/detail-801470.html

到了這里,關(guān)于JVM實(shí)戰(zhàn)(18)——模擬Full GC的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM實(shí)戰(zhàn)篇:GC調(diào)優(yōu)

    JVM實(shí)戰(zhàn)篇:GC調(diào)優(yōu)

    目錄 一.GC調(diào)優(yōu)的核心指標(biāo) 1.1吞吐量(Throughput) 1.2延遲(Latency) 1.3內(nèi)存使用量 二.GC調(diào)優(yōu)的方法 2.1監(jiān)控工具 Jstat工具 VisualVm插件 Prometheus + Grafana 2.2診斷原因 GC日志 GC Viewer GCeasy 2.3常見的GC模式 正常情況 緩存對象過多 內(nèi)存泄漏 持續(xù)的FULL GC 元空間不足導(dǎo)致的FULL GC 三.修復(fù)G

    2024年01月23日
    瀏覽(27)
  • JVM實(shí)戰(zhàn)(14)——Young GC調(diào)優(yōu)

    JVM實(shí)戰(zhàn)(14)——Young GC調(diào)優(yōu)

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月16日
    瀏覽(27)
  • JVM實(shí)戰(zhàn)(17)——模擬對象晉升

    JVM實(shí)戰(zhàn)(17)——模擬對象晉升

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月19日
    瀏覽(19)
  • JVM實(shí)戰(zhàn)(30)——模擬堆內(nèi)存溢出

    JVM實(shí)戰(zhàn)(30)——模擬堆內(nèi)存溢出

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月25日
    瀏覽(20)
  • JVM實(shí)戰(zhàn)(28)——模擬Metaspace內(nèi)存溢出

    JVM實(shí)戰(zhàn)(28)——模擬Metaspace內(nèi)存溢出

    作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實(shí)! 階段1、深入多線程 階段2、深入多線程設(shè)計(jì)模式 階段3、深入juc源碼解析

    2024年01月18日
    瀏覽(23)
  • 【JVM】JVM垃圾回收GC相關(guān)參數(shù)說明

    -XX:+PrintCommandLineFlags : 輸出JVM啟動(dòng)參數(shù) -XX:+UseSerialGC :在新生代和老年代使用串行收集器 -XX:SurvivorRatio :設(shè)置eden區(qū)大小和survivior區(qū)大小的比例 -XX:NewRatio :新生代和老年代的比 -XX:+UseParNewGC :在新生代使用并行收集器 -XX:+UseParallelGC :新生代使用并行回收收集器 -XX:+UseParallelO

    2024年02月04日
    瀏覽(52)
  • 【JVM】垃圾回收 GC

    【JVM】垃圾回收 GC

    垃圾回收(Garbage Collection,GC)是由 Java 虛擬機(jī)(JVM)垃圾回收器提供的一種對內(nèi)存回收的一種機(jī)制,它一般會(huì)在內(nèi)存空閑或者內(nèi)存占用過高的時(shí)候?qū)δ切]有任何引用的對象不定時(shí)地進(jìn)行回收。以避免內(nèi)存溢出和崩潰的問題。JVM的垃圾回收算法包括引用類型、引用計(jì)數(shù)器法

    2024年01月16日
    瀏覽(19)
  • JVM GC 區(qū)別

    JVM GC 區(qū)別

    串行收集器 : Serial , Serial Old 只有一個(gè)垃圾回收線程執(zhí)行,用戶線程會(huì)暫停 適用 : 內(nèi)存較小的嵌入式設(shè)備 并行收集器 [吞吐量優(yōu)先] : Parallel Scanvenge、Parallel Old 多條垃圾收集線程并行工作,但用戶線程會(huì)是等待狀態(tài) 適用 : 科學(xué)計(jì)算、后臺(tái)處理 并發(fā)收集器 [停頓時(shí)間優(yōu)先] : CM

    2024年02月11日
    瀏覽(12)
  • JVM 配置GC日志

    開啟GC日志 多種方法都能開啟GC的日志功能,其中包括:使用-verbose:gc或-XX:+PrintGC這兩個(gè)標(biāo)志中的任意一個(gè)能創(chuàng)建基本的GC日志 (這兩個(gè)日志標(biāo)志實(shí)際上互為別名,默認(rèn)情況下的GC日志功能是關(guān)閉的) 使用-XX:+PrintGCDetails標(biāo)志會(huì)創(chuàng)建更詳細(xì)的GC日志 推薦使用-XX:+PrintGCDetails標(biāo)志(

    2024年02月15日
    瀏覽(19)
  • JVM GC配置指南

    本文旨在簡明扼要說明各回收器調(diào)優(yōu)參數(shù),如有疏漏歡迎指正。 1、JDK版本 以下所有優(yōu)化全部基于JDK8版本,強(qiáng)烈建議低版本升級到JDK8,并盡可能使用update_191以后版本。 2、如何選擇垃圾回收器 響應(yīng)優(yōu)先應(yīng)用:面向C端對響應(yīng)時(shí)間敏感的應(yīng)用,堆內(nèi)存8G以上建議選擇G1,堆內(nèi)存

    2024年02月15日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包