成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

jvm垃圾回收算法

trilever / 723人閱讀

摘要:暫停整個(gè)應(yīng)用復(fù)制收集將堆內(nèi)存分成兩個(gè)相同空間,從根類似于前面的有向圖起始頂點(diǎn)開(kāi)始訪問(wèn)每一個(gè)關(guān)聯(lián)的可達(dá)對(duì)象,將空間的全部可達(dá)對(duì)象復(fù)制到空間,然后一次性回收空間。如果老年代空間也不夠或者達(dá)到觸發(fā)老年年垃圾回收條件的話則觸發(fā)一次。

[TOC]

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

一般來(lái)說(shuō),每個(gè)對(duì)象對(duì)應(yīng)一個(gè)計(jì)數(shù)器,創(chuàng)建對(duì)象時(shí),將其計(jì)數(shù)器置0

當(dāng)對(duì)象唄賦予任意變量時(shí),引用計(jì)數(shù)器每次加1.

引用變量出了作用域后,該引用變量所引用的對(duì)象的計(jì)數(shù)器減1.

一旦引用計(jì)數(shù)器為0,對(duì)象就滿足垃圾收集的條件

優(yōu)點(diǎn):基于引用計(jì)數(shù)器的垃圾收集器運(yùn)行較快,不會(huì)長(zhǎng)時(shí)間中斷程序執(zhí)行,適宜必須實(shí)時(shí)運(yùn)行的程序。

缺點(diǎn):引用計(jì)數(shù)器增加了程序執(zhí)行的開(kāi)銷,因?yàn)槊看螌?duì)象賦予給新的變量,計(jì)數(shù)器加1,而每次引用變量出了 作用域后,該引用的對(duì)象的計(jì)數(shù)器減1

還無(wú)法解決環(huán)形引用

Class A(){
    public B b = null;
}
Class B(){
    public A a = null;
}
public void test(){
    A a = new A();
    B b = new B();
    a.b=b;
    b.a = a
}
標(biāo)記-清除

mutator:除了垃圾收集器之外的部分,比如說(shuō)我們的應(yīng)用程序本身。職責(zé)(分配內(nèi)存),read(從內(nèi)存中讀取內(nèi)容),write(將內(nèi)容寫(xiě)入內(nèi)存)

collector:回收不再使用的內(nèi)存,供mutator 使用new分配內(nèi)存

mutator roots:一般指的是分配在堆內(nèi)存之外,可以直接被mutator直接訪問(wèn)到的對(duì)象

標(biāo)記階段:collector從mutator根對(duì)象開(kāi)始進(jìn)行遍歷,能被mutator roots訪問(wèn)到的對(duì)象都打上一個(gè)標(biāo)識(shí),記錄為可達(dá)對(duì)象

清除階段:collector對(duì)內(nèi)存從頭到尾進(jìn)行線性變量,如果某個(gè)對(duì)象沒(méi)有標(biāo)記為可達(dá)對(duì)象,就將其回收

從上圖我們可以看到,在Mark階段,從根對(duì)象1可以訪問(wèn)到B對(duì)象,從B對(duì)象又可以訪問(wèn)到E對(duì)象,所以B,E對(duì)象都是可達(dá)的。同理,F(xiàn),G,J,K也都是可達(dá)對(duì)象。到了Sweep階段,所有非可達(dá)對(duì)象都會(huì)被collector回收。同時(shí),Collector在進(jìn)行標(biāo)記和清除階段時(shí)會(huì)將整個(gè)應(yīng)用程序暫停(mutator),等待標(biāo)記清除結(jié)束后才會(huì)恢復(fù)應(yīng)用程序的運(yùn)行

