java內(nèi)存泄露原因總結(jié)

java內(nèi)存泄露原因總結(jié)

ID:44229868

大?。?0.50 KB

頁(yè)數(shù):4頁(yè)

時(shí)間:2019-10-19

java內(nèi)存泄露原因總結(jié)_第1頁(yè)
java內(nèi)存泄露原因總結(jié)_第2頁(yè)
java內(nèi)存泄露原因總結(jié)_第3頁(yè)
java內(nèi)存泄露原因總結(jié)_第4頁(yè)
資源描述:

《java內(nèi)存泄露原因總結(jié)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、Java內(nèi)存泄露原因整理一、Java內(nèi)存回收機(jī)制不論哪種語(yǔ)言的內(nèi)存分配方式,都需要返冋所分配內(nèi)存的真實(shí)地址,也就是返冋一個(gè)指針到內(nèi)存塊的首地址。Java中對(duì)象是采用new或者反射的方法創(chuàng)建的,這些對(duì)象的創(chuàng)建都是在堆(Heap)小分配的,所有對(duì)象的冋收都是由Java虛擬機(jī)通過(guò)垃圾冋收機(jī)制完成的。GC為了能夠正確釋放對(duì)象,會(huì)監(jiān)控每個(gè)對(duì)象的運(yùn)行狀況,對(duì)他們的屮請(qǐng)、引用、被引用、賦值等狀況進(jìn)行監(jiān)控,Java會(huì)使用有向圖的方法進(jìn)行管理內(nèi)存,實(shí)時(shí)監(jiān)控對(duì)象是否可以達(dá)到,如果不可到達(dá),則就將其回收,這樣也可以消除引用循環(huán)的問(wèn)題。在Java語(yǔ)言中,判斷一個(gè)內(nèi)存空

2、I'可是否符合垃圾收集標(biāo)準(zhǔn)有兩個(gè):一個(gè)是給對(duì)象賦予了空值null,以下再?zèng)]有調(diào)用過(guò),另一個(gè)是給對(duì)彖賦予了新值,這樣重新分配了內(nèi)存空間。二、Java內(nèi)存泄露引起原因Java內(nèi)存泄露根本原因:長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露,盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L(zhǎng)生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是jaw中內(nèi)存泄露的發(fā)生場(chǎng)景。具體主要有如下兒大類(lèi):1、靜態(tài)集合類(lèi)引起內(nèi)存泄露:像HashMap、Vector等的使用最容易出現(xiàn)內(nèi)存泄露,這些靜態(tài)變量的牛命周期和應(yīng)用程序一致,他們所引用的所有的對(duì)象Object也

3、不能被釋放,因?yàn)樗麄円矊⒁恢北籚ector等引用著。例:StaticVectorv=newVector(lO);for(inti=1;i

4、象屬性被修改后,再調(diào)用remove()方法時(shí)不起作用。例:publicstaticvoidmain(Stringf]args){Setset=newHashSet();Personpl=newPerson("唐僧”,"pwdl",25);Personp2=newPerson(M孫悟空",”pwd2",26);Personp3=newPerson(M豬八戒;'pwd3“,27);set.add(pl);set.add(p2);set.add(p3);System.out.println("總共有:"+set.siz

5、e()+"個(gè)元素!”);〃結(jié)果:總共有:3個(gè)元素!p3.setAge(2);〃修改p3的年齡,此時(shí)p3元素對(duì)應(yīng)的hashcode值發(fā)生改變set.remove(p3);〃此時(shí)remove不掉,造成內(nèi)存泄漏set.add(p3);〃重新添加,居然添加成功System.out.println("總共有:”+set.size()+”個(gè)元素!");//結(jié)果:總共有:4個(gè)元素!for(Personperson:set){System.out.println(person);3、監(jiān)聽(tīng)器在java編程中,我們都需要和監(jiān)聽(tīng)器打交道,通常一個(gè)應(yīng)用當(dāng)中會(huì)用到很多監(jiān)

6、聽(tīng)器,我們會(huì)調(diào)用一個(gè)控件的諸如addXXXListener()^方法來(lái)增加監(jiān)聽(tīng)器,但往往在釋放對(duì)象的時(shí)候卻沒(méi)有記住去刪除這些監(jiān)聽(tīng)器,從而增加了內(nèi)存泄漏的機(jī)會(huì)。4、各種連接比如數(shù)據(jù)庫(kù)連接(dataSourse.getConnection()),網(wǎng)絡(luò)連接(socket)和io連接,除非其顯式的調(diào)用了其close()方法將其連接關(guān)閉,否則是不會(huì)自動(dòng)被GC回收的。對(duì)于Resultset和Statement對(duì)彖可以不進(jìn)行顯式冋收,但Connection一定要顯式冋收,因?yàn)镃onnection在任何時(shí)候都無(wú)法自動(dòng)回收,而Connection一旦回收,Res

7、ultset和Statement對(duì)象就會(huì)立即為NULLo但是如果使用連接池,情況就不一樣了,除了耍顯式地關(guān)閉連接,還必須顯式地關(guān)閉ResultsetStatement對(duì)象(關(guān)閉其中一個(gè),另外一個(gè)也會(huì)關(guān)閉),否則就會(huì)造成大量的Statement對(duì)象無(wú)法釋放,從而引起內(nèi)存泄漏。這種情況下一般都會(huì)在try里面去的連接,在finally里面釋放連接。5、內(nèi)部類(lèi)和外部模塊等的引用內(nèi)部類(lèi)的引用是比較容易遺忘的一種,而且一旦沒(méi)釋放可能導(dǎo)致一系列的后繼類(lèi)対象沒(méi)有釋放。此外程序員還要小心外部模塊不經(jīng)意的引用,例如程序員A負(fù)責(zé)A模塊,調(diào)用了B模塊的一個(gè)方法如:pu

8、blicvoidregisterMsg(Objectb);這種調(diào)用就要非常小心了,傳入了一個(gè)對(duì)象,很可能模塊B就保持了對(duì)該對(duì)彖的引用,這時(shí)候就需要注意

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

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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(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)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。