java判断对象已死_Java的JVM判断对象已死的基本算法分析
jvm中有各種的垃圾收集器,每個收集器都有各自的算法。但是一切的根本都需要找到找到應該被消除的對象,理解如何找到死亡對象才是理解垃圾收集器的基礎。
01兩個基本算法
a、引用記數法:對象中加一個引用計數器,每次被引用計數器加一,引用失效減一,當減到0的時候就不會在被再引用了,就可以回收了。
優點:原理簡單,效率高。
缺點:有很多例外情況要用大量額外的處理,比如兩個對象相互引用。
b、可達性分析:通過一系列“GC Roots”的根對象為起始,根據引用關系向下搜索,搜索路徑形成引用鏈,而那些沒有在任何引用鏈上的叫做不可達對象,都是不可能被再次使用的。如下圖,紅色部分就是需要回收的。
兩種算法對比如下:
02GC Roots包含哪些
可達性分析首先要確認的是GC Roots,只有選擇合適的GC Roots才能真正的找到應該存在的對象和排除不應該存在的對象。GC Roots主要包含以下:
a、虛擬機棧中的對象,就是各個線程的方法里面的方法參數、局部變量、臨時變量。
b、方法區中類的靜態屬性引用的對象。
c、方法區中常量引用的對象,比如字符串常量池的引用。
d、本地方法棧引用的對。
e、虛擬機內部的引用,基本類型對應的class對象,常駐異常對象,系統類加載器。
f、所有被同步鎖(synchronized)持有的對象。
g、Java虛擬機內部情況的JMXBean、JVMTI中注冊的回調、本地代碼緩存。
可以把上面的大概分成幾個方面,如下圖:
GC Roots實際上就是當前JVM必須要的對象,可以分成三類。
第一類是JVM線程里面直接引用的對象,相當于正在執行的方法里面的對象,這些肯定是必須存活的。
第二類是設置的一些靜態常量,比如我們在類里面用static final修飾的一些對象,這類對象至jvm啟動到結束都會一直存在。
第三類就是JVM本身所需要的對象,這類對象肯定不能被回收。
03Java的引用
可達性分析就是根據引用來判斷的,那么Java中有哪些引用呢?一共分4類引用:
a、強引用:常見的引用賦值,垃圾收集器不回收。ObjectA a=new ObjectA();
b、軟引用:還有用,但非必須。在系統將要發生內存溢出前,把他們列為回收范圍進行二次回收,JDK1.2后SoftReference類實現。
c、弱引用:非必須,比軟引用更弱。下次垃圾收集器無論內存是否足夠,均回收。JDK1.2后WeakReference類實現。
d、虛引用:最弱引用關系,虛引用不影響對象的生存,也無法通過虛引用來取得對象實例。唯一作用是可以在垃圾收集器回收前收到一個系統通知。JDK1.2后PhantomReference類實現。
對比如下圖:
后面三個引用我們平時使用幾乎沒有,多在一些源碼中出現,依靠3個類實現:SoftReference、WeakReference、PhantomReference。在看到這三個類的時候能知道對應的含義。
04兩次標記
當一個對象被標記為不可達對象的時候并不一定是馬上被回收的。如果對象重寫了finalize()方法,并且finalize()方法還沒有被執行過(finalize()方法只會被執行一次),那么這個對象會被放入F-Queue隊列里面。會有一個Finalizer線程去執行隊列里面對象的finalize()。如果finalize()方法把這個對象重新賦值給了其他變量,就叫做逃脫成功。
垃圾收集器會對F-Queue隊列里的對象進行第二次標記,如果在上一步中成功逃脫的就會移除即將回收的集合。
對于逃脫的對象,在下次被標記成不可達對象時,就會被直接回收,因為finalize()方法已經執行過一次了。
Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!
總結
以上是生活随笔為你收集整理的java判断对象已死_Java的JVM判断对象已死的基本算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《楚乔传》星儿恢复记忆 楚乔真实身份曝光
- 下一篇: java并发数据共享机制_Java并发编