成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java的GC機(jī)制

ruicbAndroid / 2831人閱讀

摘要:分代收集主要針對這兩類的對象進(jìn)行回收。伊甸園空間執(zhí)行后,將和活著的對象一次性復(fù)制到另一個(gè)名為的中去,然后清理和執(zhí)行多次后,依然存活的對象會被轉(zhuǎn)移至老年代。在年輕代存活對象占用的內(nèi)存超過時(shí),則多余的對象會放入年老代。

jvm 中,程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧都是隨線程而生隨線程而滅,棧幀隨著方法的進(jìn)入和退出做入棧和出棧操作,實(shí)現(xiàn)了自動的內(nèi)存清理,因此,我們的內(nèi)存垃圾回收主要集中于 堆和方法區(qū)中,在程序運(yùn)行期間,這部分內(nèi)存的分配和使用都是動態(tài)的。

GC算法: 對象存活判斷

引用計(jì)數(shù)法:每個(gè)對象有一個(gè)引用計(jì)數(shù)屬性,新增一個(gè)引用時(shí)計(jì)數(shù)加1,引用釋放時(shí)計(jì)數(shù)減1,計(jì)數(shù)為0時(shí)可以回收。
缺點(diǎn)是無法釋放循環(huán)引用的對象。如下圖:

根搜索算法:從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個(gè)對象到GC Roots沒有任何引用鏈相連時(shí),則證明此對象是不可用的。
在Java語言中,GC Roots包括:
虛擬機(jī)棧中引用的對象。
方法區(qū)中類靜態(tài)屬性實(shí)體引用的對象。
方法區(qū)中常量(final)引用的對象。
本地方法棧中JNI引用的對象。


可以看到,該算法可以釋放循環(huán)引用的對象(D和E)。

垃圾收集算法

標(biāo)記/清除算法:當(dāng)堆中的有效內(nèi)存空間(available memory)被耗盡的時(shí)候,就會停止整個(gè)程序(也被成為stop the world),然后進(jìn)行兩項(xiàng)工作,第一項(xiàng)則是標(biāo)記,第二項(xiàng)則是清除。

(1)標(biāo)記:標(biāo)記的過程其實(shí)就是,遍歷所有的GC Roots,然后將所有GC Roots可達(dá)的對象標(biāo)記為存活的對象。
(2)清除:清除的過程將遍歷堆中所有的對象,將沒有標(biāo)記的對象全部清除掉。

缺點(diǎn):1、首先,它的缺點(diǎn)就是效率比較低(遞歸與全堆對象遍歷),而且在進(jìn)行GC的時(shí)候,需要停止應(yīng)用程序,這會導(dǎo)致用戶體驗(yàn)非常差勁
2、第二點(diǎn)主要的缺點(diǎn),則是這種方式清理出來的空閑內(nèi)存是不連續(xù)的(碎片化),JVM就不得不維持一個(gè)內(nèi)存的空閑列表,這又是一種開銷。而且在分配數(shù)組對象的時(shí)候,尋找連續(xù)的內(nèi)存空間會不太好找。

復(fù)制(copying)算法:將內(nèi)存劃分為兩個(gè)區(qū)間,所有動態(tài)分配的對象都只能分配在其中一個(gè)區(qū)間(稱為活動區(qū)間),而另外一個(gè)區(qū)間(稱為空閑區(qū)間)則是空閑的,當(dāng)有效內(nèi)存空間耗盡時(shí),JVM將暫停程序運(yùn)行,開啟復(fù)制算法GC線程。將活動區(qū)間內(nèi)的存活對象,全部復(fù)制到空閑區(qū)間,且嚴(yán)格按照內(nèi)存地址依次排列,與此同時(shí),GC線程將更新存活對象的內(nèi)存引用地址指向新的內(nèi)存地址。此時(shí),空閑區(qū)間已經(jīng)與活動區(qū)間交換,而垃圾對象現(xiàn)在已經(jīng)全部留在了原來的活動區(qū)間。事實(shí)上,在活動區(qū)間轉(zhuǎn)換為空間區(qū)間的同時(shí),垃圾對象已經(jīng)被一次性全部回收。

缺點(diǎn):1、它浪費(fèi)了一半的內(nèi)存。
2、如果對象的存活率很高,我們可以極端一點(diǎn),假設(shè)是100%存活,那么我們需要將所有對象都復(fù)制一遍,并將所有引用地址重置一遍。復(fù)制這一工作所花費(fèi)的時(shí)間,在對象存活率達(dá)到一定程度時(shí),將會變的不可忽視。

標(biāo)記/整理算法:標(biāo)記/整理算法與標(biāo)記/清除算法非常相似,它也是分為兩個(gè)階段:標(biāo)記和整理。

(1)標(biāo)記:它的第一個(gè)階段與標(biāo)記/清除算法是一模一樣的,均是遍歷GC Roots,然后將存活的對象標(biāo)記。

