qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java內存回收機制

          一、Java對象在內存引用狀態(tài)
            內存泄露:程序運行過程中,會不斷分配內存空間,那些不再使用的內存空間應該即時回收它們,從而保證系統(tǒng)可以再次使用這些內存,如果存在無用的內存沒有被回收回來,這就是內存泄漏.
            (1)強引用
            這是java程序中最常見的引用方式,程序創(chuàng)建一個對象,并把這個對象賦給一個引用變量,這個引用變量就是強引用.java程序可通過強引用來訪問實際的對象。當一個對象被一個或一個以上的強引用變量引用時,它處于可達狀態(tài),它不可能被系統(tǒng)垃圾回收機制回收。
            強引用是Java編程中廣泛使用的引用類型,被強引用所引用的Java對象絕不會被垃圾回收機制回收,即使系統(tǒng)內存緊張;即使有些Java對象以后永遠也不會被用到,JVM也不會回收被強引用所引用的Java對象.
            由于JVM肯定不會回收強引用所引用的JAVA對象,因此強引用是造成JAVA內存泄漏的主要原因。
            如 ReceiptBean rb=new ReceiptBean(); rb就代表了一種強引用的方式
            (2)軟引用
            軟引用需要通過SoftReference類來實現,當一個對象只具有軟引用時,它可能被垃圾回收機制回收。對于只有軟引用的對象而言,當系統(tǒng)內存空間足夠時,它不會被系統(tǒng)回收,程序也可以使用該對象;當系統(tǒng)內存空間不足時,系統(tǒng)將回收它.
            軟引用通常用在對內存敏感的程序中,軟引用是強引用很好的替代。對于軟引用,當系統(tǒng)內存空間充足時,軟引用與強引用沒有太大的區(qū)別,當系統(tǒng)內存空間不足時,被軟引用所引用的JAVA對象可以被垃圾回收機制回收,從而避免系統(tǒng)內存不足的異常.
            當程序需要大量創(chuàng)建某個類的新對象,而且有可能重新訪問已創(chuàng)建老對象時,可以充分使用軟引用來解決內存緊張的問題。
            例如需要訪問1000個Person對象,可以有兩種方式
            方法一 依次創(chuàng)建1000個對象,但只有一個Person引用指向最后一個Person對象
            方法二 定義一個長度為1000個的Person數組,每個數組元素引用一個Person對象.
            對于方法一,弱點很明顯,程序不允許需要重新訪問前面創(chuàng)建的Person對象,即使這個對象所占的空間還沒有被回收。但已經失去了這個對象的引用,因此也不得不重新創(chuàng)建一個新的Person對象(重新分配內存),而那個已有的Person對象(完整的,正確的,可用的)則只能等待垃圾回收
            對于方法二,優(yōu)勢是可以隨時重新訪問前面創(chuàng)建的每個Person對象,但弱點也有,如果系統(tǒng)堆內存空間緊張,而1000個Person對象都被強引用引著,垃圾回收機制也不可能回收它們的堆內存空間,系統(tǒng)性能將變成非常差,甚至因此內存不足導致程序中止。
            如果用軟引用則是一種較好的方案,當堆內存空間足夠時,垃圾回收機制不會回收Person對象,可以隨時重新訪問一個已有的Person對象,這和普通的強引用沒有任何區(qū)別。但當heap堆內存空間不足時,系統(tǒng)也可以回收軟引用引用的Person對象,從而提高程序運行性能,避免垃圾回收.
            當程序使用強引用時,無論系統(tǒng)堆內存如何緊張,JVM垃圾回收機制都不會回收被強引用所引用的Java對象,因此最后導致程序因內存不足而中止。但如果把強引用改為軟引用,就完成可以避免這種情況,這就是軟引用的優(yōu)勢所在.
            (3)弱引用
            弱引用與軟引用有點相似,區(qū)別在于弱引用所引用對象的生存期更短。弱引用通過WeakReference類實現,弱引用和軟引用很像,但弱引用的引用級別更低。對于只有弱引用的對象而言,當系統(tǒng)垃圾回收機制運行時,不管系統(tǒng)內存是否足夠,總會回收該對象所占用的內存。當然,并不是說當一個對象只有弱引用時,它就會立即被回收,正如那些失去引用的對象一樣,必須等到系統(tǒng)垃圾回收機制運行時才會被回收.
            總結說明:
            1.弱引用具有很大的不確定性,因為每次垃圾回收機制執(zhí)行時都會回收弱引用所引用的對象,而垃圾回收機制的運行又不受程序員的控制,因此程序獲取弱引用所引用的java對象時必須小心空指針異常,通過弱引用所獲取的java對象可能是null
            2.由于垃圾回收的不確定性,當程序希望從弱引用中取出被引用對象時,可能這個被引用對象已經被釋放了。如果程序需要使用被引用的對象,則必須重新創(chuàng)建該對象。
            (4)虛引用
            軟引用和弱引用可以單獨使用,但虛引用不能單獨使用,單獨使用虛引用沒有太大的意義。虛引用的主要作用就是跟蹤對象被垃圾回收的狀態(tài),程序可以通過檢查虛引用關聯的引用隊列中是否包含指定的虛引用,從而了解虛引用所引用的對象是否將被回收.
            引用隊列由java.lang.ref.ReferenceQueue類表示,它用于保存被回收對象的引用。當把軟引用,弱引用和引用隊列聯合使用時,系統(tǒng)回收被引用的對象之后,將會把被回收對象對應的引用添加到關聯的引用隊列中。與軟引用和弱引用不同的是,虛引用在對象被釋放之前,將把它對應的虛引用添加到關聯的隊列中,這使得可以在對象被回收之前采取行動。
            虛引用通過PhantomReference類實現,它完全類似于沒有引用。虛引用對對象本身沒有大的影響,對象甚至感覺不到虛引用的存在。如果一個對象只有一個虛引用,那它和沒有引用的效果大致相同。虛引用主要用于跟蹤對象被垃圾回收的狀態(tài),虛引用不能單獨使用,虛引用必須和隊列ReferenceQueue聯合使用.


          posted on 2013-11-15 11:12 順其自然EVO 閱讀(201) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洪泽县| 府谷县| 会同县| 晋江市| 安新县| 肇东市| 绥化市| 南充市| 台中县| 宾川县| 长宁县| 景宁| 四平市| 永城市| 枝江市| 马尔康县| 绿春县| 子洲县| 淅川县| 宁阳县| 青阳县| 荥阳市| 黑山县| 莒南县| 宝坻区| 喀喇| 新丰县| 许昌市| 特克斯县| 恩平市| 教育| 陆川县| 英超| 商城县| 海原县| 吉安县| 子洲县| 迁安市| 环江| 盱眙县| 梁山县|