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

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

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

一、前言:

垃圾回收:

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

先問自己幾個問題:

什么是垃圾?

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

為什么要回收垃圾?

  • 因?yàn)槲覀兊膬?nèi)存是有限的,內(nèi)存長時間不清理就會導(dǎo)致內(nèi)存溢出,OOM;
  • 只要是程序正在跑,那么就不斷生成新的對象,我們需要GC開辟新的空間分配給新的對象

我們怎么回收垃圾?

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

什么時候回收垃圾?

  • 當(dāng)堆中的實(shí)體對象沒有任何指針指向的時候

二、GC的標(biāo)記階段算法:

標(biāo)記&清除

1、引用計(jì)數(shù)(Reference Counting):

Java已經(jīng)擯棄了這種算法,因?yàn)榇怂惴ㄐ枰念~外處理過多

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

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

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

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

哪些是GC Roots?

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

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

【缺】需要遍歷

三、垃圾收集算法:

標(biāo)記清除算法
復(fù)制算法
標(biāo)記清除整理算法

標(biāo)記-清除算法:

先mark可達(dá)對象,從根節(jié)點(diǎn)開始進(jìn)行線性遍歷。

【優(yōu)】夠平均

【缺】效率不高,GC的時候?qū)е耂TW,清楚后存在內(nèi)存碎片(會存在一個空閑列表)

這是最快的清除算法

復(fù)制算法

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

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

【缺】犧牲了大量的空間,”最好你們?nèi)渴抢 ?/p>

標(biāo)記-清除-整理算法

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

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

【缺】時間慢,需要進(jìn)行多次操作。

四、finalize&內(nèi)存分析工具

finalization——免死金牌

finalize是給GC調(diào)用的

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

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

MAT & GC Roots:

Memory Analyzer Tools 內(nèi)存分析工具

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

分區(qū)算法

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

實(shí)際的使用都是復(fù)合算法。

String

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

Serializable修飾是跨進(jìn)程

Comparable可比較的

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

相關(guān)文章

  • Java枚舉之EnumSet詳解

    Java枚舉之EnumSet詳解

    這篇文章主要介紹了Java枚舉之EnumSet詳解,使用時進(jìn)行與或運(yùn)算,但是定義多了之后,會很亂、臃腫,編寫容易出錯,EnumSet可以實(shí)現(xiàn)類似的功能,且使用起來很簡潔,需要的朋友可以參考下
    2023-12-12
  • Java設(shè)計(jì)模式之責(zé)任鏈模式簡介

    Java設(shè)計(jì)模式之責(zé)任鏈模式簡介

    這篇文章主要介紹了Java設(shè)計(jì)模式之責(zé)任鏈模式,需要的朋友可以參考下
    2014-07-07
  • JUnit4 Hamcrest匹配器常用方法總結(jié)

    JUnit4 Hamcrest匹配器常用方法總結(jié)

    這篇文章主要介紹了JUnit4 Hamcrest匹配器常用方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java中的包(package)是什么和使用方法

    Java中的包(package)是什么和使用方法

    包是Java中一種強(qiáng)大的組織代碼的工具,它們幫助開發(fā)者將代碼分組,防止命名沖突,并通過控制訪問級別來增強(qiáng)代碼的安全性,這篇文章主要介紹了Java中的包(package)是什么和如何使用它們,需要的朋友可以參考下
    2024-07-07
  • Spring?boot?啟動流程及外部化配置方法

    Spring?boot?啟動流程及外部化配置方法

    平時我們開發(fā)Spring boot 項(xiàng)目的時候,一個SpringBootApplication注解加一個main方法就可以啟動服務(wù)器運(yùn)行起來,那它到底是怎么運(yùn)行起來的呢?這篇文章主要介紹了Spring?boot?啟動流程及外部化配置,需要的朋友可以參考下
    2022-12-12
  • Java實(shí)現(xiàn)Token登錄驗(yàn)證的項(xiàng)目實(shí)踐

    Java實(shí)現(xiàn)Token登錄驗(yàn)證的項(xiàng)目實(shí)踐

    本文主要介紹了Java實(shí)現(xiàn)Token登錄驗(yàn)證的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • springboot下配置多數(shù)據(jù)源的方法

    springboot下配置多數(shù)據(jù)源的方法

    本篇文章主要介紹了springboot下配置多數(shù)據(jù)源的方法,具有一定的參考價值,有興趣的可以了解一下
    2017-04-04
  • Java8中AbstractExecutorService與FutureTask源碼詳解

    Java8中AbstractExecutorService與FutureTask源碼詳解

    這篇文章主要給大家介紹了關(guān)于Java8中AbstractExecutorService與FutureTask的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • 詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法

    詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法

    本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-12-12
  • Java使用Scanner類進(jìn)行控制臺輸入實(shí)現(xiàn)方法

    Java使用Scanner類進(jìn)行控制臺輸入實(shí)現(xiàn)方法

    這篇文章主要介紹了Java使用Scanner類進(jìn)行控制臺輸入實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論