再談引用(強引用,軟引用,弱引用,虛引用)的概念,回收方法區

[size=small]
[b]再談引用[/b]
無論是通過引用計數算法判斷對象的引用數量,還是通過可達性分析算法判斷對象的引用鏈是否可達,判定對象是否存活都與“引用”有關。在JDK1.2之前,Java中的引用定義如下:如果reference類型的數據中存儲的數值代表的是另一塊內存的起始地址,就稱這塊內存代表着一個引用。這種定義很純粹,但是太過狹隘,一個對象在這種定義下自由被引用或者沒有被引用兩種狀態,對於如何描述一些食之無味,棄之可惜的對象就顯得無能爲力。
在JDK1.2以後,爲了描述這樣一類對象:當內存空間足夠時,則能保留在內存中;如果內存空間在進行垃圾收集後還是非常緊張,則可以拋棄這些對象。爲此,JDK1.2對引用的概念進行擴充,將引用分爲強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4種,這4中引用強度逐漸減弱。[list]
[*]強引用是指在程序代碼中普遍存在的,類似“Object obj = new Object()”這類的引用,只要強引用還存在,那麼垃圾收集器永遠不會回收掉被引用的對象。
[*]軟引用用來描述一些還有用但是非必須的對象。比如緩存。在系統將要發生內存溢出異常之前,垃圾收集器將會把這些對象列緊回收範圍之中進行第二次回收。如果這次回收後還是沒有足夠的內存,那麼會拋出內存溢出異常。在JDK1.2以後,提供了SoftReference類來實現軟引用。
[*]弱引用也是用來描述非必須對象的,它的強度比軟引用更弱一些,唄弱引用關聯的對象只能生存到下一次垃圾回收發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象。在JDK1.2以後,提供了WeakReference類來實現弱引用。
[*]虛引用也被稱爲幽靈引用或者幻影殷勇,它是最弱的一種引用關係。一個對象是否有虛擬用的存在,完全不會對其生存時間構成影響,也無法通過一個虛引用來取得一個對象實例。爲一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。在JDK1.2以後,提供了PhantomReference類來實現虛引用。
[/list]
[b]回收方法區[/b]
方法區也稱爲永久代,這裏的垃圾收集主要回收兩部分內容:廢棄常量和無用的類。回收廢棄常量與回收Java堆中的對象非常類似。
常量池中主要包含字面量、類(接口)、方法、字段的引用符號。
判斷常量是否可回收的條件未:沒有其他地方引用了這個字面量。
判斷類是否可以(注意,這裏僅僅是可以回收,不是必然回收)回收的條件有3個:
1、該類的實例都已經被回收,即Java堆中不存在該類的任何實例。
2、加載該類的ClassLoader已經被回收。
3、該類對應的java.lang.Class對象沒有在任何地方被引用,並且無法在任何地方通過反射訪問該類的方法。
是否對類進行回收,Hotspot虛擬機提供了-Xnoclassgc參數,-verbose:class以及-XX:+TraceClassLoading、-XX:+TraceClassUnloading查看類加載和卸載信息,其中-verbose:class和-XX:TraceClassLoading可以在Product版的虛擬機中使用,-XX:+TraceClassUnloading參數需要FastDebug版的虛擬機支持。
在大量使用反射、動態代理、cglib等bytecode框架、動態生成jsp以及osgi這類頻繁自定義ClassLoader的場景都需要虛擬機具備卸載的功能,以保證方法區(永久代)不會溢出。
[/size]
發佈了151 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章