java內(nèi)存泄露研究

java內(nèi)存泄露研究

ID:41851886

大?。?64.69 KB

頁數(shù):8頁

時(shí)間:2019-09-03

java內(nèi)存泄露研究_第1頁
java內(nèi)存泄露研究_第2頁
java內(nèi)存泄露研究_第3頁
java內(nèi)存泄露研究_第4頁
java內(nèi)存泄露研究_第5頁
資源描述:

《java內(nèi)存泄露研究》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、Java內(nèi)存管理機(jī)制在C++語言中,如果需要?jiǎng)討B(tài)分配一塊內(nèi)存,程序員需耍負(fù)責(zé)這塊內(nèi)存的整個(gè)生命周期。從申請(qǐng)分配、到使用、再到最后的釋放。這樣的過程非常靈活,但是卻I?分繁瑣,程序員很容易由于疏忽而忘記釋放內(nèi)存,從而導(dǎo)致內(nèi)存的泄露。Java語言對(duì)內(nèi)存管理做了ft己的優(yōu)化,這就是垃圾回收機(jī)制Java的兒乎所有內(nèi)存對(duì)象都是在堆內(nèi)存上分配(基本數(shù)據(jù)類型除外),然后由GC(garbagecollection)負(fù)責(zé)自動(dòng)回收不再使用的內(nèi)存。上面是Java內(nèi)存管理機(jī)制的基本情況。但是如果僅僅理解到這里,我們?cè)趯?shí)際的項(xiàng)目開發(fā)中仍然會(huì)遇到內(nèi)存泄漏的問題。也許冇人表示懷疑,既然Java的垃圾回收

2、機(jī)制能夠自動(dòng)的回收內(nèi)存,怎么還會(huì)出現(xiàn)內(nèi)存泄漏的情況呢?這個(gè)問題,我們需要知道GC在什么時(shí)候冋收內(nèi)存對(duì)象,什么樣的內(nèi)存對(duì)象會(huì)被GC認(rèn)為是“不再使用”的。Java中對(duì)內(nèi)存對(duì)象的訪問,使用的是引用的方式。在Java代碼中我們維護(hù)一個(gè)內(nèi)存對(duì)彖的引用變雖,通過這個(gè)引用變量的值,我們可以訪問到對(duì)應(yīng)的內(nèi)存地址中的內(nèi)存對(duì)彖空間。在Java程序中,這個(gè)引用變量本身既可以存放堆內(nèi)存中,乂可以放在代碼棧的內(nèi)存中(與基本數(shù)據(jù)類型相同)。GC線程會(huì)從代碼棧中的引用變量開始跟蹤,從而判定哪些內(nèi)存是正在使用的。如果GC線程通過這種方式,無法跟蹤到某一塊堆內(nèi)存,那么GC就認(rèn)為這塊內(nèi)存將不再使用了(因?yàn)榇a

3、中己經(jīng)無法訪問這塊內(nèi)存了)。O?2是第二次申請(qǐng)的對(duì)彖,此時(shí)為可回收對(duì)敷通過這種有向圖的內(nèi)存管理方式,當(dāng)一個(gè)內(nèi)存對(duì)象失去了所有的引用Z后,GC就可以將其回收。反過來說,如果這個(gè)對(duì)彖還存在引用,那么它將不會(huì)被GC回收,哪怕是Java虛擬機(jī)拋出OutOfMemoryError。Java內(nèi)存泄露一般來說內(nèi)存泄漏冇兩種情況。一種情況如在C/C++語言中的,在堆中的分配的內(nèi)存,在沒有將其釋放掉的時(shí)候,就將所有能訪問這塊內(nèi)存的方式都刪掉(如指針重新賦值);另—?種情況則是在內(nèi)存對(duì)象明明已經(jīng)不需要的時(shí)候,還仍然保留著這塊內(nèi)存和它的訪問方式(引用)。第一種情況,在Java中已經(jīng)由于垃圾回收機(jī)

4、制的引入,得到了很好的解決。所以,Java屮的內(nèi)存泄漏,主要指的是第二種情況??赡芄庹f概念太抽象了,大家可以看一下這樣的例了:1Vectorv=newVector(10);2for(inti=1;i<100;i++){3Objecto=newObject();4v.add(o);1o=null;6}在這個(gè)例子中,代碼棧中存在Vector對(duì)彖的引用v和Object對(duì)彖的引用0。在For循環(huán)屮,我們不斷的生成新的對(duì)象,然示將其添加到Vector對(duì)象屮,之示將o引用置空。問題是當(dāng)。引用被査空后,如果發(fā)牛GC,我們創(chuàng)建的Object對(duì)象是否能夠被GC回收呢?答案是否定的。因?yàn)?,GC

5、在跟蹤代碼棧中的引用吋,會(huì)發(fā)現(xiàn)v引用,而繼續(xù)往下跟蹤,就會(huì)發(fā)現(xiàn)v引川指向的內(nèi)存空間中又存在指向Object對(duì)彖的引用。也就是說盡管o引用已經(jīng)被置空,但是Object對(duì)象仍然存在其他的引川,是可以被訪問到的,所以GC無法將其釋放掉。如果在此循環(huán)之示,Object對(duì)象對(duì)程序已經(jīng)沒有任何作用,那么我們就認(rèn)為此Java程序發(fā)生了內(nèi)存泄漏。盡管對(duì)于C/C++中的內(nèi)存泄露情況來說,Java內(nèi)存泄露導(dǎo)致的破壞性小,除了少數(shù)情況會(huì)出現(xiàn)程序崩潰的情況外,大多數(shù)情況下程序仍然能正常運(yùn)行。但是,在移動(dòng)設(shè)備對(duì)于內(nèi)存和CPU都有較嚴(yán)格的限制的情況F,Java的內(nèi)存溢出會(huì)導(dǎo)致程序效率低匚占用人量不需要

6、的內(nèi)存等問題。這將導(dǎo)致整個(gè)機(jī)器性能變差,嚴(yán)重的也會(huì)引起拋出OutOfMemoryError,導(dǎo)致程序崩潰。一般情況下內(nèi)存泄漏的避免在不涉及復(fù)雜數(shù)據(jù)結(jié)構(gòu)的-?般情況下,Java的內(nèi)存泄露表現(xiàn)為一個(gè)內(nèi)存對(duì)象的生命周期超出了程序需要它的時(shí)間長度。我們有時(shí)也將其稱為“對(duì)彖游離”。例如:1publicclassFileSearch{23privatebyte[]content;有問題,不應(yīng)該被聲明為實(shí)例變量4privateFilemFile;56publicFileSearch(Filefile){7mFile=file;8}910publicbooleanhasString(Str

7、ingstr){11intsize=getFileSize(mFile);12content=newbyte[size];13loadFile(mFile,content);1415Strings=newString(content);16returns.contains(str);17}18}在這段代碼中,F(xiàn)ileSearch類中有一個(gè)函數(shù)hasString,用來判斷文檔中是否含有指定的字符串。流程是先將mFilc加載到內(nèi)存中,然后進(jìn)行判斷。但是,這里的問題是,將content聲明為了實(shí)例變量,而不是本地變量。于

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。