標籤:jvm 虛擬機器 根搜尋演算法
JVM管理的堆記憶體中,幾乎存放了所有的對象執行個體,如果一個對象已經使用完畢(沒有任何引用指向它),那麼,該對象所佔用的記憶體應該被回收利用,而這些工作就是JVM垃圾收集器的工作
垃圾收集器在對堆記憶體進行回收之前,第一件事情就是要確定哪些對象還“存活”,哪些已經“死去”,其記憶體將要被回收,下面就來講——根搜尋演算法
在講根搜尋演算法之前,因為一個對象在沒有任何引用指向它的時候,其所佔記憶體才具備回收添加,那我們先來講講什麼事引用
傳統意義的引用:如果reference類型的資料中儲存的資料代表的是另一塊記憶體的起始地址,就稱這塊記憶體代表著一個引用
引用的新概念:引用分為強引用、軟引用、弱引用、虛引用,這四種引用強度依次逐漸減弱
1、強引用:強引用就是指程式碼中普遍存在的,類似 Object a = new Object() 這類的引用,只要引用還存在,垃圾收集器永遠不會回收掉該引用對象所佔記憶體
2、軟引用:軟引用用來描述一些還有用,但並非必需的對象。對於軟引用關聯著的對象,在記憶體不足,將要發生記憶體溢出異常之前,將會把這些對象列入回收範圍之中並進行第二次回收。
3、弱引用:用來描述非必需對象,強度比軟引用更弱一些,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前,當垃圾收集器工作時,無論當前記憶體時候足夠,都將其回收。
4、虛引用:它是最弱的一種參考關聯性。一個對象是否有虛引用存在,完全不會對其存留時間構成影響,也無法通過虛引用來取得對象執行個體。它的唯一目的就是希望能在這個對象被收集器回收時收到一個系統通知。
那麼我們來說說根搜尋演算法,判斷一個對象是否具備被回收的條件
這個演算法的基本思路就是通過一系列的名為”GC Roots“的對象作為起始點,從這些節點開始向下搜尋,搜尋搜走過的路徑為引用鏈,當一個對象到GC Roots沒有任何引用鏈相串連時,則證明此對象是停用,不可達的,應該被回收。示:
在Java語言裡,可作為GC Roots的對象包括下面幾種:
虛擬機器棧(棧幀中的本地變數表)中的引用的對象。
方法區中的類靜態屬性引用的對象。
方法區中的常量引用的對象。
本地方法棧中JNI(即一般說的Native方法)的引用的對象。
Java虛擬機器如何判斷對象已死?(哪些記憶體需要回收)