淺談JVM垃圾回收有哪些常用算法
一、前言:
垃圾回收:
在未來的JDK中可能G1會(huì)為ZGC所取代
先問自己幾個(gè)問題:
什么是垃圾?
- 垃圾就是堆內(nèi)存中(范指)沒有任何指針指向的對(duì)象實(shí)體。不具有可達(dá)性。
為什么要回收垃圾?
- 因?yàn)槲覀兊膬?nèi)存是有限的,內(nèi)存長時(shí)間不清理就會(huì)導(dǎo)致內(nèi)存溢出,OOM;
- 只要是程序正在跑,那么就不斷生成新的對(duì)象,我們需要GC開辟新的空間分配給新的對(duì)象。
我們?cè)趺椿厥绽?/p>
- 依靠Java的自動(dòng)內(nèi)存回收機(jī)制,機(jī)制的優(yōu)劣由算法決定;
- 或者說是機(jī)制的適配度由算法和應(yīng)用場(chǎng)景共同決定。
什么時(shí)候回收垃圾?
- 當(dāng)堆中的實(shí)體對(duì)象沒有任何指針指向的時(shí)候
二、GC的標(biāo)記階段算法:
標(biāo)記&清除
1、引用計(jì)數(shù)(Reference Counting):
Java已經(jīng)擯棄了這種算法,因?yàn)榇怂惴ㄐ枰念~外處理過多
【優(yōu)】效率高,python也在用,就像論文的引用因子一樣,沒有用的文章就應(yīng)該多多回收,清理學(xué)術(shù)垃圾。
【缺】無法處理對(duì)象的相互“循環(huán)引用”,一旦形成了引用環(huán),就沒有辦法去解決。進(jìn)而造成內(nèi)存泄漏。
2、可達(dá)性分析⭐(根搜索、Tracing Garage Collection):
GC Roots = 起始節(jié)點(diǎn)集,從GC Roots開始向下搜索,連接的路徑為引用鏈,GC Roots不可達(dá)的對(duì)象被判為不可用。
哪些是GC Roots?
- 虛擬棧上的棧幀的局部變量表引用的對(duì)象;
- 方法區(qū)上常量引用
- 方法區(qū)上靜態(tài)變量
- 被同步鎖修飾的對(duì)象
- 除了堆區(qū),和堆有聯(lián)系的都是起始節(jié)點(diǎn)……
【優(yōu)】解決了循環(huán)引用的缺點(diǎn)
【缺】需要遍歷
三、垃圾收集算法:
標(biāo)記清除算法
復(fù)制算法
標(biāo)記清除整理算法
標(biāo)記-清除算法:
先mark可達(dá)對(duì)象,從根節(jié)點(diǎn)開始進(jìn)行線性遍歷。
【優(yōu)】夠平均
【缺】效率不高,GC的時(shí)候?qū)е耂TW,清楚后存在內(nèi)存碎片(會(huì)存在一個(gè)空閑列表)
這是最快的清除算法
復(fù)制算法
先把空間分為兩個(gè)部分,把標(biāo)記的對(duì)象規(guī)整地移到另一個(gè)空間中(指針碰撞的方式)
【優(yōu)】高效,無需mark/sweep;沒有內(nèi)存碎片;
【缺】犧牲了大量的空間,”最好你們?nèi)渴抢?!?/p>
標(biāo)記-清除-整理算法
在標(biāo)記之后清除完了再進(jìn)行整理,屬于標(biāo)記清除算法的優(yōu)化版,無空閑列表
【優(yōu)】無空閑列表,無內(nèi)存碎片;空間開銷低
【缺】時(shí)間慢,需要進(jìn)行多次操作。
四、finalize&內(nèi)存分析工具
finalization——免死金牌
finalize是給GC調(diào)用的
【問】回收的時(shí)候會(huì)涉及到哪些操作?會(huì)伴隨著什么狀態(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í)間,降低延遲
實(shí)際的使用都是復(fù)合算法。
String
final是寫死的,不能繼承也不能做任何修改;
Serializable修飾是跨進(jìn)程
Comparable可比較的
到此這篇關(guān)于淺談JVM垃圾回收有哪些常用算法的文章就介紹到這了,更多相關(guān)JVM垃圾回收算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中g(shù)etSuperclass()方法的使用與原理解讀
文章介紹了Java中的getSuperclass()方法,該方法用于獲取一個(gè)類的直接父類,通過理解其使用方式、工作原理以及實(shí)際應(yīng)用場(chǎng)景,可以更好地利用反射機(jī)制處理類的繼承關(guān)系,實(shí)現(xiàn)動(dòng)態(tài)類型檢查、類加載以及序列化等功能2025-01-01
spring boot使用@Async異步注解的實(shí)現(xiàn)原理+源碼
通常我們都是采用多線程的方式來實(shí)現(xiàn)上述業(yè)務(wù)功能,但spring 提供更優(yōu)雅的方式來實(shí)現(xiàn)上述功能,就是@Async 異步注解,在方法上添加@Async,spring就會(huì)借助AOP,異步執(zhí)行方法,接下來通過本文給大家介紹spring boot異步注解的相關(guān)知識(shí),一起看看吧2021-06-06
springboot+kafka中@KafkaListener動(dòng)態(tài)指定多個(gè)topic問題
這篇文章主要介紹了springboot+kafka中@KafkaListener動(dòng)態(tài)指定多個(gè)topic問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
spring-boot-maven-plugin報(bào)紅解決方案(親測(cè)有效)
本文主要介紹了spring-boot-maven-plugin報(bào)紅解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

