1. 程式人生 > >Java中gcRoot和引用類型

Java中gcRoot和引用類型

而不是 VM 部分 強引用 回收 包含 被調用 就會 如何

看到一個老問題,Java是如何判定回收哪些對象的?

答:從gcRoot根搜索不可達,且標記清理一次之後仍沒有被復活的對象,會被認定為垃圾對象進行清理。註意在Java中沒有對象的作用域,只有對象的引用的作用域。Java垃圾回收沒有采用引用計數算法,因為它不好解決循環引用問題。Java垃圾算法實際上是標記出那些對象是被引用在用的,其它沒被標記的就是沒用的可以回收,而不是直接找出哪些對象是沒用的。

那麽,哪些對象可以作為gcRoot呢?

它其實是一組根引用,主要包括虛擬機棧中的局部變量表(實際就是所有正在被調用的方法等參數局部變量等),類的靜態屬性引用,常量對象引用,本地方法棧中對象引用。實際上Java垃圾回收主要是針對堆內存的,這些引用則來自於JVM運行時數據區的其它幾部分:虛擬機棧,本地方法區,方法區。

Java中引用類型包含哪幾類,有什麽用?

最常用到的是強引用,只有這種引用存在,垃圾回收時就不會清理它指向的對象。其次是軟引用,只有在垃圾回收內存空間不足時才會回收這類引用指向的對象,多用在緩存對象中。再其次是弱引用,只要發生垃圾回收就會被回收。最後是虛引用,是引用關系最弱的一種。

Java中gcRoot和引用類型