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

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

這篇具有很好參考價值的文章主要介紹了JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?? 作者簡介:努力的clz ,一個努力編程的菜鳥 ??????
?
?? 文章專欄:《JVM 學(xué)習(xí)筆記》 ,本專欄會專門記錄博主在學(xué)習(xí) JVM 中學(xué)習(xí)的知識點,以及遇到的問題。
?
?? 文章詳情: 本篇博客是學(xué)習(xí) 【狂神說Java】JVM快速入門篇 的學(xué)習(xí)筆記,關(guān)于 GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法) 知識點的學(xué)習(xí)總結(jié),由于這三個知識點的相互聯(lián)系,所以放在一起進(jìn)行描述介紹。
?
?????????????????????? ?????? ???????? ???????????????? ???? ????????????????????

?


一、堆

1. JVM體系結(jié)構(gòu)圖

簡單回顧下 JVM體系結(jié)構(gòu)圖 ,后續(xù)將針對 進(jìn)行展開學(xué)習(xí)。

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


2. 堆

Heap 堆,一個JVM實例只存在一個堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的;

類加載器讀取了類文件后,需要 把類,方法,常變量放到堆內(nèi)存中,保存所有引用類型的真實信息,以方便執(zhí)行器執(zhí)行;

?

堆內(nèi)存邏輯上分為三部分:新生,養(yǎng)老,永久 (元空間 : JDK8 以后名稱)

GC垃圾回收主要是在 新生區(qū)和養(yǎng)老區(qū),又分為 輕GC 和 重GC。

如果內(nèi)存滿了,OOM 堆內(nèi)存不夠,就會導(dǎo)致java.lang.OutOfMemoryError: Java heap space

堆內(nèi)存結(jié)構(gòu)
新生區(qū) Young Generation Space Young/New
養(yǎng)老區(qū) Tenure generation space Old/Tenure
永久區(qū) Permanent Space Perm

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?

新生區(qū):

新生區(qū)是類誕生,成長,消亡的區(qū)域,一個類在這里產(chǎn)生,應(yīng)用,最后被垃圾回收器收集,結(jié)束生命。

新生區(qū)又分為兩部分:伊甸區(qū)(Eden Space)和幸存者區(qū)(Survivor Space),所有的類都是在伊甸區(qū)被new出來的;

幸存區(qū)有兩個:0區(qū) 和 1區(qū);

當(dāng)伊甸園的空間用完時,程序又需要創(chuàng)建對象,JVM的垃圾回收器將對伊甸園區(qū)進(jìn)行垃圾回收 (Minor GC)。

?
養(yǎng)老區(qū)

將伊甸園中的剩余對象移動到幸存0區(qū),若幸存0區(qū)也滿了,再對該區(qū)進(jìn)行垃圾回收,然后移動到1區(qū),那如果1區(qū)也滿了呢?

這里幸存0區(qū)和1區(qū)是一個互相交替的過程

就再移動到養(yǎng)老區(qū),若養(yǎng)老區(qū)也滿了,那么這個時候?qū)a(chǎn)生 MajorGC(Full GC),進(jìn)行養(yǎng)老區(qū)的內(nèi)存清理,若養(yǎng)老區(qū)執(zhí)行了Full GC 后發(fā)現(xiàn)依然無法進(jìn)行對象的保存,就會 產(chǎn)生OOM異?!癘utOfMemoryError ”。

如果出現(xiàn) java.lang.OutOfMemoryError:java heap space異常,說明Java虛擬機的堆內(nèi)存不夠,原因如下:

