JVM-可達性分析

jvm中判斷對象是否存活的方法

1、引用計數

2、可達性分析

1、什麼是引用計數?

每個對象自身持有一個計數器,每當對象被一個地方引用,計數器便+1;當引用失效時,計數器-1。當對象的計數器爲0時,該對象便是一個不被使用的對象,即“死亡”。
引用計數器實現簡單,效率高。然而難以解決對象之間相互循環引用的問題(兩個失效對象相互保存了對方的指針)。故JVM判定對象是否存活,並沒有使用引用計數器,而是使用可達性分析算法。

2、什麼是可達性分析

可達性分析算法即:有一系列“GCRoots”起點,從這些點開始向下搜索,走過的路徑稱爲“引用鏈”。若一個對象沒有任何引用鏈可到達GC Roots,那麼該對象就是不可用的,即使該對象還與其他對象相關聯。
經可達性分析算法所標記出的對象,會進行一次篩選(根據finalize方法)。若經過篩選,判定可回收,那麼就會立即回收;若判定沒有必要回收,那麼就將對象放入F-Queue隊列中,進行二次篩查。二次篩查會執行對象的finalize()方法。若對象在這個過程重新與引用鏈上的任何一個對象建立關聯,那麼該對象就會從回收集合中移除。否則,對象會被回收。

3、哪些對象可以作爲GCRoots的起點呢?

要了解這個問題首先需要了解一下JMM是怎麼回事
從JMM中不難發現Head區主要是保存實例對象的區域,那麼哪些地方會引用這些對象呢?
答案呼之欲出了,那就是其區域中含有引用對象地方,這些地方是,棧中引用的對象(包括虛擬機棧和本地方法棧),方法區中的一些靜態屬性引用的對象 ,常量引用的對象。
綜上所述,可作爲GC Roots的對象包含:
① 虛擬機棧中引用的對象
② 方法區中類靜態屬性引用的對象
③ 方法區中常量引用的對象
④ 本地方法棧中引用的對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章