什么是垃圾
JVM主要通過以下幾種方式來判斷對(duì)象是否需要回收:
-
引用計(jì)數(shù)法:JVM通過引用計(jì)數(shù)器來判斷對(duì)象的引用數(shù)量,當(dāng)引用數(shù)量為0時(shí),表示對(duì)象可以被回收。
-
可達(dá)性分析算法:JVM通過根對(duì)象(如棧中的引用、靜態(tài)變量等)出發(fā),對(duì)對(duì)象進(jìn)行可達(dá)性分析,判斷對(duì)象是否可被訪問到,如果不可達(dá),則表示對(duì)象可以被回收。
-
年齡判斷:對(duì)于分代垃圾回收算法,JVM會(huì)根據(jù)對(duì)象的存活時(shí)間來判斷對(duì)象是否需要回收,存活時(shí)間較長(zhǎng)的對(duì)象會(huì)被移到老年代,存活時(shí)間較短的對(duì)象會(huì)被回收。
-
標(biāo)記階段:在標(biāo)記-清除、標(biāo)記-整理等算法中,JVM會(huì)通過標(biāo)記活動(dòng)對(duì)象來判斷哪些對(duì)象可以被回收。
這些方法結(jié)合起來,幫助JVM判斷哪些對(duì)象可以被回收,從而進(jìn)行垃圾回收操作。文章來源:http://www.zghlxwxcb.cn/news/detail-781485.html
垃圾回收算法
垃圾回收算法 | 區(qū)別 |
---|---|
標(biāo)記-清除算法 | 通過標(biāo)記所有活動(dòng)對(duì)象,然后清除所有未標(biāo)記的對(duì)象來回收內(nèi)存。但會(huì)產(chǎn)生內(nèi)存碎片 |
復(fù)制算法 | 將內(nèi)存分為兩塊,每次只使用其中一塊,當(dāng)這一塊內(nèi)存滿了,就將存活的對(duì)象復(fù)制到另一塊內(nèi)存中,然后清除當(dāng)前內(nèi)存中的所有對(duì)象。不會(huì)產(chǎn)生內(nèi)存碎片 |
標(biāo)記-整理算法 | 類似于標(biāo)記-清除算法,但在清除之后會(huì)將存活的對(duì)象向一端移動(dòng),整理出連續(xù)的內(nèi)存空間。減少內(nèi)存碎片的產(chǎn)生 |
分代算法 | 將內(nèi)存分為新生代和老年代,新生代使用復(fù)制算法,老年代使用標(biāo)記-整理算法,根據(jù)對(duì)象的存活時(shí)間來進(jìn)行不同的垃圾回收處理 |
并發(fā)標(biāo)記清除算法 | 在標(biāo)記和清除階段盡可能與程序并發(fā)執(zhí)行,減少停頓時(shí)間 |
幾個(gè)主流的垃圾回收器
特征 | CMS | G1 | ZGC |
---|---|---|---|
垃圾回收類型 | 并發(fā)標(biāo)記-清除 | 并發(fā)標(biāo)記-整理 | 并發(fā)標(biāo)記-整理 |
目標(biāo) | 減少停頓時(shí)間 | 綜合性能和停頓時(shí)間 | 低停頓時(shí)間和高吞吐量 |
內(nèi)存分區(qū) | 以老年代為主 | 將堆劃分為多個(gè)區(qū)域 | 不需要分代,整個(gè)堆都是一致的 |
停頓時(shí)間 | 有可能出現(xiàn)較長(zhǎng)的停頓時(shí)間 | 相對(duì)較穩(wěn)定的停頓時(shí)間 | 盡可能短的停頓時(shí)間 |
內(nèi)存占用 | 高 | 中等 | 低 |
適用場(chǎng)景 | 適用于內(nèi)存較大、應(yīng)用線程較少的場(chǎng)景 | 適用于大內(nèi)存、多核處理器的場(chǎng)景 | 適用于需要低延遲和大堆的場(chǎng)景 |
這些垃圾回收器各有其特點(diǎn),可以根據(jù)具體的應(yīng)用場(chǎng)景和需求來選擇最合適的垃圾回收器。文章來源地址http://www.zghlxwxcb.cn/news/detail-781485.html
到了這里,關(guān)于jvm垃圾回收相關(guān)的算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!