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

JVM的垃圾回收機制真是通俗易懂

 更新時間:2022年02月27日 16:10:31   作者:“來都讓一讓”  
這篇文章主要為大家詳細介紹了JVM的垃圾回收機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

堆內(nèi)存的劃分

分為三個部分(以下名詞表示同一個區(qū)):

  • 新生區(qū)、新生代、年輕代
  • 養(yǎng)老區(qū)、老年區(qū)、老年代
  • 永久區(qū)、永久代

在這里插入圖片描述

劃分區(qū)域的目的

唯一目的就是優(yōu)化GC性能。

如果沒有分代,我們所有的對象都放在一塊,GC的時候我們需要對堆的所有區(qū)域進行掃描。而很多的對象都是“朝生夕死”的,如果把創(chuàng)建的新的對象都放在某一地方,當GC的時候就先把“朝生夕死”對象的區(qū)域進行回收,這樣就會騰出很多大的空間來。

一、新生區(qū)的垃圾回收機制

新生區(qū)分為:Eden區(qū)、Survivor0區(qū)、Survivor1區(qū)(也稱為from區(qū)和to區(qū))
其中Eden區(qū)占80%的內(nèi)存空間,每塊Survivor各占用10%的內(nèi)存空間(如:Eden占800M,每個Survivor占100M)

1.開始時創(chuàng)建的對象都是分配在Eden區(qū)域中,當Eden區(qū)快滿了,就會觸發(fā)垃圾回收Minor GC(使用復制算法進行垃圾回收)

在這里插入圖片描述

2.Minor GC處理后,首先會把Eden區(qū)中還存活著的對象一次性轉(zhuǎn)入其中一塊空閑著的Survivor區(qū)。然后清空Eden區(qū),之后創(chuàng)建的對象就繼續(xù)放入Eden區(qū)中了,直至下次Eden又被填滿。

在這里插入圖片描述

3.Eden再次被填滿時,就會再次出發(fā)Minor GC,清理后(Minor會清理Eden區(qū)和Survivor區(qū)的內(nèi)存),Eden區(qū)和存在對象的Survivor區(qū)(此時的from區(qū))中存活的對象轉(zhuǎn)移到另一塊空著的Survivor區(qū)中(此時的to區(qū)),并清空Eden區(qū)和之前存在對象的Survivor區(qū)(此時變?yōu)閠o區(qū)了,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。)

這就是復制算法的流程。
一直要保持一個Survivor區(qū)是空的以提供復制算法垃圾回收,而這塊區(qū)域的內(nèi)存只占整塊的10%,其他90%內(nèi)存都可以被使用,課件內(nèi)存利用率還是相當高的。

二、什么時候進入老年區(qū)呢?

1 經(jīng)歷15次GC后進入老年區(qū)

默認情況下,如果新生區(qū)中的某個對象經(jīng)歷了15次GC后,還是沒有被回收掉,那么它就會被轉(zhuǎn)入老年區(qū)。
可通過JVM參數(shù)“-XX:MaxTenuringThreshold”來設置,默認是15。

2 動態(tài)對象年齡判斷

這種方法不用等到經(jīng)歷GC15次。
假如一批對象總大小大于當前Survivor區(qū)內(nèi)存的50%,那么大于等于這批對象年齡的對象就會被轉(zhuǎn)移到老年區(qū)。

例:假設Survivor0區(qū)中的兩個對象都經(jīng)歷的3次GC(年齡3),而且這兩個對象總大小50M,超過了Survivor0區(qū)內(nèi)存大小的一半。那么此時Survivor0區(qū)中年齡大于等于3歲的對象就都要被全部轉(zhuǎn)移到老年區(qū)。

在這里插入圖片描述

3 大對象直接進入老年代

有一個JVM參數(shù)"-XX:PretenureSizeThreshold",默認值是0,表示任何情況都先把對象分配給Eden區(qū)。
若設置為1048576字節(jié),也就是1M。則表示當創(chuàng)建的對象大于1M時,就會直接把這個對象放入到老年區(qū),就根本不會經(jīng)過新生區(qū)了。
這么做的原因:大對象在經(jīng)歷復制算法進行GC的時候會降低性能。

4 Minor GC后存活的對象太多無法放入Survivor區(qū)了

Minor GC后存活的對象太多,導致Survivor區(qū)放不下了,此時就會將所有的對象直接轉(zhuǎn)移到老年區(qū)中。

三、老年區(qū)空間分配擔保原則

執(zhí)行每一次Minor GC前,JVM都先檢查一下老年區(qū)可用的內(nèi)存空間是否大于新生區(qū)所有對象的總大小。

原因:極端情況下,Minor GC后,新生代中所有的對象都活了下來,那就會把所有新生代中的對象放入老年區(qū)中。

  • 如果說老年區(qū)可用內(nèi)存大于新生代對象總大小,那么就可以放心的執(zhí)行Minor GC。
  • 但如果老年區(qū)內(nèi)存小于新生區(qū)對象的總大小,這時候就會看一個參數(shù):“-XX:HandlePromotionFailure”是否設置為true了。如果為true,就進入下一次判斷,看老年區(qū)可用內(nèi)存是否大于之前每次Minor GC后進入老年區(qū)對象的平均大小。如果老年代可用內(nèi)存小于平均大小或是參數(shù)沒有設置成true,那就會直接觸發(fā)“Full GC”,就是對老年代進行垃圾回收,騰出空間后,再進行Minor GC,相當于對新生區(qū)、老年區(qū)統(tǒng)一做了一次清理。

