JVM之GCRoots詳解
目錄
面試題引子
什么是垃圾
判斷對象是否可以被回收之引用計數法
判斷對象是否可以被回收之枚舉根節點可達性分析
Java中可以作為GC Roots的對象
1. 面試題引子
一面:GC Roots如何確定?哪些對象可以作為GC Roots?
2. 什么是垃圾
1.簡單說就是內存中已經不再被使用到的空間就是垃圾
3. 判斷對象是否可以被回收之引用計數法
Java中,引用和對象是有關聯的。如果要操作對象則必須用引用進行。
因此,很顯然一個簡單的辦法是通過引用計數來判斷一個對象是否可以回收。簡單說,給對象中添加一個引用計數器,每當有一個地方引用它,計數器值加1,每當有一個引用失效時,計數器值減1。
任何時刻計數器值為零的對象就是不可能再被使用的,那么這個對象就是可回收對象。
那為什么主流的Java虛擬機里面都沒有選用這種算法呢?其中最主要的原因是它很難解決對象之間相互循環引用的問題。
4. 判斷對象是否可以被回收之枚舉根節點可達性分析
為了解決引用計數法的循環引用問題,Java使用了可達性分析的方法。
所謂"GCroots,或者說tracingGC的“根集合”就是一組必須活躍的引用。
基本思路就是通過一系列名為”GCRoots”的對象作為起始點,從這個被稱為GC Roots的對象開始向下搜索,如果一個對象到GCRoots沒有任何引用鏈相連時,則說明此對象不可用。也即給定一個集合的引用作為根出發,通過引用關系遍歷對象圖,能被遍歷到的(可到達的)對象就被判定為存活,沒有被遍歷到的就自然被判定為死亡。
5. Java中可以作為GC Roots的對象
虛擬機(棧幀中的本地變量表)中引用的對象
方法區中類靜態屬性引用的對象
方法區中常量引用的對象
本地方法棧中JNI(即一般說的native方法)中引用的對象
引用地址https://blog.csdn.net/weixin_41910694/article/details/90706652