java垃圾回收機制是怎樣的_第1頁
java垃圾回收機制是怎樣的_第2頁
java垃圾回收機制是怎樣的_第3頁
java垃圾回收機制是怎樣的_第4頁
java垃圾回收機制是怎樣的_第5頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——java垃圾回收機制是怎樣的手動管理內(nèi)存

在介紹現(xiàn)代版的垃圾回收之前,我們先來簡樸地回想下需要手動地顯式調(diào)配及釋放內(nèi)存的那些日子。假設(shè)你忘了去釋放內(nèi)存,那么這塊內(nèi)存就無法重用了。這塊內(nèi)存被占有了卻沒被使用。這種場景被稱之為內(nèi)存泄露。

下面是用C寫的一個手動管理內(nèi)存的簡樸例子:

intsend_request

size_tn=read_size;

int*elements=mallocn*sizeofint;

ifread_elementsn,elementsn

//elementsnotfreed!return-1;//…freeelements

return0;

可以看到,你很輕易就會忘了釋放內(nèi)存。內(nèi)存泄露曾經(jīng)是個分外普遍的問題。你只能通過不斷地修復自己的代碼來與它們舉行抗爭。因此,需要有一種更優(yōu)雅的方式來自動釋放無用內(nèi)存,以便裁減人為錯誤的可能性。這種自動化過程又被稱為垃圾回收簡稱GC。

智能指針

自動垃圾回收早期的一種實現(xiàn)便是引用計數(shù)。你知曉每一個對象被引用了幾次,當計數(shù)器歸0的時候,這個對象就可以被安好地回收掉了。C++的共享指針就是一個分外著名的例子:

11intsend_requestsize_tn=read_size;stared_ptrelements=make_shared;ifread_elementsn,elementsnreturn-1;return0;

我們使用的sharedptr會記錄這個對象被引用的次數(shù)。假設(shè)你將它傳遞給別人那么計數(shù)加一,當它離開了作用域后便會減一。一旦這個計數(shù)為0,sharedptr會自動地刪除底層對應(yīng)的vector。當然這只是個例如,由于也有讀者指出來了,這個在現(xiàn)實中是不太可能展現(xiàn)的,但作為演示是足夠了。

自動內(nèi)存管理

在上面的C++代碼中,我們還得顯式地聲明我們需要使用內(nèi)存管理。那假設(shè)全體的對象都采用這個機制會怎樣呢?那簡直就太便當了,這樣開發(fā)人員便無需考慮清理內(nèi)存的事情了。運行時會自動知曉哪些內(nèi)存不再使用了,然后釋放掉它。也就是說,它自動地回收了這些垃圾。第一代的垃圾回收器是1959年Lisp引入的,這項技術(shù)迄今為止一向在不斷演進。

引用計數(shù)

方才我們用C++的共享指針所演示的想法可以應(yīng)用到全體的對象上來。大量語言譬如說Perl,Python以及PHP,采用的都是這種方式。這個通過一張圖可以很輕易說明:

綠色的云代表的是程序中仍在使用的對象。從技術(shù)層面上來說,這有點像是正在執(zhí)行的某個方法里面的局部變量,亦或是靜態(tài)變量之類的。不同編程語言的處境可能會不一樣,因此這并不是我們關(guān)注的重點。

藍色的圓圈代表的是內(nèi)存中的對象,可以看到有多少對象引用了它們。灰色圓圈的對象是已經(jīng)沒有任何人引用的了。因此,它們屬于垃圾對象,可以被垃圾回收器清理掉。

看起來還不錯對吧?沒錯,不過這里存在著一個重大的缺陷。很輕易會展現(xiàn)一些孤立的環(huán),它們中的對象都不在任何域內(nèi),但彼此卻彼此引用導致引用數(shù)不為0。下面便是一個例子:

看到了吧,紅色片面其實就是應(yīng)用程序不再使用的垃圾對象。由于引用計數(shù)的缺陷,因此會存在內(nèi)存泄露。

有幾種方法可以解決這一問題,譬如說使用特殊的“弱”引用,或者使用一個特殊的算法回收循環(huán)引用。之前提到的Perl,Python以及PHP等語言,都是使用類似的方法來回收循環(huán)引用的,不過這已經(jīng)超出本文陳述的范圍了。我們打定細致介紹下JVM所采用的方法。

標記刪除

首先,JVM對于對象可達性的定義要明確一些。它可不像前面那樣用綠色的云便含煳了事的,而是有著分外明確及概括的垃圾回收根對象GarbageCollectionRoots的定義:

局部變量

活動線程

靜態(tài)字段

JNI引用

其它后面將會議論到

JVM通過標記刪除的算法來記錄全體可達存活對象,同時確保不成達對象的那些內(nèi)存能夠被重用。這包含兩個步驟:

標記是指遍歷全體可達對象,然后在本地內(nèi)存中記錄這些對象的信息

刪除會確保不成達對象的內(nèi)存地址可以在下一次內(nèi)存調(diào)配中使用。

JVM中的不同GC算法,譬如說ParallelScavenge,ParallelMark+Copy,CMS都是這一算法的不同實現(xiàn),只是各階段略有不同而已,從概念上來講依舊是對應(yīng)著上面所說的那兩個步驟。

這種實現(xiàn)最重要的就是不會再展現(xiàn)泄露的對象環(huán)了:

缺點就是應(yīng)用程序的線程需要被暫停才能完

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論