在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      Java垃圾回收新算法

      作者: 時(shí)間:2011-05-20 來源:網(wǎng)絡(luò) 收藏
      3 傳統(tǒng)收集器簡介

      本文引用地址:http://www.biyoush.com/article/150730.htm

        依托于收集GC機(jī)制,可以自動(dòng)即釋放堆空間,讓其他對象可以使用此部分空間。而采用了某種 GC 的收集器(Collector)稱之為某某收集器(Garbage Collector)。目前 中采用的垃圾收集器一般包括:引用計(jì)數(shù)法(Reference Counting Collector)、 Tracing(Tracing Collector)、Compacting(Compacting Collector)、Coping算法(Coping Collector)、Generation算法(Generational Collector)、Adaptive算法(Adaptive Collector)。

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

        引用計(jì)數(shù)法是唯一沒有使用根集的垃圾的方法,該算法使用引用計(jì)數(shù)器來區(qū)分存活對象和不再使用的對象。一般來說,堆中的每個(gè)對象對應(yīng)一個(gè)引用計(jì)數(shù)器。當(dāng)每一次創(chuàng)建一個(gè)對象并賦給一個(gè)變量時(shí),引用計(jì)數(shù)器置為1。當(dāng)對象被賦給任意變量時(shí),引用計(jì)數(shù)器每次加1,當(dāng)對象出了作用域后(該對象丟棄不再使用),引用計(jì)數(shù)器減1,一旦引用計(jì)數(shù)器為0,對象就滿足了垃圾收集的條件。

        基于引用計(jì)數(shù)器的垃圾收集器運(yùn)行較快,不會(huì)長時(shí)間中斷程序執(zhí)行,必須適宜地實(shí)時(shí)運(yùn)行的程序。但引用計(jì)數(shù)器增加了程序執(zhí)行的開銷,因?yàn)槊看螌ο筚x給新的變量,計(jì)數(shù)器加1,而每次現(xiàn)有對象出了作用域,計(jì)數(shù)器減1。

        3.2 Tracing算法

        Tracing算法是為了解決引用計(jì)數(shù)法的問題而提出,它使用了根集的概念?;赥racing算法的垃圾收集器從根集開始掃描,識別出哪些對象可達(dá),哪些對象不可達(dá),并用某種方式標(biāo)記可達(dá)對象,例如對每個(gè)可達(dá)對象設(shè)置一個(gè)或多個(gè)位。在掃描識別過程中,基于Tracing算法的垃圾收集也稱為標(biāo)記和清除(mark-and-sweep)垃圾收集器。

        3.3 Compacting算法

        為了解決堆碎片問題,基于tracing的垃圾吸收了Compacting算法的思想,在清除的過程中,算法將所有對象移到堆的一端,堆的另一端就變成了一個(gè)相鄰的空閑內(nèi)存區(qū),收集器會(huì)對它移動(dòng)的所有對象的所有引用進(jìn)行更新,使得這些引用在新的位置能識別原來 的對象。在基于Compacting算法的收集器的實(shí)現(xiàn)中,一般增加句柄和句柄表。

        3.4 Coping算法

        Coping算法的提出是為了克服句柄的開銷和解決堆碎片的垃圾回收。它開始時(shí)把堆分成一個(gè)對象面和多個(gè)空閑面, 程序從對象面為對象分配空間,當(dāng)對象滿了,基于Coping算法的垃圾收集就從根集中掃描活動(dòng)對象,并將每個(gè)活動(dòng)對象復(fù)制到空閑面(使得活動(dòng)對象所占的內(nèi)存之間沒有空閑洞),這樣空閑面變成了對象面,原來的對象面變成了空閑面,程序會(huì)在新的對象面中分配內(nèi)存。

        一種典型的基于Coping算法的垃圾回收是stop-and-copy算法,它將堆分成對象面和空閑區(qū)域面,在對象面與空閑區(qū)域面的切換過程中,程序暫停執(zhí)行。

        3.5 Generation算法

        stop-and-copy垃圾收集器的一個(gè)缺陷是收集器必須復(fù)制所有的活動(dòng)對象,這增加了程序等待時(shí)間,這是Coping算法低效的原因。在程序設(shè)計(jì)中有這樣的規(guī)律:多數(shù)對象存在的時(shí)間比較短,少數(shù)的存在時(shí)間比較長。因此,Generation算法將堆分成兩個(gè)或多個(gè),每個(gè)子堆作為對象的一代(Generation)。由于多數(shù)對象存在的時(shí)間比較短,隨著程序丟棄不使用的對象,垃圾收集器將從最年輕的子堆中收集這些對象。在分代式的垃圾收集器運(yùn)行后,上次運(yùn)行存活下來的對象移到下一最高代的子堆中,由于老一代的子堆不會(huì)經(jīng)常被回收,因而節(jié)省了時(shí)間。

        3.6 Adaptive算法

        在特定的情況下,一些垃圾收集算法會(huì)優(yōu)于其他算法?;贏daptive算法的垃圾收集器就是監(jiān)控當(dāng)前堆的使用情況,并將選擇適當(dāng)算法的垃圾收集器。

        4 GC新算法概述

        基于上述對幾種收集器算法優(yōu)缺點(diǎn)的對比分析,提出一種既可以滿足程序?qū)?shí)時(shí)性的要求,同時(shí)也能避免內(nèi)存泄漏的較完全的垃圾處理算法。

        4.1算法描述

        4.1.1內(nèi)存劃分

        (1)把一個(gè)堆內(nèi)存劃分成兩大塊,一塊是活躍區(qū),占堆大小的2/3,活躍區(qū)劃分成大小相同的8個(gè)塊,并且為每個(gè)塊設(shè)置一個(gè)計(jì)數(shù)器int cnt[x](x取1~8),用來記錄每塊內(nèi)存中動(dòng)態(tài)分配的被引用對象總數(shù)。另一塊是保留區(qū),占堆大小的1/3,設(shè)置兩個(gè)常數(shù)min和max,分別用來表示保留區(qū)的初始大小和最大可增加到的大小。(min的值小于堆大小的1/3,max的值可以自行設(shè)置但最大值不超過堆大小的1/3)。

        (2)為堆中的每個(gè)對象設(shè)置一個(gè)標(biāo)記位(標(biāo)記位放在一個(gè)專用數(shù)組cnt[x](x取1~8)中)以表示其是否被引用,在對象被引用時(shí)計(jì)數(shù)器就開始動(dòng)態(tài)地統(tǒng)計(jì)計(jì)數(shù),記錄本塊中被引用的對象個(gè)數(shù)。

        (3)通過比較計(jì)數(shù)器值的大小來判斷應(yīng)該掃描哪個(gè)塊,而不是利用搜索所有對象的方法。具體結(jié)構(gòu)如圖1。

        



      關(guān)鍵詞: 算法 回收 垃圾 Java

      評論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