回覆列表
  • 1 # 影蹤share

    判定一個物件是否可以被回收,需要看是否還持有對這個物件的引用。如果沒有引用指向這個物件,那這個物件就不能被呼叫方法,取值,也就失去存在的意義了。那引用又怎麼判斷?可以去了解一下gc root的概念,方法中宣告的區域性變數引用就是gc root的一種。被gc root引用的物件都不會被回收。

  • 2 # 技術很有趣

    首先明確物件(引用)型別:

    1 軟引用 SoftReference有些用,但是並非必需,用軟引用關聯的物件,系統將要發生OOM(out of memory)之前,這些物件就會被回收。2 弱引用3 虛引用 PhantomReference

    最弱,被垃圾回收的時候會收到一個通知。

    4 強引用

    new建立。軟引用、弱引用在jdk1.2才有。一般使用強引用,記憶體不夠情況例外。軟引用(SoftReference)和弱引用 (WeakReference),有時候做快取使用。

    如何判斷物件是否可以被回收?

    方法一、引用計數法

    顧名思義,計算物件被引用的次數。但是引用計數法已經落後了,可達性分析能夠解決互相引用的問題(兩種方法都是基於強引用)。

    方法二、可達性分析

    可達性指GC Root能否找到某一物件,如果不能該物件可大致(不絕對,後面會講)認為能夠被回收。

    以下物件可以作為GC Root:

    注意,不需要死記硬背。可以這麼思考:Java中變數總共四類——區域性變數、靜態變數 、常量、成員變數。方法區中常量引用的物件即區域性變數;而虛擬機器棧和本地方法棧是執行緒執行時建立的,裡面引用的物件需要被使用,不能被回收。

    不可達一定會被回收嗎?物件不可達(第一次標記),而且沒有在方法finalize()重新建立引用鏈條(第二次標記)的情況下,將會被回收。使用super.finalize()可以將某一物件挽回。

  • 中秋節和大豐收的關聯?
  • 32的鍍鋅管跟ppr管怎樣連線,需要什麼配件?ppr管徑需要多?