《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > Java垃圾回收新算法
Java垃圾回收新算法
摘要: Java從誕生以來以其在網(wǎng)絡(luò)應(yīng)用開發(fā)上獨特的魅力以及“一次開發(fā),隨處運行”的可移植性引起了人們極大的興趣。Java與以往的高級語言如C/C++相比,在開發(fā)方面具有很大的優(yōu)勢,其中以對象內(nèi)存管理機制中的垃圾
關(guān)鍵詞: 算法 回收 垃圾 JAVA
Abstract:
Key words :

Java從誕生以來以其在網(wǎng)絡(luò)應(yīng)用開發(fā)上獨特的魅力以及“一次開發(fā),隨處運行”的可移植性引起了人們極大的興趣。Java與以往的高級語言如C/C++相比,在開發(fā)方面具有很大的優(yōu)勢,其中以對象內(nèi)存管理機制中的垃圾處理機制(GC)最為突出。

  1 C/C++與Java對象內(nèi)存管理差別

  C/C++將內(nèi)存劃分成四部分:數(shù)據(jù)區(qū)、代碼區(qū)、棧區(qū)、堆區(qū)。Java則把內(nèi)存劃分成三部分即代碼區(qū)、棧區(qū)、堆區(qū),代碼區(qū)主要用于存放程序的代碼,棧區(qū)主要用于存放局部變量、內(nèi)部變量等中間性變量,堆區(qū)主要用來存放對象。

  C/C++中的對象內(nèi)存管理是通過語句new()/delete()或malloc()/free()進行申請和釋放的。用new()或malloc()申請內(nèi)存后,若不使用delete()或free()進行釋放,則所申請的內(nèi)存一直被占用,即使不使用也不能自動釋放,必須人為釋放,導(dǎo)致編程工作很繁瑣。

  Java中的對象內(nèi)存管理則改進了對內(nèi)存的釋放過程,使用new()或其他方法申請的內(nèi)存在不使用時,可以自動進行垃圾處理,釋放內(nèi)存,從而節(jié)省內(nèi)存,使內(nèi)存的使用更加高效、合理。

  Java中可以通過三種方法來銷毀對象實現(xiàn)內(nèi)存釋放,這三種方法被稱為Java銷毀對象的三把利劍:垃圾回收器;finalize方法;利用System.gc方法強制啟動垃圾回收器。

  垃圾回收是一種動態(tài)存儲管理技術(shù),它自動地釋放不再被程序引用的對象,按照特定的垃圾收集算法實現(xiàn)資源自動回收的功能系統(tǒng),會自動進行GC策略。

  2 GC概述

  Java垃圾處理主要是針對堆的管理,對堆中不使用的空間進行回收處理。判斷一個對象的內(nèi)存空間是否無用的標準是:如果該對象不能再被程序中任何一個“活動的部分”所引用,此時該對象的內(nèi)存空間已經(jīng)無用。所謂“活動的部分”,是指程序中某部分參與程序的調(diào)用,正在執(zhí)行過程中,尚未執(zhí)行完畢。

  具體以下兩例予以說明:

  實例1:

  int [][]matrix=new int [2][3];

  matrix=null;

  此例中,第一句是用new語句在堆中為數(shù)組申請了一個空間,然后用matrix來引用此空間的對象(這里數(shù)組可以理解為對象),此時這個內(nèi)存空間就是有用的。第二句是給matrix賦空值,matrix則不再引用此數(shù)組。此時,這個空間就是無用的。

  實例2:

  int [][] m1=new int[2][3];

  int [][] m2=new int[2][3];

  m1=m2;

  此例中,第一句是用new語句在堆中為數(shù)組申請了一個空間,用m1引用這個數(shù)組。第二句是用new語句在堆中為數(shù)組申請了一個空間,用m2引用這個數(shù)組。第三句是改變引用對象,把m2的引用賦給m1,則此時m1也引用m2引用的對象數(shù)組,因此,m1原來引用的數(shù)組無人引用,成為垃圾。3 傳統(tǒng)收集器簡介

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

  3.1 引用計數(shù)法

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

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

  3.2 Tracing算法

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

  3.3 Compacting算法

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

  3.4 Coping算法

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

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

  3.5 Generation算法

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

  3.6 Adaptive算法

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

  4 GC新算法概述

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

  4.1算法描述

  4.1.1內(nèi)存劃分

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

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

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

  

