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

JVM的內(nèi)存回收及常見(jiàn)算法小結(jié)

 更新時(shí)間:2023年05月01日 13:10:24   作者:程序員·小李  
這篇文章主要介紹了JVM的內(nèi)存回收及常見(jiàn)算法,需要的朋友可以參考下

什么樣的對(duì)象應(yīng)該被回收?

某個(gè)對(duì)象不再被棧直接或間接地引用,此時(shí)就應(yīng)該被回收了。

o被指向null的時(shí)候,new Object()創(chuàng)建的對(duì)象就不在被棧引用了,可以被回收。

p1和personList均不再指向第一個(gè)Person對(duì)象的時(shí)候,第一個(gè)Person對(duì)象、list對(duì)象可以被回收。

經(jīng)歷前面的幾個(gè)階段,內(nèi)存引用是這樣的情況。

p1 = null后,p1曾經(jīng)指向的對(duì)象雖然不再被棧直接引用,但是仍然間接通過(guò)persons引用。

此時(shí)p1指向的對(duì)象和list指向的對(duì)象都可以被回收了。

怎么樣確定哪些需要回收?

對(duì)我們?nèi)匀恍枰褂玫膶?duì)象進(jìn)行標(biāo)記,回收沒(méi)有標(biāo)記的對(duì)象。

以此為例,如何進(jìn)行標(biāo)記的呢?

垃圾回收進(jìn)行之前,所有對(duì)象的標(biāo)記位是0

如果僅僅標(biāo)記棧直接引用的對(duì)象,p1就會(huì)被回收,但是p1間接被list引用,因此也被標(biāo)記為1

標(biāo)記算法

-Stop the World(GC Root可達(dá)性算法)

在進(jìn)行上面的標(biāo)記過(guò)程的時(shí)候,如果有新的對(duì)象被創(chuàng)建,而剛好被標(biāo)記過(guò)程錯(cuò)過(guò)的時(shí)候,就可能錯(cuò)誤地把有用的對(duì)象給回收掉,因?yàn)闃?biāo)記位是0.因此,Stop the World正如其名,將應(yīng)用的核心線程停掉,開(kāi)始專(zhuān)心標(biāo)記。

-引用計(jì)數(shù)法

對(duì)對(duì)象進(jìn)行引用數(shù)量的標(biāo)記,沒(méi)有引用的對(duì)象標(biāo)記是0,有引用的對(duì)象標(biāo)記是引用數(shù)量。清除標(biāo)記為0的對(duì)象即可。但是引用計(jì)數(shù)法有個(gè)問(wèn)題,無(wú)法解決循環(huán)引用的問(wèn)題,導(dǎo)致內(nèi)存泄露。

這里聲明一個(gè)對(duì)象,內(nèi)部包含一個(gè)跟自己一個(gè)類(lèi)型的成員變量。

在執(zhí)行第五行之前,兩個(gè)對(duì)象的引用計(jì)數(shù)均為2,各自引用,加上n1和n2.

執(zhí)行完第五六行以后,按道理,棧上已經(jīng)不在引用這兩個(gè)對(duì)象,可以被回收了,但是因?yàn)閚1和n2相互引用,導(dǎo)致引用計(jì)數(shù)為1,無(wú)法正?;厥铡?/p>

清除算法

一般清除算法:直接將未標(biāo)記的對(duì)象清理掉

經(jīng)過(guò)清理,未標(biāo)記的對(duì)象被回收。

但是存在內(nèi)存碎片化的問(wèn)題,只能從間隙處繼續(xù)分配內(nèi)存,

存在內(nèi)存不連續(xù)的問(wèn)題,內(nèi)存空間浪費(fèi)嚴(yán)重,容易o(hù)om

清除-整理算法:先清除沒(méi)有標(biāo)記的對(duì)象,然后將剩余的存活對(duì)象進(jìn)行整理,讓內(nèi)存空間更加連續(xù)。

就是代價(jià)比較高,幾乎需要移動(dòng)所有的對(duì)象。

復(fù)制-清除算法:將活躍的對(duì)象復(fù)制到另一個(gè)內(nèi)存區(qū)域,然后清除當(dāng)前區(qū)域的所有對(duì)象!

完成復(fù)制后,清除原有的區(qū)域

這種算法的弊端就是需要更多的內(nèi)存空間。

常見(jiàn)的GC類(lèi)型

GC類(lèi)別新生代垃圾回收老年代垃圾回收特點(diǎn)
Serial GC標(biāo)記-復(fù)制&清除

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

Stop the World

使用單個(gè)線程處理

適合小應(yīng)用

Parallel GCJava 8默認(rèn)垃圾回收器

