<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Java垃圾回收新算法

Java垃圾回收新算法

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

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

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

  3.1 引用計數法

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

  基于引用計數器的垃圾收集器運行較快,不會(huì )長(cháng)時(shí)間中斷程序執行,必須適宜地實(shí)時(shí)運行的程序。但引用計數器增加了程序執行的開(kāi)銷(xiāo),因為每次對象賦給新的變量,計數器加1,而每次現有對象出了作用域,計數器減1。

  3.2 Tracing算法

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

  3.3 Compacting算法

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

  3.4 Coping算法

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

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

  3.5 Generation算法

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

  3.6 Adaptive算法

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

  4 GC新算法概述

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

  4.1算法描述

  4.1.1內存劃分

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

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

  (3)通過(guò)比較計數器值的大小來(lái)判斷應該掃描哪個(gè)塊,而不是利用搜索所有對象的方法。具體結構如圖1。

  



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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>