2. GC解析-常見的面試題 ---對象可達性分析


1、JM垃圾回收的時候如何確定垃圾?是否知道什么是 GC Roots?

       1.什么是垃圾?

          簡單的說就是內存中已經不再被使用到的空間就是垃圾.

  2.要進行垃圾回收,如何判斷一個對象是否可以被回收?

          怎么判斷一個對象是否為垃圾,並且判斷這個獨享是否可以被回收,常用的就是引用計數法,枚舉根節點做可達性分析(根搜索路徑,GC root)

引用計數法:

Java中,引用和對象是有關聯的。如果要操作對象則必須用引用進行因此,很顯然一個簡單的辦法是通過引用計數來判斷一個對象是否可以回收。簡單說,給對象中添加一個引用計數器,
每當有一個地方引用它,計數器值加1每當有一個引用失效時,計數器值減1。任何時刻計數器值為零的對象就是不可能再被使用的,那么這個對象就是可回收對象
那為什么主流的Java虛擬機里面都沒有選用這種算法呢?其中最主要的原因是它很難解決對象之間相互循環引用的問題

 


 枚舉根節點做可達性分析(根搜索路徑):

case:從GC Root對象中往下查找,當查詢到對象引用不可達時才進行垃圾回收,對象可達時不進行垃圾回收。

 Java 可以做GCRoots的對象:

  1.      虛擬機棧(棧幀中的局部變量區,也叫做局部變量表
  2.      方法區中的類靜態屬性引用的對象。
  3.      方法區中常量引用的對象
  4.     本地方法棧中N( Native方法)引用的對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM