激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - JAVA垃圾收集器與內(nèi)存分配策略詳解

JAVA垃圾收集器與內(nèi)存分配策略詳解

2019-12-30 13:56jiangmitiao JAVA教程

這篇文章介紹了JAVA垃圾收集器與內(nèi)存分配策略,需要了解的朋友可以參考下

引言

垃圾收集技術(shù)并不是Java語言首創(chuàng)的,1960年誕生于MIT的Lisp是第一門真正使用內(nèi)存動態(tài)分配和垃圾收集技術(shù)的語言。垃圾收集技術(shù)需要考慮的三個問題是:

1、哪些內(nèi)存需要回收

2、什么時候回收

3、如何回收

java內(nèi)存運(yùn)行時區(qū)域的分布,其中程序計(jì)數(shù)器,虛擬機(jī)棧,本地方法區(qū)都是隨著線程而生,隨線程而滅,所以這幾個區(qū)域就不需要過多考慮回收問題。但是堆和方法區(qū)就不一樣了,只有在程序運(yùn)行期間我們才知道會創(chuàng)建哪些對象,這部分內(nèi)存的分配和回收都是動態(tài)的。垃圾收集器所關(guān)注的就是這部分內(nèi)存。

 

一 對象死亡判據(jù)

垃圾收集器在對一個對象回收之前,首先要判斷對象在程序中是否還有使用的可能性,充要條件就是沒有被程序可訪問引用再指向這個對象實(shí)例。最簡單的辦法就是給對象實(shí)例添加中添加一個引用計(jì)數(shù)器,每當(dāng)有一個引用指向它時,計(jì)數(shù)器就加一,當(dāng)引用失效時,計(jì)數(shù)器就減一,如果計(jì)數(shù)器值為0則說明沒有引用指向它,可以進(jìn)行回收。但是這個方法中計(jì)數(shù)器為0并不是一個必要條件,例如,生成兩個對象實(shí)例,每個對象實(shí)例的屬性都指向?qū)Ψ剑敲催@個兩個對象實(shí)例分別最少有一個引用。

JAVA垃圾收集器與內(nèi)存分配策略詳解

java采用的是可達(dá)性分析算法,即找一部分對象作為"GC Roots"節(jié)點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,當(dāng)某個對象到"GC Roots"節(jié)點(diǎn)沒有可達(dá)路徑時,說明此對象是不可用的。在java中作為"GC Roots"的節(jié)點(diǎn)包括:虛擬機(jī)棧中引用的對象,方法區(qū)靜態(tài)屬性引用的對象,方法區(qū)常量引用的對象,本地方法區(qū)中本地調(diào)用所引用的對象。

引用擴(kuò)充

如果reference類型的數(shù)據(jù)中存儲的數(shù)值是另一塊內(nèi)存的起始地址,那么這塊內(nèi)存就代表著一個引用。一個對象在這種狀態(tài)下,只能有被引用和沒有被引用兩種狀態(tài)。java對引用概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用(new),軟引用(softReference),弱引用(WeakReference),虛引用(PhantomReference)。如果強(qiáng)引用存在,則垃圾收集器不會回收該對象。如果系統(tǒng)即將發(fā)生內(nèi)存溢出異常,那么垃圾回收集器則會回收軟引用對象。弱引用對象只能存活到下一次垃圾收集之前。虛引用對象不會對其生存時間構(gòu)成任何影響。

對象的自我救贖

在垃圾收集器發(fā)現(xiàn)某一個對象到"GC Roots"路徑不可達(dá)時,先會判斷該對象是否覆蓋finalize()方法,或是否執(zhí)行過finalize()方法。如果覆蓋了且沒有執(zhí)行過該方法,則會將該對象放到低優(yōu)先級的Finalizer線程中去執(zhí)行finalize()方法,如果在finalize()方法中該對象又被引用,則會有一次逃脫被回收的命運(yùn)。

方法區(qū)的回收

方法區(qū)中主要回收廢棄的常量和無用的類。對于常量,如果沒有引用指向常量,則該常量會被回收。對于類的回收則麻煩許多,首先要判斷該類是無用的類,無用的類要滿足三個條件:1所有類的實(shí)例被回收2加載該類的ClassLoader已經(jīng)被回收3Class沒有被引用,不會通過反射訪問該類的方法。

 

二 垃圾回收算法

標(biāo)記-清除算法(Mark-Sweep)

JAVA垃圾收集器與內(nèi)存分配策略詳解

該算法分為兩個階段:首先標(biāo)記處要回收的對象,標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象。

存在的問題:1 標(biāo)記和清除效率都不高 2 標(biāo)記清除后會產(chǎn)生大量內(nèi)存碎片,分配大對象時可能觸發(fā)另一次垃圾收集。

復(fù)制算法(Copying)

JAVA垃圾收集器與內(nèi)存分配策略詳解

該算法將內(nèi)存分為兩個等大小的區(qū)域,每次只使用一個區(qū)域。當(dāng)一個區(qū)域快用完了,就將這個區(qū)域中存活的對象復(fù)制到另一個區(qū)域

優(yōu)點(diǎn)是避免了內(nèi)存碎片的產(chǎn)生,缺點(diǎn)是浪費(fèi)內(nèi)存空間。

JAVA垃圾收集器與內(nèi)存分配策略詳解