(2)整理:移動所有存活的對象,且按照內(nèi)存地址次序依次排列,然后將末端內(nèi)存地址以后的內(nèi)存全部回收。因此,第二階段才稱為整理階段。
優(yōu)點(diǎn):標(biāo)記/整理算法不僅可以彌補(bǔ)標(biāo)記/清除算法當(dāng)中,內(nèi)存區(qū)域分散的缺點(diǎn),也消除了復(fù)制算法當(dāng)中,內(nèi)存減半的高額代價(jià)。
缺點(diǎn):效率也不高,不僅要標(biāo)記所有存活對象,還要整理所有存活對象的引用地址。從效率上來說,標(biāo)記/整理算法要低于復(fù)制算法。

總結(jié):1、三個(gè)算法都基于根搜索算法去判斷一個(gè)對象是否應(yīng)該被回收,而支撐根搜索算法可以正常工作的理論依據(jù),就是語法中變量作用域的相關(guān)內(nèi)容。因此,要想防止內(nèi)存泄露,最根本的辦法就是掌握好變量作用域,
2、在GC線程開啟時(shí),或者說GC過程開始時(shí),它們都要暫停應(yīng)用程序(stop the world)。
3、性能比較
效率:復(fù)制算法>標(biāo)記/整理算法>標(biāo)記/清除算法(此處的效率只是簡單的對比時(shí)間復(fù)雜度,實(shí)際情況不一定如此)。
內(nèi)存整齊度:復(fù)制算法=標(biāo)記/整理算法>標(biāo)記/清除算法。
內(nèi)存利用率:標(biāo)記/整理算法=標(biāo)記/清除算法>復(fù)制算法。

分代收集算法

GC分代的基本假設(shè):絕大部分對象的生命周期都非常短暫,存活時(shí)間短。
GC將對象數(shù)據(jù)進(jìn)行分類。主要是兩類:年輕代(Young Generation),老年代(Old Generation)。分代收集主要針對這兩類的對象進(jìn)行回收。

年輕代(Young Generation):年輕代含兩種結(jié)構(gòu),伊甸園空間(1個(gè),占80%)和幸存空間(2個(gè),各占10%)。大多數(shù)對象會很快的變得不可達(dá),因此,很多對象會在變成年輕代之后就消失,而這個(gè)過程我們稱之為“ minor GC”。由于存活率低,選用復(fù)制算法,一旦發(fā)生GC,將10%的幸存區(qū)間與另外80%伊甸園空間中存活的對象轉(zhuǎn)移到10%的幸存空間,接下來,將之前90%的內(nèi)存全部釋放。

年輕代遵循以下規(guī)則:
通常剛剛被創(chuàng)建的對象會存放在伊甸園空間。
伊甸園空間執(zhí)行GC后,將Eden和From活著的對象一次性復(fù)制到另一個(gè)名為To的Survivor中去,然后清理Eden和From

執(zhí)行GC多次后,依然存活的對象會被轉(zhuǎn)移至老年代。

老年代(old Generation):對象來自新生代,如上所說部分對象會不可達(dá),而剩下的從年輕代中存活下來,被拷貝至老年代。老年代所占用的空間要比年輕代多。如上,對象在老年代也會消失,而這個(gè)過程被稱之為“major GC”(或者是 “full GC”).老年代中因?yàn)閷ο蟠婊盥矢?、沒有額外空間對它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清除”或“標(biāo)記-整理”算法來進(jìn)行回收。

Permanebt Generation :持久代,或者稱為方法區(qū)(method area),通常持久代用來保存類常量以及字符串常量。而特別需要注意這個(gè)持久代區(qū)域不是用來保存從老年代存活下來的對象的。持久代也可以發(fā)生GC。同時(shí)這個(gè)區(qū)域的GC會被看待為 major GC.(使用“標(biāo)記-清除”或“標(biāo)記-整理”算法)
永久代主要回收兩種:常量池中的常量,無用的類信息。
要知道常量的回收是相對簡單的,主要是無用的類回收比較麻煩,要注意以下幾點(diǎn):
類的實(shí)例已經(jīng)全部被回收了
ClassLoader已經(jīng)被回收
類的對象沒有被引用

通常情況下,以下兩種情況發(fā)生的時(shí)候,對象會從新生代區(qū)域轉(zhuǎn)到年老帶區(qū)域。
1、在年輕代里的每一個(gè)對象,都會有一個(gè)年齡,當(dāng)這些對象的年齡到達(dá)一定程度時(shí)(年齡就是熬過的GC次數(shù),每次GC如果對象存活下來,則年齡加1),則會被轉(zhuǎn)到年老代,而這個(gè)轉(zhuǎn)入年老代的年齡值,一般在JVM中是可以設(shè)置的。

2、在年輕代存活對象占用的內(nèi)存超過10%時(shí),則多余的對象會放入年老代。這種時(shí)候,年老代就是新生代的“備用倉庫”。

