Java虛擬機器如何判斷對象已死?(哪些記憶體需要回收)

來源:互聯網
上載者:User

標籤:jvm   虛擬機器   根搜尋演算法   

JVM管理的堆記憶體中,幾乎存放了所有的對象執行個體,如果一個對象已經使用完畢(沒有任何引用指向它),那麼,該對象所佔用的記憶體應該被回收利用,而這些工作就是JVM垃圾收集器的工作

垃圾收集器在對堆記憶體進行回收之前,第一件事情就是要確定哪些對象還“存活”,哪些已經“死去”,其記憶體將要被回收,下面就來講——根搜尋演算法


在講根搜尋演算法之前,因為一個對象在沒有任何引用指向它的時候,其所佔記憶體才具備回收添加,那我們先來講講什麼事引用

傳統意義的引用:如果reference類型的資料中儲存的資料代表的是另一塊記憶體的起始地址,就稱這塊記憶體代表著一個引用

引用的新概念:引用分為強引用、軟引用、弱引用、虛引用,這四種引用強度依次逐漸減弱

1、強引用:強引用就是指程式碼中普遍存在的,類似 Object a = new Object() 這類的引用,只要引用還存在,垃圾收集器永遠不會回收掉該引用對象所佔記憶體

2、軟引用:軟引用用來描述一些還有用,但並非必需的對象。對於軟引用關聯著的對象,在記憶體不足,將要發生記憶體溢出異常之前,將會把這些對象列入回收範圍之中並進行第二次回收。

3、弱引用:用來描述非必需對象,強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前,當垃圾收集器工作時,無論當前記憶體時候足夠,都將其回收。

4、虛引用:它是最弱的一種參考關聯性。一個對象是否有虛引用存在,完全不會對其存留時間構成影響,也無法通過虛引用來取得對象執行個體。它的唯一目的就是希望能在這個對象被收集器回收時收到一個系統通知。


那麼我們來說說根搜尋演算法,判斷一個對象是否具備被回收的條件

這個演算法的基本思路就是通過一系列的名為”GC Roots“的對象作為起始點,從這些節點開始向下搜尋,搜尋搜走過的路徑為引用鏈,當一個對象到GC Roots沒有任何引用鏈相串連時,則證明此對象是停用,不可達的,應該被回收。示:

在Java語言裡,可作為GC Roots的對象包括下面幾種:

虛擬機器棧(棧幀中的本地變數表)中的引用的對象。

方法區中的類靜態屬性引用的對象。

方法區中的常量引用的對象。

本地方法棧中JNI(即一般說的Native方法)的引用的對象。



Java虛擬機器如何判斷對象已死?(哪些記憶體需要回收)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.