有公司研究表明,新生代的對象98%都是朝生暮死,所以虛擬機(jī)把新生代內(nèi)存劃分為一個較大的Eden空間和兩個較小的Survivor空間。每次只是用Eden空間和一個Survior空間,當(dāng)進(jìn)行復(fù)制清理時,將Survivor空間和Eden空間中存活的對象復(fù)制到另一塊Survivor空間。當(dāng)Survivor空間不夠用時,就會依賴?yán)夏甏M(jìn)行分配擔(dān)保。

標(biāo)記-整理算法(Mark-Compact)

JAVA垃圾收集器與內(nèi)存分配策略詳解

針對老年代對象存活率高的情況,復(fù)制算法明顯不合適,于是采用標(biāo)記整理算法,標(biāo)記和標(biāo)記清除算法相同,二后邊的整理則是讓所有存活的對象都向一端移動,然后清理掉邊界外的內(nèi)存。

分代收集

當(dāng)前虛擬機(jī)都采用分代收集,分代的依據(jù)是對象的存活周期。一般新生代存活率低,采用復(fù)制算法。老年代存活率高采用標(biāo)記整理或標(biāo)記清除。

 

三垃圾收集器

JAVA垃圾收集器與內(nèi)存分配策略詳解

由于虛擬機(jī)采用了分代收集,所以針對不同代收集器也不同。上圖是HotSpot虛擬機(jī)的垃圾收集器,連線表示可以協(xié)同工作。

Serial收集器,復(fù)制算法,它是一個單線程的收集器,并且在進(jìn)行收集時會暫停其他線程,它默認(rèn)是client模式下的新生代收集器。

ParNew收集器是Serial收集器的多線程版,它是第一款并發(fā)收集器。

Parallel Scavenge收集器可以精確控制吞吐量(用戶代碼運(yùn)行時間/(用戶代碼時間+垃圾收集時間))

 

SerialOld收集器是serial收集器的老年版,采用標(biāo)記整理算法,同樣是單線程收集器。

ParallelOld是ParallelScavenge收集器的老年版,使用多線程和標(biāo)記整理算法。

CMS收集器是以最短回收停頓時間為目標(biāo)的收集器,采用標(biāo)記清除算法,在重視響應(yīng)速度的系統(tǒng)中得以應(yīng)用。但是缺點(diǎn)是對CPU資源敏感,無法處理浮動垃圾,易產(chǎn)生內(nèi)存碎片。

 

G1收集器是最新推出的收集器,可應(yīng)用在JDK1.7u4及以上版本。它將內(nèi)存分為多個Region,新生代和老年代分別包含多個Region。G1跟蹤各個Region,判斷垃圾價值大小,優(yōu)先回收價值最大的Region。

 

四 內(nèi)存分配與回收策略

對象的分配,就是在堆上分配,對象主要分配在新生代的Eden區(qū)域中,如果啟動了本地線程分配緩沖,則按線程優(yōu)先在TLAB中分配。少數(shù)情況也有可能直接分配到老年代。

對象在Eden區(qū)域分配時,當(dāng)Eden區(qū)域沒有足夠空間,虛擬機(jī)會發(fā)起一次新生代垃圾收集。

如果對象需要大量連續(xù)內(nèi)存空間,例如String類型和數(shù)組。大對象對于虛擬機(jī)內(nèi)存分配來說是一個壞消息,朝生暮死的大對象是要命的壞消息。經(jīng)常出現(xiàn)大對象會導(dǎo)致多次出發(fā)垃圾收集。對于這類對象,可以設(shè)置參數(shù)將大對象直接存入老年代。

每一個對象都有一個年齡計(jì)數(shù)器,當(dāng)對象在Eden區(qū)域出生,每經(jīng)過一次GC,并且存入Survivor,計(jì)數(shù)器加一。當(dāng)年齡增加到一定程度(默認(rèn)15),則會被存入老年代。同時,如果Survivor空間中相同年齡對象占空間超過50%,則也會直接進(jìn)入老年代。

 

總結(jié)

垃圾收集算法:復(fù)制算法,標(biāo)記-清除算法,標(biāo)記-清理算法。

垃圾收集器特點(diǎn):新生代用復(fù)制,老年代用標(biāo)記清理,CMS用標(biāo)記清除。

Eden空間大小和Survivor空間大小默認(rèn)比率為8:1,即新生代10%的空間用來存放復(fù)制后的對象。

以上就是本文的全部內(nèi)容,希望大家能夠喜歡。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩高清影视 | 国产精品麻豆一区二区三区 | 他也色在线视频 | 国产精品一区2区3区 | 国产精品久久久久久久久岛 | 欧美一区二区三区中文字幕 | 精品国产一区二区三区四 | 日本免费靠逼视频 | 亚洲第一页综合 | 免费国产一级淫片 | 黄色网址在线播放 | 亚洲午夜免费电影 | 逼片| 亚州视频在线 | 中文字幕网在线 | 国产自在自线午夜精品视频在 | 国产精品久久久在线观看 | 欧美 国产 综合 | 国产亚洲精品综合一区91555 | 久久草在线视频国产 | 成人毛片免费网站 | 538任你躁在线精品视频网站 | 国产日产精品久久久久快鸭 | 久在线观看福利视频69 | 亚洲午夜在线视频 | 国产精品成人一区二区三区电影毛片 | 国产亚洲精品久久久久久大师 | 精品一区二区三区日本 | 久久国产精品久久久久久 | 91看片网页版 | 一级免费在线视频 | 黄色片快播 | 免费看性xxx高清视频自由 | 九九热视频这里只有精品 | 一本色道久久综合亚洲精品图片 | 99seav| 国产精品视频免费在线观看 | 精品一区二区久久久久久久网精 | 羞羞网站| 毛片免费视频网站 | 草草久久久 |