1. 程式人生 > >JVM高級特性-三、垃圾收集之判斷對象存活算法

JVM高級特性-三、垃圾收集之判斷對象存活算法

地方法 size none ava 裏的 結束 靜態屬性 概述 span

一、概述

  運行時數據區中,程序計數器、虛擬機棧、本地方法棧都是隨線程而生隨線程而滅的

  因此,他們的內存分配和回收是確定的,在方法或線程結束時就回收。而Java堆和方

  法區則是不確定的,程序運行過程中創建對象的大小是不定的,只有在程序處於運行

  期才能知道所需內存的大小

二、“存活算法”

  要判斷對象是否存活,主要有兩種算法:引用計數法和可達性分析算法

  • 引用計數法

    引用計數法就是給對象加上一個引用計數器,每當對象被 引用一次

  計數器值就加1,引用時效則減1,計數器為0則表示不會再被使用。

  • 可達性分析算法

    可達性分析算法是主流的實現,這個算法通過成為GC ROOT的節點作為根節點,

  從此根節點向下搜索,若對象到GC ROOT沒有引用鏈相連(即不可達)時,表示該

  對象不可用

    可作為GC ROOT的對象為:

      • 虛擬機棧中本地變量表裏的引用對象
      • 方法去中的類靜態屬性引用獨享
      • 方法去中的敞亮對象
      • 本地方法中的引用對象

   目前可達性分析算法已是主流算法,原因是,引用計數器算法無法解決對象互相引用的問題            

    

JVM高級特性-三、垃圾收集之判斷對象存活算法