qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          介紹 Java 的內(nèi)存泄漏

           java最明顯的一個優(yōu)勢就是它的內(nèi)存管理機制。你只需簡單創(chuàng)建對象,java的垃圾回收機制負責分配和釋放內(nèi)存。然而情況并不像想像的那么簡單,因為在Java應(yīng)用中經(jīng)常發(fā)生內(nèi)存泄漏。
            本教程演示了什么是內(nèi)存泄漏,為什么會發(fā)生內(nèi)存泄漏以及如何預防內(nèi)存泄漏。
            什么是內(nèi)存泄漏?
            定義:如果對象在應(yīng)用中不再被使用,但由于它們在其他地方被引用,垃圾回收卻不能移除它們(這樣就造成了很多內(nèi)存不能釋放,從而導致內(nèi)存溢出的現(xiàn)象。譯注)。
            要理解這一定義,我們需要理解內(nèi)存中對象的狀態(tài)。下圖說明了那些是未使用,那些是未引用。
            從圖中可以看到被引用對象和未引用對象(的范圍)。未引用對象可以被垃圾回收機制回收,而被引用對象不能被垃圾回收機制回收。未引用對象當然是沒有使用的,因為沒有其他對象引用了它。然而未使用對象并不都是未引用的。某些未使用的對象仍然被其他地方引用!這就是內(nèi)存泄漏起因。
            為什么會發(fā)生內(nèi)存泄漏?
            讓我們來下面的這個例子,看看為什么會發(fā)生內(nèi)存泄漏。在如下例子中,A對象引用了B對象。A的生命周期(t1-t4)比B的生命周期(t2-t3)要長的多,當B不再在應(yīng)用中被使用,A仍然持有對B的引用。這樣一來,垃圾回收機制不能從內(nèi)存中移除B。這很有可能導致內(nèi)存溢出問題,因為如果其他很多對象像A一樣,那么內(nèi)存中將會有很多不能被回收的對象,這將消耗大量內(nèi)存空間。
            也有可能的情況是B持有了大量對其他對象的引用。這些被B引用的對象同樣不會被回收掉。所有這些未使用的對象將會消耗寶貴的內(nèi)存空間。
            如何預防內(nèi)存泄漏?
            如下是一些預防內(nèi)存泄漏的快速技巧:
            1、留意集合類,比如HashMap,ArrayList等等,因為他們是內(nèi)存泄漏經(jīng)常發(fā)生的地方。當它們被聲明為靜態(tài)對象時,他們的生命周期就和應(yīng)用的生命周期一樣長。
            2、留意事件監(jiān)聽器和回調(diào)。如果一個類注冊了監(jiān)聽器,但當該類不再被使用后沒有注銷監(jiān)聽器,可能會發(fā)生內(nèi)存泄漏。
            3、“如果一個類管理自己的內(nèi)存,程序員應(yīng)該警惕內(nèi)存泄漏。”[1],很多時候?qū)ο笾械闹赶蚱渌麑ο蟪蓡T變量需要設(shè)置成null(才能被回收)。
            一個小測驗:為什么JDK6中的substring()方法會引發(fā)內(nèi)存泄漏?
            要回答這個問題,你可能需要查看JDK6和7中substring()的源碼。

          posted on 2013-10-29 10:45 順其自然EVO 閱讀(151) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2013年10月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 北流市| 水富县| 大化| 抚州市| 博客| 平远县| 华池县| 城步| 巴南区| 兴仁县| 塔城市| 天津市| 涿鹿县| 保康县| 公安县| 烟台市| 广德县| 新巴尔虎左旗| 淮北市| 定南县| 广灵县| 普安县| 大丰市| 射洪县| 沁阳市| 台安县| 鹤庆县| 漳州市| 柯坪县| 平阳县| 旅游| 昌图县| 兴国县| 和硕县| 鄂伦春自治旗| 丹寨县| 岑巩县| 九寨沟县| 镇宁| 铁力市| 富裕县|