缺點(diǎn):標(biāo)記-清除算法的比較大的缺點(diǎn)就是垃圾收集后有可能會(huì)造成大量的內(nèi)存碎片,像上面的圖片所示,垃圾收集后內(nèi)存中存在三個(gè)內(nèi)存碎片,假設(shè)一個(gè)方格代表1個(gè)單位的內(nèi)存,如果有一個(gè)對(duì)象需要占用3個(gè)內(nèi)存單位的話,那么就會(huì)導(dǎo)致Mutator一直處于暫停狀態(tài),而Collector一直在嘗試進(jìn)行垃圾收集,直到Out of Memory。暫停整個(gè)應(yīng)用

復(fù)制收集

將堆內(nèi)存分成兩個(gè)相同空間,從根(類似于前面的有向圖起始頂點(diǎn))開(kāi)始訪問(wèn)每一個(gè)關(guān)聯(lián)的可達(dá)對(duì)象,將空間A的全部可達(dá)對(duì)象復(fù)制到空間B,然后一次性回收空間A。對(duì)于該算法而言,因?yàn)橹恍柙L問(wèn)所有的可達(dá)對(duì)象,將所有的可達(dá)對(duì)象復(fù)制走之后就直接回收整個(gè)空間,完全不用理會(huì)不可達(dá)對(duì)象,所以遍歷空間的成本較小,但需要巨大的復(fù)制成本和較多的內(nèi)存。


缺點(diǎn):需要兩倍內(nèi)存空間。

優(yōu)點(diǎn):不會(huì)出現(xiàn)碎片

標(biāo)記-壓縮

此算法結(jié)合了“標(biāo)記-清除”和“復(fù)制”兩個(gè)算法的優(yōu)點(diǎn)。也是分兩階段,第一階段從根節(jié)點(diǎn)開(kāi)始標(biāo)記所有被引用對(duì)象,第二階段遍歷整個(gè)堆,把清除未標(biāo)記對(duì)象并且把存活對(duì)象“壓縮”到堆的其中一塊,按順序排放。此算法避免了“標(biāo)記-清除”的碎片問(wèn)題,同時(shí)也避免了“復(fù)制”算法的空間問(wèn)題。

優(yōu)點(diǎn):避免了“標(biāo)記-清除”的碎片問(wèn)題,同時(shí)也避免了“復(fù)制”算法的空間問(wèn)題。

缺點(diǎn):暫停整個(gè)應(yīng)用

增量收集

基礎(chǔ)仍是傳統(tǒng)的標(biāo)記-清除和復(fù)制算法。設(shè)計(jì)一個(gè)多進(jìn)程的運(yùn)行環(huán)境,比如用一個(gè)進(jìn)程執(zhí)行垃圾收集工作,另一個(gè)進(jìn)程執(zhí)行程序代碼。這樣一來(lái),垃圾收集工作看上去就仿佛是在后臺(tái)悄悄完成的,不會(huì)打斷程序代碼的運(yùn)行。

缺點(diǎn):垃圾收集器在第一階段中辛辛苦苦標(biāo)記出的結(jié)果很可能被另一個(gè)進(jìn)程中的內(nèi)存操作代碼修改得面目全非,以至于第二階段的工作沒(méi)有辦法開(kāi)展。---------解決辦法: 優(yōu)化算法

優(yōu)點(diǎn):垃圾收集工作看上去就仿佛是在后臺(tái)悄悄完成的,不會(huì)打斷程序代碼的運(yùn)行。

分代收集

新生代
新生代包括兩個(gè)區(qū):Eden區(qū)和Survivor區(qū),其中Survivor區(qū)一般也分成兩塊,簡(jiǎn)稱Survivor1 Space 和 Survivor2 Space (或者From Space 和 To Space)。新生代通常存活時(shí)間較短,因此基于標(biāo)記清除復(fù)制算法來(lái)進(jìn)行回收,掃描出存活的對(duì)象,并復(fù)制到一塊新的完全未使用的空間中,對(duì)應(yīng)于新生代,就是在Eden和From或To之間copy。新生代采用空閑指針的方式來(lái)控制GC觸發(fā),指針保持最后一個(gè)分配的對(duì)象在新生代區(qū)間的位置,當(dāng)有新的對(duì)象要分配內(nèi)存時(shí),用于檢查空間是否足夠,不夠就觸發(fā)GC。當(dāng)連續(xù)分配對(duì)象時(shí),對(duì)象會(huì)逐漸從eden到Survior,最后到舊生代。

回收機(jī)制:復(fù)制回收

老年代
在垃圾回收多次,如果對(duì)象仍然存活,并且新生代的空間不夠,則對(duì)象會(huì)存放在老年代。

在老年代采用的是 標(biāo)記清除壓縮算法。因?yàn)槔夏甏膶?duì)象一般存活時(shí)間比較長(zhǎng),每次標(biāo)記清除之后,會(huì)有很多的零碎空間,這個(gè)就是所謂的浮動(dòng)垃圾。當(dāng)老年代的零碎空間不足以分配一個(gè)大的對(duì)象的時(shí)候,就會(huì)采用壓縮算法。在壓縮的時(shí)候,應(yīng)用需要暫停。

回收機(jī)制:標(biāo)記-壓縮

持久代
這部分空間主要存放java方法區(qū)的數(shù)據(jù)以及啟動(dòng)類加載器加載的對(duì)象。這一部分對(duì)象通常不會(huì)被回收。所以持久代空間在默認(rèn)的情況下是不會(huì)被垃圾回收的。

回收機(jī)制:不會(huì)被回收

首先想eden區(qū)申請(qǐng)分配空間,如果空間夠,就直接進(jìn)行分配,否則進(jìn)行一次Minor GC。minor GC 首先會(huì)對(duì)Eden區(qū)的對(duì)象進(jìn)行標(biāo)記,標(biāo)記出來(lái)存活的對(duì)象。然后把存活的對(duì)象copy到From空間。如果From空間足夠,則回收eden區(qū)可回收的對(duì)象。如果from內(nèi)存空間不夠,則把From空間存活的對(duì)象復(fù)制到To區(qū),如果TO區(qū)的內(nèi)存空間也不夠的話,則把To區(qū)存活的對(duì)象復(fù)制到老年代。如果老年代空間也不夠(或者達(dá)到觸發(fā)老年年垃圾回收條件的話)則觸發(fā)一次full GC。
Minor GC
一般情況下,當(dāng)新對(duì)象生成,并且在Eden申請(qǐng)空間失敗時(shí),就好觸發(fā)Minor GC,堆Eden區(qū)域進(jìn)行GC,清除非存活對(duì)象,并且把尚且存活的對(duì)象移動(dòng)到Survivor區(qū)。然后整理Survivor的兩個(gè)區(qū)。
Full GC
對(duì)整個(gè)堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC。有如下原因可能導(dǎo)致Full GC

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64901.html

相關(guān)文章

  • 垃圾回收算法JVM 垃圾回收器綜述

    摘要:垃圾回收算法與垃圾回收器綜述我們常說(shuō)的垃圾回收算法可以分為兩部分對(duì)象的查找算法與真正的回收方法。串行垃圾回收器一次只使用一個(gè)線程進(jìn)行垃圾回收并行垃圾回收器一次將開(kāi)啟多個(gè)線程同時(shí)進(jìn)行垃圾回收。 垃圾回收算法與 JVM 垃圾回收器綜述歸納于筆者的 JVM 內(nèi)部原理與性能調(diào)優(yōu)系列文章,文中涉及的引用資料參考 Java 學(xué)習(xí)與實(shí)踐資料索引、JVM 資料索引。 showImg(https://s...

    imingyu 評(píng)論0 收藏0
  • Java 垃圾回收(GC) 泛讀

    摘要:在這種消耗很高的狀態(tài)下,應(yīng)用程序所有的線程都會(huì)掛起,暫停一切正常的工作,等待垃圾回收的完成。但是,因?yàn)榫€程切換和上下文轉(zhuǎn)換的消耗,會(huì)使得垃圾回收的總體成本上升,造成系統(tǒng)吞吐量的下降。 Java 垃圾回收(GC) 泛讀 文章地址: https://segmentfault.com/a/1190000008922319 0. 序言 帶著問(wèn)題去看待 垃圾回收(GC) 會(huì)比較好,一般來(lái)說(shuō)主要的...

    haoguo 評(píng)論0 收藏0
  • 必知必會(huì)JVM垃圾回收——對(duì)象搜索算法回收算法

    垃圾回收(GC)是JVM的一大殺器,它使程序員可以更高效地專注于程序的開(kāi)發(fā)設(shè)計(jì),而不用過(guò)多地考慮對(duì)象的創(chuàng)建銷毀等操作。但是這并不是說(shuō)程序員不需要了解GC。GC只是Java編程中一項(xiàng)自動(dòng)化工具,任何一個(gè)工具都有它適用的范圍,當(dāng)超出它的范圍的時(shí)候,可能它將不是那么自動(dòng),而是需要人工去了解與適應(yīng)地適用。 擁有一定工作年限的程序員,在工作期間肯定會(huì)經(jīng)常碰到像內(nèi)存溢出、內(nèi)存泄露、高并發(fā)的場(chǎng)景。這時(shí)候在應(yīng)對(duì)這...

    LuDongWei 評(píng)論0 收藏0
  • JVM垃圾回收

    摘要:語(yǔ)言使用了內(nèi)存動(dòng)態(tài)分配和垃圾回收技術(shù),掌握這些不僅可以提高自己的逼格,而且為后續(xù)的調(diào)優(yōu)打下扎實(shí)的基礎(chǔ),讓自己離架構(gòu)師更近一步。任何引用計(jì)數(shù)器為的對(duì)象實(shí)例可以被當(dāng)作垃圾收集。引用計(jì)數(shù)是垃圾收集器中的早期策略。 JVM之垃圾回收 市面上有關(guān)JVM垃圾回收的文章很多,有些是針對(duì)垃圾收集器,有些是介紹垃圾回收算法,也有些各方面都有涉及。本文希望能做一個(gè)比較全面的總結(jié),最關(guān)鍵的是形成自己的語(yǔ)言,...

    BWrong 評(píng)論0 收藏0
  • 一文了解JVM

    摘要:而使用虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。每個(gè)字節(jié)碼指令都由一個(gè)字節(jié)的操作碼和附加的操作數(shù)組成。字節(jié)碼可以通過(guò)以下兩種方式轉(zhuǎn)換成合適的語(yǔ)言解釋器一條一條地讀取,解釋并執(zhí)行字節(jié)碼執(zhí)行,所以它可以很快地解釋字節(jié)碼,但是執(zhí)行起來(lái)會(huì)比較慢。 一、什么是JVM JVM是Java Virtual Machine(Java 虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)...

    whatsns 評(píng)論0 收藏0
  • 談一談JVM垃圾回收

    摘要:這個(gè)算法看似不錯(cuò)而且簡(jiǎn)單,不過(guò)存在這一個(gè)致命傷當(dāng)兩個(gè)對(duì)象互相引用的時(shí)候,就永遠(yuǎn)不會(huì)被回收于是引用計(jì)數(shù)算法就永遠(yuǎn)回收不了這兩個(gè)對(duì)象,下面介紹另一種算法。 前言 ? 如果要問(wèn)Java與其他編程語(yǔ)言最大的不同是什么,我第一個(gè)想到的一定就是Java所運(yùn)行的JVM所自帶的自動(dòng)垃圾回收機(jī)制,以下是我學(xué)習(xí)JVM垃圾回收機(jī)制整理的筆記,希望能對(duì)讀者有一些幫助。 哪些內(nèi)存需要回收?what? ? ...

    stormzhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<