參考文章:
https://www.cnblogs.com/sunfi...
http://www.cnblogs.com/ityouk...
http://blog.csdn.net/u0116690...

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68546.html

相關(guān)文章

  • 細(xì)述 Java垃圾回收機(jī)制→How Java Garbage Collection Works?

    摘要:當(dāng)一個(gè)實(shí)例被創(chuàng)建的時(shí)候,它最初被存放在堆內(nèi)存空間的年輕代的區(qū)中。老年代或者永久代是堆內(nèi)存的第二個(gè)邏輯部分。在垃圾回收過程中掃描屬于部分的堆內(nèi)存。一旦實(shí)例從堆內(nèi)存中刪除了,它們原來的位置將空出來給以后分配實(shí)例使用。 本文非原創(chuàng),翻譯自How Java Garbage Collection Works?在Java中為對象分配和釋放內(nèi)存空間都是由垃圾回收線程自動執(zhí)行完成的。和C語言不一樣的是...

    cc17 評論0 收藏0
  • Java性能優(yōu)化之垃圾回收機(jī)制

    摘要:年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對象。年老代在年輕代中經(jīng)歷了次垃圾回收后仍然存活的對象,就會被放到年老代中。什么情況下觸發(fā)垃圾回收由于對象進(jìn)行了分代處理,因此垃圾回收區(qū)域時(shí)間也不一樣。 [TOC] 與C/C++相比,java語言不需要程序員直接控制內(nèi)存回收,java程序的內(nèi)存分配和回收都是由JRE在后臺自動進(jìn)行,JRE會負(fù)責(zé)回收那些不再使用的內(nèi)存,這種機(jī)制被稱為垃圾...

    philadelphia 評論0 收藏0
  • 樂字節(jié)Java|GC垃圾回收機(jī)制、package和import語句

    摘要:本文接上一篇樂字節(jié)關(guān)鍵字關(guān)鍵字塊。本文是接著講述垃圾回收機(jī)制和語句。一垃圾回收機(jī)制全名垃圾回收機(jī)制程序員無權(quán)調(diào)用垃圾回收器。通知運(yùn)行,但是規(guī)范并不能保證立刻運(yùn)行。若缺省該語句,則指定為無名包。 本文接上一篇:樂字節(jié)Java|this關(guān)鍵字、static關(guān)鍵字、block塊。本文是接著講述JavaGC垃圾回收機(jī)制、package 和 import語句。showImg(https://se...

    xuexiangjys 評論0 收藏0
  • 金三銀四面試季節(jié)之Java 核心面試技術(shù)點(diǎn) - JVM 小結(jié)

    摘要:直接對棧的操作只有兩個(gè),就是對棧幀的壓棧和出棧。中將永久代移除,同時(shí)增加元數(shù)據(jù)區(qū)。在中,本地方法棧和虛擬機(jī)棧是在同一塊兒區(qū)域,這完全取決于技術(shù)實(shí)現(xiàn)的決定,并未在規(guī)范中強(qiáng)制。 原文:https://github.com/linsheng97... 描述一下 JVM 的內(nèi)存區(qū)域 程序計(jì)數(shù)?(PC,Program Counter Register)。在 JVM 規(guī)范中,每個(gè)線程都有它自己的...

    XGBCCC 評論0 收藏0
  • Java虛擬機(jī):Java自動內(nèi)存管理和回收機(jī)制

    摘要:所以我們提到的內(nèi)存回收大都是指堆內(nèi)存的回收。根據(jù)堆內(nèi)存對對象的代的劃分我們對堆內(nèi)存有這樣劃分各版本和種類的垃圾回收器各有其用武之地,配合使用它們得到最好的效果十分重要。 這篇文章的素材來自周志明的《深入理解Java虛擬機(jī)》。作為Java開發(fā)人員,一定程度了解JVM虛擬機(jī)的的運(yùn)作方式非常重要,本文就一些簡單的虛擬機(jī)的相關(guān)概念和運(yùn)作機(jī)制展開我自己的學(xué)習(xí)過程。 虛擬機(jī)內(nèi)存分區(qū) java虛擬機(jī)...

    xuxueli 評論0 收藏0
  • 譯文-java垃圾回收機(jī)制

    摘要:原文出處垃圾回收機(jī)制標(biāo)記清除算法介紹最主要的理論算法之一,在實(shí)踐過程中,為了真實(shí)情景需要,需要許多調(diào)整。因此不會僅僅標(biāo)記清除,垃圾回收期間,內(nèi)存整理進(jìn)程同時(shí)在工作。不同內(nèi)存區(qū)域的垃圾收集機(jī)制不辣么容易理解。 原文出處:java垃圾回收機(jī)制 標(biāo)記清除算法介紹最主要的理論算法之一,在實(shí)踐過程中,為了真實(shí)情景需要,需要許多調(diào)整。舉一個(gè)簡單例子,我們檢查JVM需要做的各種事情,以便我們安全地去...

    Warren 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<