三種情況遞進理解:

1.如果Minor GC后,存活的對象<Survivor區(qū)大小,直接進入Survivor區(qū)即可;

2.如果Minor GC后,存活的對象>Survivor區(qū)大小,但<老年區(qū)可用內(nèi)存,直接進入老年區(qū);

3.若Minor GC后,此時老年區(qū)都放不下這些存活的對象了,就會觸發(fā)Full GC;
如果Full GC后老年區(qū)內(nèi)存還是不夠用,就會導致OOM內(nèi)存溢出。

四、老年區(qū)垃圾回收算法

標記整理算法

【原理】

一開始對象都是任意分布的,在經(jīng)歷完垃圾回收之后,就會標記出哪些是存活對象,哪些是垃圾對象,然后就會把這些存活的對象在內(nèi)存中進行整理移動,盡量都挪到一邊去靠在一起,然后再把垃圾對象進行清除,這樣做的好處就是避免了垃圾回收后產(chǎn)生的大片內(nèi)存碎片。

在這里插入圖片描述

【缺點】

較為耗時,比復制算法慢10倍;

所以如果系統(tǒng)頻繁出現(xiàn)Full GC,會嚴重影響系統(tǒng)性能,出現(xiàn)卡頓。所以JVM優(yōu)化的一大問題就是減少Full GC頻率。

五、垃圾回收器

新生區(qū)和老年區(qū)進行垃圾回收時是通過不同的垃圾回收器進行回收的

Seral 和 Seral Old垃圾回收器

  • 分別用于回收新生區(qū)和老年區(qū)。
  • 單線程運行,垃圾回收時會停止我們系統(tǒng)的其他線程,再執(zhí)行垃圾回收(不再使用);

ParNew和CMS垃圾回收器

  • 分別用于新生區(qū)和老年區(qū);
  • 多線程并發(fā),性能更好,現(xiàn)在一般是線上生產(chǎn)系統(tǒng)的標配。

G1垃圾回收器

統(tǒng)一收集新生區(qū)和老年區(qū),采用更加優(yōu)秀的算法機制。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!    

相關文章

  • 使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    MyBatis 是一個基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例

    SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例

    這篇文章主要介紹了SpringCloud Zuul過濾器實現(xiàn)登陸鑒權代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • springboot1.X和2.X中如何解決Bean名字相同時覆蓋

    springboot1.X和2.X中如何解決Bean名字相同時覆蓋

    這篇文章主要介紹了springboot1.X和2.X中如何解決Bean名字相同時覆蓋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法

    SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法

    這篇文章主要介紹了SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • Java單表實現(xiàn)評論回復功能(多種實現(xiàn)方式)

    Java單表實現(xiàn)評論回復功能(多種實現(xiàn)方式)

    這篇文章主要介紹了Java單表實現(xiàn)評論回復功能,大家都知道評論功能有多種實現(xiàn)方式,本文逐一給大家詳細講解,需要的朋友可以參考下
    2023-03-03
  • Java8 Comparator排序方法實例詳解

    Java8 Comparator排序方法實例詳解

    這篇文章主要介紹了Java8 Comparator排序方法實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java8新特性之默認方法和靜態(tài)方法

    Java8新特性之默認方法和靜態(tài)方法

    這篇文章主要給大家介紹了關于Java8新特性之默認方法和靜態(tài)方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 詳解Spring依賴注入的三種方式以及優(yōu)缺點

    詳解Spring依賴注入的三種方式以及優(yōu)缺點

    IoC?和?DI?是?Spring?中最重要的兩個概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實現(xiàn)。那么?DI?實現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來和大家一起詳細聊聊
    2022-08-08
  • 如何使用idea里面自帶的翻譯插件

    如何使用idea里面自帶的翻譯插件

    這篇文章主要介紹了idea里面自帶的翻譯插件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • springboot2 生產(chǎn)部署注意事項及示例代碼

    springboot2 生產(chǎn)部署注意事項及示例代碼

    這篇文章主要介紹了springboot2 生產(chǎn)部署注意事項及示例代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04

最新評論

托克逊县| 盈江县| 封开县| 晋江市| 高要市| 上林县| 盐津县| 神木县| 察隅县| 安康市| 高唐县| 永丰县| 红桥区| 鹤山市| 上蔡县| 修武县| 石林| 罗江县| 西林县| 望都县| 贵州省| 绥化市| 锦屏县| 通山县| 黄骅市| 水富县| 岢岚县| 称多县| 隆化县| 滁州市| 康乐县| 西峡县| 宁明县| 泾阳县| 乐安县| 马山县| 拉孜县| 东阳市| 新泰市| 满城县| 兰西县|