4.1.2具體算法

 

  (1)程序開始運行,對象動態(tài)地申請堆區(qū),這時,每個塊的計數(shù)器啟動,根據(jù)引用對象的標記位情況來改變計數(shù)器的值,為1則計數(shù)器加1,8個計數(shù)器值放在數(shù)組里,并比較8個計數(shù)器值的大小,選取最大的計數(shù)器所在塊,進行掃描。

  (2)掃描出的垃圾轉(zhuǎn)移到刪除區(qū),等待被刪除。

  (3)繼續(xù)比較計數(shù)器值,但已經(jīng)進行掃描的塊不參加此后的比較,待刪除的垃圾占的空間達到min值時,垃圾器開始對活躍區(qū)壓縮內(nèi)存碎片,并且在刪除區(qū)同時開始進行垃圾刪除申請。

  (4)當刪除區(qū)的空間達到了max值時,刪除區(qū)的垃圾還沒有被刪除,這時停止活躍區(qū)的掃描,等待刪除區(qū)進行垃圾刪除。

  4.2 實例分析

  看下面一段程序:

  int [][] m1=new int[2][3];

  int [][] m2=new int[2][3];

  m1=m2;

  此例中,第一句是用new語句在堆中為數(shù)組申請了一個空間,然后用matrix引用此空間的對象(這里數(shù)組可以理解為對象),此時這個內(nèi)存空間就是有用的。第二句是給matrix賦空值,matrix則不再引用此數(shù)組。此時,這個空間就是無用的。

  對于原來的算法,m1引用的數(shù)組在堆中是隨機存放的,若要查找垃圾,則會遍歷整個堆內(nèi)存,先標記,然后再清理垃圾。設(shè)耗費時間為Ta。

  m1引用的數(shù)組在堆中是隨機存放的,所以假設(shè)其放在活躍區(qū)中的cnt[x]區(qū)(x取值為0~7之一),下面分兩種情況來考慮:

  (1)最好的情況,m1原來引用的數(shù)組放在cnt1中為數(shù)組cnt[x]中最大的數(shù),則查找到這個垃圾的時間為: T8+cnt[x]。

  

  由此可以節(jié)省7Ta/16的時間。此新算法可以大大減少垃圾處理所需的時間。

  Java語言對垃圾的處理是利用Java的垃圾處理器自動進行的,JVM雖然沒有明確程序員必須了解垃圾處理器的過程和實質(zhì),但是,一個優(yōu)秀的Java程序員應(yīng)該掌握和熟悉垃圾處理器的工作機制,充分利用好內(nèi)存空間,減少不必要的空間浪費,從而使程序更好地運行。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品高潮呻吟久久| 韩国成人精品a∨在线观看| 欧美一区二区成人| 亚洲午夜精品久久| 一本不卡影院| 日韩午夜在线电影| 亚洲精品日韩在线观看| 久久精品首页| 久久国产精品色婷婷| 欧美亚洲色图校园春色| 午夜在线视频观看日韩17c| 亚洲欧美另类国产| 午夜精品一区二区三区在线 | 亚洲性线免费观看视频成熟| 亚洲毛片av在线| 日韩图片一区| 一区二区三区久久精品| 一区二区三区www| 亚洲午夜精品一区二区三区他趣| 在线视频精品一| 亚洲一区二区精品| 亚洲综合欧美| 欧美一区二区视频在线| 欧美中文字幕在线观看| 亚洲国产欧美一区二区三区同亚洲 | 午夜精品免费| 久久精品二区三区| 亚洲国产影院| 亚洲免费观看在线视频| 中国日韩欧美久久久久久久久| av成人福利| 亚洲欧美日韩综合| 久久久久久久成人| 欧美 日韩 国产一区二区在线视频| 免费在线亚洲| 欧美日韩国产综合视频在线观看 | 亚洲无线视频| 午夜精品久久一牛影视| 久久成人在线| 日韩视频在线播放| 亚洲午夜免费福利视频| 欧美一级网站| 免费观看国产成人| 欧美揉bbbbb揉bbbbb| 国产精品自拍视频| 加勒比av一区二区| 日韩视频在线观看一区二区| 亚洲一区亚洲二区| 亚洲国产欧美日韩| 亚洲视频播放| 久久精品视频在线播放| 免费日韩成人| 国产精品久久久久久久久免费樱桃| 国产一区二区精品久久| 亚洲精品一区在线| 亚洲嫩草精品久久| 亚洲人成在线播放网站岛国| 亚洲一区三区视频在线观看| 久久久久久久久久久久久久一区| 欧美华人在线视频| 国产精品一区二区在线观看| 在线观看91久久久久久| avtt综合网| 亚洲二区视频在线| 亚洲一区二区三区中文字幕| 久久免费99精品久久久久久| 欧美视频日韩| 精品成人一区二区三区四区| 一本久道久久综合中文字幕| 久久99伊人| 亚洲一区中文| 久久九九久久九九| 欧美日韩网站| 激情丁香综合| 亚洲视频在线免费观看| 91久久精品久久国产性色也91| 一本色道久久综合狠狠躁的推荐| 久久精品成人一区二区三区| 欧美日韩视频| 怡红院精品视频在线观看极品| 一本色道久久精品| 91久久精品视频| 久久国产加勒比精品无码| 欧美日韩国产综合新一区| 国内精品久久久| 亚洲无毛电影| 正在播放欧美一区| 猛男gaygay欧美视频| 国产深夜精品| 亚洲性夜色噜噜噜7777| 一区二区欧美精品| 免费视频一区| 国产一区在线免费观看| 亚洲一区二区三区欧美| 夜夜嗨av色一区二区不卡| 毛片基地黄久久久久久天堂| 国产亚洲精品激情久久| 在线视频亚洲一区| 99成人免费视频| 欧美成人黄色小视频| 国产一区二区丝袜高跟鞋图片| 亚洲一区二区三区乱码aⅴ蜜桃女| 99精品热视频| 欧美成人69av| 在线观看三级视频欧美| 久久精品91久久久久久再现| 久久国产精品久久久久久| 国产精品久久999| 日韩写真视频在线观看| 99亚洲视频| 欧美欧美全黄| 亚洲精品国产精品国自产在线 | 亚洲午夜av| 亚洲一本视频| 欧美日韩影院| 日韩一区二区精品葵司在线| 99精品久久久| 欧美精品一区三区| 亚洲日本一区二区| 亚洲精品日日夜夜| 欧美a级大片| 亚洲国产另类 国产精品国产免费| 久久精品久久99精品久久| 久久久夜精品| 在线观看91久久久久久| 91久久综合| 欧美成人午夜激情在线| 亚洲高清视频一区| 99re6这里只有精品| 欧美日韩国产免费观看| 亚洲久久在线| 亚洲一二三区精品| 国产精品日韩高清| 性娇小13――14欧美| 久久久久99| 在线观看精品视频| 99精品国产99久久久久久福利| 欧美日韩a区| 亚洲香蕉视频| 久久黄色小说| 在线观看91久久久久久| 日韩特黄影片| 欧美日韩亚洲高清| 亚洲小视频在线观看| 久久不见久久见免费视频1| 国产亚洲人成网站在线观看| 亚洲第一中文字幕| 欧美日本精品一区二区三区| 一区二区日韩免费看| 欧美一区免费视频| 国产最新精品精品你懂的| 91久久精品国产91久久| 欧美精品1区| 亚洲一区二区三区四区五区午夜 | 欧美在线啊v| 乱人伦精品视频在线观看| 亚洲国产天堂久久综合网| 亚洲一区二区免费看| 国产欧美日韩综合一区在线观看 | 欧美电影专区| 亚洲天堂av电影| 久久久久久亚洲综合影院红桃| 亚洲成色777777在线观看影院| 一本色道久久精品| 国产日韩欧美另类| 亚洲欧洲日韩综合二区| 国产精品久久国产精麻豆99网站| 亚洲欧美日韩综合| 蜜臀91精品一区二区三区| 一区二区激情视频| 久久久国产精品一区二区中文| 亚洲激情一区二区| 午夜日韩在线观看| 在线精品福利| 亚洲欧美日韩天堂| 亚洲电影有码| 香蕉精品999视频一区二区| 在线播放日韩欧美| 亚洲欧美精品一区| 亚洲成人中文| 欧美亚洲日本网站| 91久久精品国产91久久性色tv| 午夜视频一区| 亚洲人午夜精品免费| 欧美中在线观看| 日韩视频国产视频| 久久网站热最新地址| 亚洲视频免费在线| 欧美成人免费va影院高清| 亚洲欧美日韩国产综合在线| 欧美日本亚洲| 久久国产加勒比精品无码| 欧美亚州在线观看| 亚洲精品一区二区三区四区高清 | 亚洲美女黄色片| 久久综合九色综合欧美就去吻| 亚洲午夜久久久久久久久电影院| 欧美国产激情| 久久精品日产第一区二区三区| 国产精品久久久久久av下载红粉 |