Stop the World

使用多個(gè)線程處理

CMS GC標(biāo)記-復(fù)制&清除

(Stop the World)

接近并行的標(biāo)記-清除

初始標(biāo)記->并發(fā)標(biāo)記

-> 并發(fā)預(yù)清理->可中斷預(yù)清理->重新標(biāo)記->并發(fā)清除->并發(fā)重置

G1 GC

更細(xì)粒度的邏輯分區(qū),更小的停頓時(shí)間

采用復(fù)制&整理-清理的方式,優(yōu)先回收垃圾最多的區(qū)域

對(duì)字符串的合并整理,多個(gè)相同的字符串合并到一起,移除冗余字符串對(duì)象

-XX:UseStringDeduplication
Z GC

不在維護(hù)映射,而是對(duì)象上保持一個(gè)標(biāo)記來(lái)表示活躍對(duì)象

僅支持64位系統(tǒng)

采用重定位解決內(nèi)存碎片化問(wèn)題

Java 15

到此這篇關(guān)于JVM的內(nèi)存回收及常見(jiàn)算法的文章就介紹到這了,更多相關(guān)JVM的內(nèi)存回收內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java線程之Happens before規(guī)則案例詳解

    java線程之Happens before規(guī)則案例詳解

    這篇文章主要為大家介紹了java線程之Happens-before規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-08-08
  • JavaSE中Lambda表達(dá)式的使用與變量捕獲

    JavaSE中Lambda表達(dá)式的使用與變量捕獲

    這篇文章主要介紹了JavaSE中Lambda表達(dá)式的使用與變量捕獲,Lambda表達(dá)式允許你通過(guò)表達(dá)式來(lái)代替功能接口, 就和方法一樣,它提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體,下面我們來(lái)詳細(xì)看看,需要的朋友可以參考下
    2023-10-10
  • Maven jar包下載失敗問(wèn)題的處理方法

    Maven jar包下載失敗問(wèn)題的處理方法

    很多同學(xué)在Maven里下載一些依賴的時(shí)候,即下載jar包的時(shí)候總是會(huì)出現(xiàn)一些問(wèn)題,本文將就這個(gè)問(wèn)題給大家詳細(xì)的講解一下,需要的朋友可以參考下
    2023-06-06
  • SpringMVC中的@RequestMapping注解解析

    SpringMVC中的@RequestMapping注解解析

    這篇文章主要介紹了SpringMVC中的@RequestMapping注解解析,SpringMVC使用@RequestMapping注解為控制器指定可以處理哪些?URL?請(qǐng)求,在控制器的類(lèi)定義及方法定義處都可標(biāo)注@RequestMapping,需要的朋友可以參考下
    2023-12-12
  • Mybatis?入?yún)㈩?lèi)型方式全面詳解

    Mybatis?入?yún)㈩?lèi)型方式全面詳解

    這篇文章主要為大家介紹了Mybatis入?yún)⒌念?lèi)型方式全面示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Yml轉(zhuǎn)properties文件工具類(lèi)YmlUtils的詳細(xì)過(guò)程(不用引任何插件和依賴)

    Yml轉(zhuǎn)properties文件工具類(lèi)YmlUtils的詳細(xì)過(guò)程(不用引任何插件和依賴)

    這篇文章主要介紹了Yml轉(zhuǎn)properties文件工具類(lèi)YmlUtils(不用引任何插件和依賴),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 深入探究Spring IOC和DI的區(qū)別

    深入探究Spring IOC和DI的區(qū)別

    很多人都會(huì)把ioc和di說(shuō)成同一個(gè)東西,其實(shí)IOC和DI雖然在概念上可以籠統(tǒng)地視為同一事物,但其本質(zhì)上存在區(qū)別,因此,我們希望能夠更加嚴(yán)謹(jǐn)?shù)貐^(qū)分這兩個(gè)概念,以更好地理解和應(yīng)用它們,需要的朋友可以參考閱讀本文
    2023-10-10
  • SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決

    SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決

    本文主要介紹了SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • controller接口跳轉(zhuǎn)到另一個(gè)controller接口的實(shí)現(xiàn)

    controller接口跳轉(zhuǎn)到另一個(gè)controller接口的實(shí)現(xiàn)

    這篇文章主要介紹了controller接口跳轉(zhuǎn)到另一個(gè)controller接口的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • iReport使用指南及常見(jiàn)功能示例詳解

    iReport使用指南及常見(jiàn)功能示例詳解

    這篇文章主要介紹了iReport使用指南及常見(jiàn)功能,本文以iReport 3.5.1為例,通過(guò)示例演示給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10

最新評(píng)論