1、Java虛擬機的堆內(nèi)存設(shè)置不夠,可以通過參數(shù) -Xms(初始值大小),-Xmx(最大大?。﹣碚{(diào)整。

2、代碼中創(chuàng)建了 大量大對象,并且長時間不能被垃圾收集器收集(存在被引用)或者死循環(huán)了。

?

永久區(qū)(Perm):

? 永久存儲區(qū)是一個常駐內(nèi)存區(qū)域,用于存放JDK自身所攜帶的Class,Interface的元數(shù)據(jù),也就是說它存儲的是運行環(huán)境必須的類

信息,被裝載進(jìn)此區(qū)域的數(shù)據(jù)是不會被垃圾回收器回收掉的,關(guān)閉JVM才會釋放此區(qū)域所占用的內(nèi)存。

如果出現(xiàn) java.lang.OutOfMemoryError:PermGen space ,說明是 Java虛擬機對永久代Perm內(nèi)存設(shè)置不夠。一般出現(xiàn)這種情況,

都是程序啟動需要加載大量的第三方j(luò)ar包。

? 例如:在一個Tomcat下部署了太多的應(yīng)用?;蛘叽罅縿討B(tài)反射生成的類不斷被加載,最終導(dǎo)致Perm區(qū)被占滿。

Jdk1.6之前: 有永久代,常量池1.6在方法區(qū)

Jdk1.7: 有永久代,但是已經(jīng)逐步 “去永久代”,常量池1.7在堆

Jdk1.8及之后:無永久代,常量池1.8在元空間

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


二、GC分類

熟悉堆的三區(qū)結(jié)構(gòu)后,方可學(xué)習(xí)JVM垃圾回收機制。

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

記住GC口訣: 分代收集算法

次數(shù)頻繁Young區(qū),次數(shù)較少Old區(qū),基本不動Perm(永久區(qū))區(qū)

?

JVM在GC時,并非每次都對上面三個內(nèi)存區(qū)域一起回收的,大部分時候回收的都是新生代

GC安裝回收的區(qū)域分成兩種:普通GC(minor GC),全局GC(major GC or Full GC)

普通GC:只針對新生代的GC

全局GC:針對老年代的GC,偶爾伴隨對新生代的GC以及對永久代的GC

?


三、GC四大算法

1. 引用計數(shù)法

每個對象有一個引用計數(shù)器,當(dāng)對象被引用一次則計數(shù)器加1,當(dāng)對象引用失效一次,則計數(shù)器減1;
對于計數(shù)器為0的對象意味著是垃圾對象,可以被GC回收。

目前虛擬機基本都是采用 可達(dá)性算法 ,從 GC Roots 作為起點開始搜索,那么整個連通圖中的對象里邊都是活對象,對于GC Roots 無法到達(dá)的對象變成了垃圾回收對象,隨時可被GC回收。

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


2. 復(fù)制算法

年輕代中使用的是 Minor GC,采用的就是 復(fù)制算法 (Copying)

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)
?

好處:沒有內(nèi)存碎片,壞處:浪費內(nèi)存空間

劣勢:
1、他浪費了一半的內(nèi)存,這太要命了.

2、如果對象的存活率很高,我們可以極端一點,假設(shè)是100%存活,那么我們需要將所有對象都復(fù)制一遍,并將所有引用地址重置一遍。

復(fù)制這一工作所花費的時間,在對象存活率達(dá)到一定程度時,將會變的不可忽視,所以從以上描述不難看出。
復(fù)制算法要想使用,最起碼對象的存活率要非常低才行,而且最重要的是,我們必須要克服50%的內(nèi)存浪費。

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


3. 標(biāo)記清除(Mark-Sweep)

掃描(Mark):從根集合開始掃描,對存活的對象進(jìn)行標(biāo)記
?
清除(Sweep):掃描整個內(nèi)存空間,回收未標(biāo)記的對象,使用free-list記錄可用區(qū)域

優(yōu)點:不需要額外的空間;

缺點:兩次掃描,驗證浪費時間,會產(chǎn)生內(nèi)存碎片;

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


4. 標(biāo)記清除壓縮算法(Mark-Sweep-Compact)

進(jìn)一步優(yōu)化——標(biāo)記壓縮(Mark-Compact)

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)
?

最終版本算法 —— 先標(biāo)記清除幾次,再進(jìn)行壓縮

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

?


總結(jié)

