免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
java的垃圾回收機(jī)制

1.概述

java與c 相比,在內(nèi)存的分配與回收方面更加具備“自動(dòng)化”,似乎我們并不需要了解虛擬機(jī)GC與內(nèi)存分配。然而當(dāng)需要排查各種內(nèi)存溢出,內(nèi)存泄露的問題時(shí),當(dāng)垃圾收集成為系統(tǒng)優(yōu)化的瓶頸時(shí),我們必須了解JVM的“自動(dòng)化”技術(shù),以實(shí)現(xiàn)對其的監(jiān)控與調(diào)節(jié)。
在上一篇博文(java內(nèi)存區(qū)域)中介紹了java內(nèi)存運(yùn)行時(shí)區(qū)域的各個(gè)部分,其中虛擬機(jī)棧,程序計(jì)數(shù)器,本地方法棧是線程私有的,這幾個(gè)區(qū)域在編譯器其分配的內(nèi)存空間大小基本上是確定的。然而方法區(qū)和java堆則不一樣,隨著線程的進(jìn)行,方法的執(zhí)行以及對象的創(chuàng)建等,其內(nèi)存空間的大小是不斷變化的,所以垃圾回收的作用范圍主要是這些區(qū)域。
內(nèi)存的回收主要包括三個(gè)方面:

  • 確定哪些內(nèi)存需要回收
  • 確定什么時(shí)候回收
  • 如何回收

2.確定哪些內(nèi)存需要回收

我們可以肯定的是,我們需要回收的對象是那些不再使用的對象,在c 中我們通過析構(gòu)函數(shù)釋放對象占用的內(nèi)存空間。而在java中,這一步是虛擬機(jī)幫我們完成的。那么在回收對象的內(nèi)存空間之前,虛擬機(jī)需要判斷哪些對象是無用的。下面介紹兩種算法:

2.1 引用計(jì)數(shù)算法

給對象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器就加1;當(dāng)引用失效時(shí),計(jì)數(shù)器就減1。當(dāng)計(jì)數(shù)器的值為0時(shí)就認(rèn)為這個(gè)對象是無用的。

這種算法簡單易懂,判定效率也很高,不需要進(jìn)行復(fù)雜的計(jì)算,但是其很難解決對象之間相互引用的問題。比如下圖:

objA引用B,objB引用A,這時(shí)就算我們不在使用A和B了,但由于A和B之間相互引用導(dǎo)致引用計(jì)數(shù)器的值不為0,通過引用計(jì)數(shù)算法無法將其回收。正是由于這種算法的弊端,所以主流的java虛擬機(jī)都沒有選擇這種算法來管理內(nèi)存。

2.2 可達(dá)性分析算法

通過一系列的稱為“GC ROOT”的對象作為起始點(diǎn),從這些節(jié)點(diǎn)通過其指向其他對象的用用向下搜索,搜索走過的路徑稱為引用鏈,當(dāng)一個(gè)對象到“GC ROOT”之間沒有引用鏈就認(rèn)為其是不可用的。也就是從root開始不可達(dá)的節(jié)點(diǎn)對象為無用對象

圖中對象4,5,6不可達(dá)。

在java中可作為GC root的對象包括下面幾種:

  • 虛擬機(jī)棧(本地變量表),中引用的對象
  • 方法區(qū)中靜態(tài)類型引用的變量
  • 方法區(qū)中常量引用的變量
  • 本地方法棧中引用的對象

3.java的引用

在JDK1.2之后,java對引用的概念進(jìn)行了擴(kuò)充,將引用分為:強(qiáng)引用,軟引用,弱引用,虛引用。

  • 強(qiáng)引用。在代碼中·new·出的對象就存在強(qiáng)引用,垃圾收集器永遠(yuǎn)不會(huì)回收掉存在強(qiáng)引用的對象。
  • 軟引用。用來描述一些還有用但并非必需的對象。對于軟引用,當(dāng)系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對象列入回收范圍,當(dāng)軟引用的對象回收之后如果還不夠滿足內(nèi)存需求,才會(huì)拋出內(nèi)存溢出異常。java提供SoftReference類來實(shí)現(xiàn)軟引用。
  • 弱引用。用來描述非必需的對象。被軟引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前。也就是說在垃圾收集器回收的時(shí)候,軟引用的對象在垃圾收集器的回收范圍之內(nèi)。java提供WeakReference類來實(shí)現(xiàn)軟引用。
  • 虛引用。一個(gè)對象存在虛引用不會(huì)對其生存時(shí)間產(chǎn)生影響。為一個(gè)對象設(shè)置虛引用的目的在于能在這個(gè)對象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知。java提供PhantomReference實(shí)現(xiàn)虛引用。

4.什么時(shí)候回收


對象的回收至少要經(jīng)歷兩次標(biāo)記過程:如果對象在進(jìn)行可達(dá)性分析后,發(fā)生沒有與gc root相連的引用鏈,那它將會(huì)被標(biāo)記并進(jìn)行第一次篩選,篩選的條件是此對象是否有必要執(zhí)行finalize()方法。當(dāng)對象沒有覆蓋該方法或者已經(jīng)執(zhí)行過,虛擬機(jī)將這兩中情況記為“不需要執(zhí)行。要進(jìn)行finalize()的對象放入F-Queue隊(duì)列中,由一個(gè)finalize線程去執(zhí)行”。GC稍后將會(huì)對F-Queue中的對象進(jìn)行第二次小規(guī)模的標(biāo)記。除非對象在finalize()方法中拯救自己(創(chuàng)建了到gc root的引用鏈),否則它就真的會(huì)被回收。

5.垃圾收集算法

不同虛擬機(jī)的垃圾收集算法的實(shí)現(xiàn)各不相同,這里只介紹幾種算法的主要思想。

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

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

不足:

  • 標(biāo)記和清除的效率不高。
  • 標(biāo)記和清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存空間

5.2 復(fù)制算法


它將可用的內(nèi)存按容量劃分為大小相等的兩塊,每次只使用一塊,當(dāng)這一塊用完的時(shí)候,就將還存活的對象復(fù)制到另一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉

不足:將內(nèi)存空間縮小為了原來的一半。

5.3.標(biāo)記-整理算法

標(biāo)記過程與標(biāo)記-清除算法一樣,但后續(xù)的步驟不是直接對可回收對象進(jìn)行清理,而是讓所有存活的對象都想一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。

5.4分代收集算法


當(dāng)前商業(yè)虛擬機(jī)的垃圾收集都采用“分代收集”(Grenerational Collection)算法.其將java堆分成新生代和老年代。新生代中選用復(fù)制算法,老年代中使用“標(biāo)記-清除”或者“標(biāo)記-整理”算法。

  • 新生代:主要是用來存放新生的對象。一般占據(jù)堆的1/3空間。由于頻繁創(chuàng)建對象,所以新生代會(huì)頻繁觸發(fā)MinorGC進(jìn)行垃圾回收。
  • 老年代:主要存放應(yīng)用程序中生命周期長的內(nèi)存對象,或者占用空間比較大的對象。
來源:http://www.icode9.com/content-1-121351.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java對象自救
java常見面試題及答案 11
JVM垃圾回收機(jī)制之對象回收算法
伊圖教程網(wǎng)-JAVA堆的管理--垃圾回收
Java GC工作原理以及Minor GC、Major GC、Full GC簡單總結(jié)
Java虛擬機(jī)回憶錄
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服