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

淺談JVM垃圾回收有哪些常用算法

 更新時間:2021年06月22日 11:47:50   作者:亭中獨酌  
今天給大家?guī)淼氖顷P于Java虛擬機的相關知識,文章圍繞著JVM垃圾回收有哪些常用算法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

一、前言:

垃圾回收:

在未來的JDK中可能G1會為ZGC所取代

先問自己幾個問題:

什么是垃圾?

  • 垃圾就是堆內存中(范指)沒有任何指針指向的對象實體。不具有可達性。

為什么要回收垃圾?

  • 因為我們的內存是有限的,內存長時間不清理就會導致內存溢出,OOM;
  • 只要是程序正在跑,那么就不斷生成新的對象,我們需要GC開辟新的空間分配給新的對象

我們怎么回收垃圾?

  • 依靠Java的自動內存回收機制,機制的優(yōu)劣由算法決定;
  • 或者說是機制的適配度由算法和應用場景共同決定。

什么時候回收垃圾?

  • 當堆中的實體對象沒有任何指針指向的時候

二、GC的標記階段算法:

標記&清除

1、引用計數(Reference Counting):

Java已經擯棄了這種算法,因為此算法需要的額外處理過多

【優(yōu)】效率高,python也在用,就像論文的引用因子一樣,沒有用的文章就應該多多回收,清理學術垃圾。

【缺】無法處理對象的相互“循環(huán)引用”,一旦形成了引用環(huán),就沒有辦法去解決。進而造成內存泄漏。

2、可達性分析⭐(根搜索、Tracing Garage Collection):

GC Roots = 起始節(jié)點集,從GC Roots開始向下搜索,連接的路徑為引用鏈,GC Roots不可達的對象被判為不可用。

哪些是GC Roots?

  • 虛擬棧上的棧幀的局部變量表引用的對象;
  • 方法區(qū)上常量引用
  • 方法區(qū)上靜態(tài)變量
  • 被同步鎖修飾的對象
  • 除了堆區(qū),和堆有聯(lián)系的都是起始節(jié)點……

【優(yōu)】解決了循環(huán)引用的缺點

【缺】需要遍歷

三、垃圾收集算法:

標記清除算法
復制算法
標記清除整理算法

標記-清除算法:

先mark可達對象,從根節(jié)點開始進行線性遍歷。

【優(yōu)】夠平均

【缺】效率不高,GC的時候導致STW,清楚后存在內存碎片(會存在一個空閑列表)

這是最快的清除算法

復制算法

先把空間分為兩個部分,把標記的對象規(guī)整地移到另一個空間中(指針碰撞的方式)

【優(yōu)】高效,無需mark/sweep;沒有內存碎片;

【缺】犧牲了大量的空間,”最好你們全部是垃圾!“

標記-清除-整理算法

在標記之后清除完了再進行整理,屬于標記清除算法的優(yōu)化版,無空閑列表

【優(yōu)】無空閑列表,無內存碎片;空間開銷低

【缺】時間慢,需要進行多次操作。

四、finalize&內存分析工具

finalization——免死金牌

finalize是給GC調用的

【問】回收的時候會涉及到哪些操作?會伴隨著什么狀態(tài)?

  • 可觸及:正常狀態(tài),在GC Roots的引用鏈上;
  • 可復活:需要重寫finalize方法才有的,“皇帝賜給你的重寫finalize方法”
  • 不可觸及:finalize免死金牌只能用一次,如果沒有重寫的finalize方法,那么就直接掛了。

MAT & GC Roots:

Memory Analyzer Tools 內存分析工具

分析dump文件:根據GC Roots去溯源,監(jiān)控內存泄漏→ JProfiler

分區(qū)算法

將堆空間分成小空間是為了降低停頓時間,降低延遲

實際的使用都是復合算法。

String

final是寫死的,不能繼承也不能做任何修改;

Serializable修飾是跨進程

Comparable可比較的

到此這篇關于淺談JVM垃圾回收有哪些常用算法的文章就介紹到這了,更多相關JVM垃圾回收算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring的異步執(zhí)行使用與源碼詳解

    spring的異步執(zhí)行使用與源碼詳解

    這篇文章主要介紹了spring的異步執(zhí)行使用與源碼詳解,Spring中通過在方法上設置@Async注解,可使得方法被異步調用,需要的朋友可以參考下
    2023-05-05
  • Java?Map雙列集合使代碼更高效

    Java?Map雙列集合使代碼更高效

    這篇文章主要介紹了Java?Map雙列集合使用,使你的代碼更高效,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Mybatis?Plus使用@TableId之坑及解決

    Mybatis?Plus使用@TableId之坑及解決

    這篇文章主要介紹了Mybatis?Plus使用@TableId之坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java 漢諾塔詳解及實現代碼

    java 漢諾塔詳解及實現代碼

    這篇文章主要介紹了java 漢諾塔詳解及實現代碼的相關資料,需要的朋友可以參考下
    2017-04-04
  • 探討Java中函數是值傳遞還是引用傳遞問題

    探討Java中函數是值傳遞還是引用傳遞問題

    這篇文章主要介紹了探討Java中函數是值傳遞還是引用傳遞問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Java中getSuperclass()方法的使用與原理解讀

    Java中getSuperclass()方法的使用與原理解讀

    文章介紹了Java中的getSuperclass()方法,該方法用于獲取一個類的直接父類,通過理解其使用方式、工作原理以及實際應用場景,可以更好地利用反射機制處理類的繼承關系,實現動態(tài)類型檢查、類加載以及序列化等功能
    2025-01-01
  • spring boot使用@Async異步注解的實現原理+源碼

    spring boot使用@Async異步注解的實現原理+源碼

    通常我們都是采用多線程的方式來實現上述業(yè)務功能,但spring 提供更優(yōu)雅的方式來實現上述功能,就是@Async 異步注解,在方法上添加@Async,spring就會借助AOP,異步執(zhí)行方法,接下來通過本文給大家介紹spring boot異步注解的相關知識,一起看看吧
    2021-06-06
  • springboot+kafka中@KafkaListener動態(tài)指定多個topic問題

    springboot+kafka中@KafkaListener動態(tài)指定多個topic問題

    這篇文章主要介紹了springboot+kafka中@KafkaListener動態(tài)指定多個topic問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • spring-boot-maven-plugin報紅解決方案(親測有效)

    spring-boot-maven-plugin報紅解決方案(親測有效)

    本文主要介紹了spring-boot-maven-plugin報紅解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 聊聊Spring Cloud Cli 初體驗

    聊聊Spring Cloud Cli 初體驗

    這篇文章主要介紹了聊聊Spring Cloud Cli 初體驗,SpringBoot CLI 是spring Boot項目的腳手架工具。非常具有實用價值,需要的朋友可以參考下
    2018-04-04

最新評論

乌拉特中旗| 博客| 曲沃县| 天镇县| 平利县| 永昌县| 卓尼县| 临清市| 福清市| 新乐市| 衢州市| 延长县| 化州市| 广安市| 灵台县| 巴彦淖尔市| 荃湾区| 根河市| 石家庄市| 罗田县| 罗江县| 施秉县| 綦江县| 安化县| 海盐县| 盐边县| 黎城县| 玛沁县| 卢氏县| 江陵县| 大埔区| 鲁甸县| 缙云县| 华容县| 城口县| 扎鲁特旗| 日土县| 罗城| 井研县| 沾益县| 鄱阳县|