內(nèi)存效率復(fù)制算法 > 標(biāo)記清除算法 > 標(biāo)記整理算法 (時間復(fù)雜度)
?
內(nèi)存整齊度復(fù)制算法 = 標(biāo)記整理算法 > 標(biāo)記清除算法
?
內(nèi)存利用率標(biāo)記整理算法 = 標(biāo)記清除算法 > 復(fù)制算法

可以看出,效率上來說,復(fù)制算法是當(dāng)之無愧的老大,但是卻浪費了太多內(nèi)存,而為了盡量兼顧上面所提到的三個指標(biāo),標(biāo)記整理算法相對來說更平滑一些 , 但是效率上依然不盡如人意,它比復(fù)制算法多了一個標(biāo)記的階段,又比標(biāo)記清除多了一個整理內(nèi)存的過程。

?

【問】難道就沒有一種最優(yōu)算法嗎?

答案 : 無,沒有最好的算法,只有最合適的算法 —— GC: 分代收集算法

年輕代:

  • 存活率低
  • 使用復(fù)制算法

?

老年代:

  • 區(qū)域大,存活率高
  • 標(biāo)記清除(內(nèi)存碎片不是太多的時候) + 標(biāo)記壓縮混合

?

點擊可快速回到文章開頭:文章頂部 ????


JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)

JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)文章來源地址http://www.zghlxwxcb.cn/news/detail-418217.html

到了這里,關(guān)于JVM學(xué)習(xí) GC垃圾回收機制 (堆內(nèi)存結(jié)構(gòu)、GC分類、四大垃圾回收算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • JVM解密: 解構(gòu)類加載與GC垃圾回收機制

    JVM解密: 解構(gòu)類加載與GC垃圾回收機制

    JVM 其實是一個 Java 進(jìn)程,該進(jìn)程會從操作系統(tǒng)中申請一大塊內(nèi)存區(qū)域,提供給 Java 代碼使用,申請的內(nèi)存區(qū)域會進(jìn)一步做出劃分,給出不同的用途。 其中最核心的是棧,堆,方法區(qū)這幾個區(qū)域: 堆,用來放置 new 出來的對象,類成員變量。 棧,維護(hù)方法之間的調(diào)用關(guān)系,放

    2024年02月10日
    瀏覽(24)
  • JVM基礎(chǔ)知識(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)

    JVM基礎(chǔ)知識(內(nèi)存區(qū)域劃分,類加載,GC垃圾回收)

    目錄 內(nèi)存區(qū)域劃分 JVM中的棧 JVM中的堆 程序計數(shù)器 方法區(qū)(元數(shù)據(jù)區(qū)) 給一段代碼,某個變量在哪個區(qū)域上? 類加載 類加載時機 雙親委派模型 GC 垃圾回收機制 GC 實際工作過程 1.找到垃圾/判定垃圾 1.可達(dá)性分析(Java中的做法) 2.引用計數(shù) 2.清理垃圾 1.標(biāo)記清除 2.復(fù)制算法 3.標(biāo)記整

    2024年02月07日
    瀏覽(27)
  • JVM | 垃圾回收器(GC)- Java內(nèi)存管理的守護(hù)者

    JVM | 垃圾回收器(GC)- Java內(nèi)存管理的守護(hù)者

    在編程世界中, 有效的內(nèi)存管理 是至關(guān)重要的。這不僅確保了應(yīng)用程序的穩(wěn)定運行,還可以大大提高性能和響應(yīng)速度。作為世界上最受歡迎的編程語言之一,通過Java虛擬機內(nèi)部的垃圾回收器組件來自動管理內(nèi)存,是成為之一的其中一項必不可少的技術(shù)點。 在許多傳統(tǒng)的編程

    2024年02月09日
    瀏覽(28)
  • [Unity]?淺談Unity內(nèi)存優(yōu)化,內(nèi)存碎片?僵尸內(nèi)存?以及什么是GC垃圾回收機制。

    [Unity]?淺談Unity內(nèi)存優(yōu)化,內(nèi)存碎片?僵尸內(nèi)存?以及什么是GC垃圾回收機制。

    目錄 ???一、什么是內(nèi)存? 1.物理內(nèi)存?? 2.虛擬內(nèi)存 ???二、Unity的內(nèi)存 1.Unity的內(nèi)存分類 2.游戲運行時內(nèi)存占用情況 3.什么是MONO內(nèi)存? 4.內(nèi)存碎片、僵尸內(nèi)存 ??三、GC 垃圾回收 1.定義 2.一張圖清晰得看一下流程~ 3.GC的作用及步驟 4.GC存在的問題及優(yōu)化策略 ???四、內(nèi)存優(yōu)

    2024年02月03日
    瀏覽(68)
  • 深入理解JVM——垃圾回收與內(nèi)存分配機制詳細(xì)講解

    深入理解JVM——垃圾回收與內(nèi)存分配機制詳細(xì)講解

    所謂垃圾回收,也就是要回收已經(jīng)“死了”的對象。 那我們?nèi)绾闻袛嗄男ο蟆按婊睢?,哪些已?jīng)“死去”呢? 給對象中添加一個引用計數(shù)器,每當(dāng)有一個地方引用它時,計數(shù)器就加一;當(dāng)引用失效時,計數(shù)器就減1;任何時刻計數(shù)器為0的對象就是不可能再被使用的。 但是

    2024年02月12日
    瀏覽(26)
  • 深入探討Java虛擬機(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機制

    深入探討Java虛擬機(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機制

    目錄 什么是JVM? JVM 執(zhí)行流程 JVM 運行時數(shù)據(jù)區(qū) 堆(線程共享) Java虛擬機棧(線程私有) 什么是線程私有? 程序計數(shù)器(線程私有) 方法區(qū)(線程共享) JDK 1.8 元空間的變化 運行時常量池 內(nèi)存布局中的異常問題 1.? Java堆溢出 2.??虛擬機棧和本地方法棧溢出 JVM 類加載 1.

    2024年02月09日
    瀏覽(26)
  • 【Java高級應(yīng)用:深入探索Java編程的強大功能,JVM 類加載機制, JVM 內(nèi)存模型,垃圾回收機制,JVM 字節(jié)碼執(zhí)行,異常處理機制】

    本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發(fā)王大師,專注于天道酬勤的 Java 開發(fā)問題 中國國學(xué)、傳統(tǒng)文化和代碼愛好者的程序人生,期待你的關(guān)注和支持!本人外號:神秘小峯 山峯 轉(zhuǎn)載說明:務(wù)必注明來源(注明:作者:

    2024年01月16日
    瀏覽(27)
  • 【JVM】垃圾回收 GC

    【JVM】垃圾回收 GC

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

    2024年01月16日
    瀏覽(19)
  • JVM----GC(垃圾回收)詳解

    JVM----GC(垃圾回收)詳解

    Automatic Garbage Collection (自動垃圾回收)是JVM的一個特性,JVM會啟動相關(guān)的線程,該線程會輪訓(xùn)檢查heap memeory,并確定哪些是未被引用的(unreferenced),即未被使用的;哪些是被引用的(referenced),即正在使用的。 在C/C++語言中,對象內(nèi)存的分配與回收,是手動進(jìn)行分配與回收

    2024年02月09日
    瀏覽(20)
  • JVM學(xué)習(xí)之內(nèi)存與垃圾回收篇1

    JVM學(xué)習(xí)之內(nèi)存與垃圾回收篇1

    2000年,JDK 1.3發(fā)布,Java Hot Spot Virtual Machine正式發(fā)布,成為Java的默認(rèn)虛擬機。 2006年,JDK 6發(fā)布。同年,Java開源并建立了OpenJDK。順理成章,Hotspot虛擬機也成為了OpenJDK中的默認(rèn)虛擬機。 2008年,Oracle收購了BEA,得到了JRockit虛擬機。 2010年,Oracle收購了Sun,獲得了Java的商標(biāo)和Ho

    2024年02月16日
    瀏覽(41)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包