當前位置:編程學習大全網 - 編程語言 - 回調編程

回調編程

Java中垃圾收集機制的綜合分析

Java的堆是壹個運行時數據區,類的實例(對象)從這裏分配空間。Java虛擬機(JVM)的堆存儲由運行的應用程序創建的所有對象。這些對象由諸如new、newarray、anewarray和multianewarray之類的指令創建,但它們不需要程序代碼來顯式釋放。壹般來說,垃圾收集負責堆。雖然JVM規範根本不需要專門的垃圾收集技術,甚至不需要垃圾收集,但是由於內存有限,JVM在實現的時候有壹個由垃圾收集管理的堆。垃圾收集是壹種動態存儲管理技術,它根據特定的垃圾收集算法,自動釋放程序不再引用的對象,實現自動資源回收的功能。

垃圾收集的意義

在C++中,壹個對象占用的內存壹直占用到程序結束運行,在顯式釋放之前不能分配給其他對象。在Java中,當沒有對最初分配給對象的內存的對象引用時,內存就變成了垃圾。JVM的系統級線程將自動釋放內存塊。垃圾收集意味著程序不再需要的對象是“無用信息”,將被丟棄。當壹個對象不再被引用時,內存會回收它所占用的空間,以便以後的新對象可以使用這些空間。事實上,垃圾回收除了釋放無用的對象,還可以去除內存記錄碎片。由於對象的創建和垃圾收集器釋放被丟棄的對象占用的內存空間,內存將被碎片化。碎片是分配給對象的內存塊之間的空閑內存洞。碎片整理將占用的堆內存移動到堆的壹端,JVM將排序後的內存分配給新的對象。

垃圾回收可以自動釋放內存空間,減輕編程負擔。這給了Java虛擬機壹些優勢。第壹,可以提高編程效率。當沒有垃圾收集機制時,解決壹個困難的內存問題可能要花很多時間。用Java語言編程時,依靠垃圾收集機制可以大大縮短時間。其次,它保護了程序的完整性,垃圾收集是Java語言安全策略的重要組成部分。

垃圾收集的壹個潛在缺點是其開銷會影響程序性能。Java虛擬機必須跟蹤運行程序中有用的對象,最終釋放無用的對象。這個過程需要處理器時間。其次,垃圾收集算法不完整,早期采用的壹些垃圾收集算法並不能保證收集到所有丟棄內存的100%。當然,隨著垃圾收集算法的不斷完善,軟硬件運行效率的不斷提高,這些問題都是可以解決的。

垃圾收集算法分析

Java語言規範並沒有規定JVM使用哪種垃圾收集算法,但是任何垃圾收集算法壹般都需要做兩件基本的事情:(1)尋找無用的信息對象;(2)回收無用對象占用的內存空間,使空間可以被程序重用。

大多數垃圾收集算法使用根集的概念;所謂根集,就是正在執行的Java程序可以訪問的引用變量(包括局部變量、參數和類變量)的集合,程序可以使用引用變量訪問對象的屬性,調用對象的方法。垃圾收集的第壹選擇需要確定從根開始什麽是可到達的,什麽是不可到達的。從根集可達的對象都是活動對象,它們不能作為垃圾回收,包括從根集間接可達的對象。無法通過任何路徑到達其根集的對象符合垃圾收集的條件,應該被回收。下面是幾種常用的算法。

1,引用計數收集器

引用計數方法是唯壹不使用根集的垃圾收集方法。該算法使用引用計數器來區分活動對象和不再使用的對象。壹般來說,堆中的每個對象對應壹個引用計數器。每次創建對象並將其賦給變量時,引用計數器都被設置為1。當壹個對象被賦給任何變量時,引用計數器每次增加1。當對象超出範圍時(它被丟棄並且不再被使用),引用計數器減少1。壹旦引用計數器為0,對象就滿足垃圾回收的條件。

基於引用計數器的垃圾收集器運行速度更快,不會長時間中斷程序執行,適用於必須實時運行的程序。但是,引用計數器會增加程序執行的開銷,因為每當壹個對象被賦給壹個新變量時,計數器就增加1,而每當壹個現有對象超出範圍時,計數器就減少1。

2.跟蹤算法(跟蹤收集器)

追蹤算法是為了解決引用計數問題而提出的,它使用了根集的概念。基於跟蹤算法的垃圾收集器從根集開始掃描,識別哪些對象是可達的,哪些對象是不可達的,並以某種方式標記可達對象,例如為每個可達對象設置壹個或多個位。在掃描識別過程中,基於跟蹤算法的垃圾收集也稱為標記-清掃垃圾收集器。

3.折衷算法(折衷收集器)

為了解決堆碎片問題,基於追蹤的垃圾收集吸收了壓縮算法的思想。在清理過程中,算法將所有對象移動到堆的壹端,堆的另壹端成為相鄰的空閑內存區域。收集器將更新它所移動的所有對象的所有參照,以便這些參照可以識別新位置中的原始對象。在基於壓縮算法的收集器的實現中,通常添加句柄和句柄表。

4.復制算法(復制收集器)

該算法的提出是為了克服handle的開銷,解決堆碎片的垃圾收集問題。壹開始,它把堆分成壹個對象表面和幾個空閑表面,程序從對象表面為對象分配空間。當對象已滿時,基於coping算法的垃圾收集從根集中掃描活動對象,並將每個活動對象復制到空閑面(這樣活動對象占用的內存之間就沒有空閑洞了),這樣空閑面就變成了對象面,原來的對象面變成了空閑面,程序會在新的對象面中分配內存。

壹個典型的基於coping算法的垃圾收集是stop-and-copy算法,將堆分為對象面和自由區面,在對象面和自由區面的切換過程中程序暫停。

5.生成算法(分代收集器)

停止復制式垃圾收集器的缺點之壹是收集器必須復制所有的活動對象,增加了程序的等待時間,這也是復制算法效率低下的原因。編程中有這樣壹個規律:大多數對象存在時間很短,少數存在時間很長。因此,生成算法將堆分成兩個或多個,每個子堆作為對象的壹個代。因為大多數對象存在的時間很短,所以當程序丟棄未使用的對象時,垃圾收集器將從最年輕的子堆中收集它們。分代式垃圾收集器運行後,上次運行後幸存的對象被移動到下壹個最高代的子堆,這樣可以節省時間,因為舊代的子堆不會經常被回收。

6、自適應算法(Adaptive Collector)

在某些情況下,壹些垃圾收集算法會優於其他算法。基於自適應算法的垃圾收集器是監視當前堆使用情況並將選擇適當算法的垃圾收集器。

  • 上一篇:五年級作文寫動物的作文怎麽寫作文
  • 下一篇:教育格言大全
  • copyright 2024編程學習大全網