日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于内存泄漏

發(fā)布時間:2025/4/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于内存泄漏 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文由 ImportNew - 范琦琦 翻譯自 Programcreek。如需轉(zhuǎn)載本文,請先參見文章末尾處的轉(zhuǎn)載要求。

ImportNew注:如果你也對Java技術(shù)翻譯分享感興趣,歡迎加入我們的 Java開發(fā)?小組。參與方式請查看小組簡介。

Java最顯著的優(yōu)勢之一就是它的內(nèi)存管理機(jī)制。你只需簡單創(chuàng)建對象,然后Java垃圾回收機(jī)制便會小心的分配和釋放內(nèi)存。然而,事實(shí)并非如此簡單,因?yàn)樵贘ava應(yīng)用程序中經(jīng)常發(fā)生內(nèi)存泄漏。

本教程說明了什么是內(nèi)存泄漏,為什么會發(fā)生,以及如何防止它們。

1.什么是內(nèi)存泄漏?

內(nèi)存泄漏的定義: 對象不再被應(yīng)用程序使用,但是垃圾回收器卻不能移除它們,因?yàn)樗鼈冋诒灰谩?/p>

要理解這個定義,我們需要理解對象在內(nèi)存中的狀態(tài),下圖說明了哪些是未被使用的以及哪些是未被引用的。

從圖中可以看到被引用的對象和未被引用的對象。未被引用的對象將會被垃圾回收器回收,而被引用對象則不會被回收。未被引用的對象理所當(dāng)然是未被使用的,因?yàn)闆]有其他的對象引用它。然而,未被使用的對象并不一定是未被引用的,其中一些是被引用的。這就是內(nèi)存泄漏的起因。

2.為什么會發(fā)生內(nèi)存泄漏?

讓我們來看看下面這個例子,看看為什么內(nèi)存泄漏會發(fā)生。在如下例子中,對象A引用了對象B。A的生命周期(t1—t4)要比B的生命周期(t2—t3)長很多。當(dāng)B不再用于應(yīng)用中時,A仍然持有對它的引用。在這種方式下,垃圾回收器就不能將B從內(nèi)存中移除。這將可能導(dǎo)致出現(xiàn)內(nèi)存不足的問題,因?yàn)槿绻鸄對更多的對象做同樣的事情,那么內(nèi)存中將會有很多無法被回收的對象,這將極度耗費(fèi)內(nèi)存空間。

也有可能B持有大量對其他對象的引用,這些被B引用的對象也不能夠被回收。所有這些未被使用的對象將會耗費(fèi)寶貴的內(nèi)存空間。

3.如何阻止內(nèi)存泄漏?

以下是一些阻止內(nèi)存泄漏的快速動手技巧。

(1)注意集合類,例如HashMap,ArrayList,等等。因?yàn)樗鼈兪莾?nèi)存泄漏經(jīng)常發(fā)生的地方。當(dāng)它們被聲明為靜態(tài)時,它們的生命周期就同應(yīng)用程序的生命周期一般長。

(2)注意事件監(jiān)聽器和回調(diào),如果一個監(jiān)聽器已經(jīng)注冊,但是當(dāng)這個類不再被使用時卻未被注銷,就會發(fā)生內(nèi)存泄漏。

(3)“如果一個類管理它自己的內(nèi)存,程序員應(yīng)該對內(nèi)存泄漏保持警惕。”[1] 很多時候當(dāng)一個對象的成員變量指向其他對象時,不再使用時需要被置為null。

4.一個小測驗(yàn):為什么在JDK6中substring()方法會引起內(nèi)存泄漏?

為了回答這個問題,您可能需要閱讀JDK6和7中的substring()。

參考文獻(xiàn):
[1]Bloch,Joshua.Effective Java.Addison-Wesley Professional, 2008
[2]IBM Developer Work.http://www.ibm.com/developerworks/library/j-leaks/

總結(jié)

以上是生活随笔為你收集整理的关于内存泄漏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。