欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

你知道JVM中GC?Root對象有哪些嗎

 更新時間:2023年01月19日 09:16:29   作者:斜陽雨陌  
這篇文章主要介紹了你知道JVM中GC?Root對象有哪些,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

JVM中GC Root對象有哪些

眾所周知,我們目前最常用的虛擬機hotspot使用可達性分析來進行垃圾回收,而可達性分析需要依賴GC Root。

下面我就來介紹下可以作為GC Root的對象。

(一)虛擬機棧中引用的對象

虛擬機棧中的引用的對象可以作為GC Root。我們程序在虛擬機的棧中執(zhí)行,每次函數(shù)調(diào)用調(diào)用都是一次入棧。在棧中包括局部變量表和操作數(shù)棧,局部變量表中的變量可能為引用類型(reference),他們引用的對象即可作為GC Root。不過隨著函數(shù)調(diào)用結(jié)束出棧,這些引用便會消失。

(二)方法區(qū)中類靜態(tài)屬性引用的對象

簡單的說就是我們在類中使用的static聲明的引用類型字段,例如:

Class Dog {
? ? private static Object tail;
}?

(三)方法區(qū)中常量引用的對象

簡單的說就是我們在類中使用final聲明的引用類型字段,例如:

Class Dog {
? ? private final Object tail;
}?

(四)本地方法棧中引用的對象

就是程序中native本地方法引用的對象。

JVM 中的 GC Roots 和可達鏈

什么是GC Root 對象?

簡單講,凡是被常量、靜態(tài)變量、全局變量、運行時方法中的變量直接引用的對象,原則上不能被GC釋放。

JVM中對內(nèi)存進行回收時,需要判斷對象是否仍在使用中,可以通過 GC Roots Tracing辨別。

GC Roots 定義:

通過一系列名為”GCRoots”的對象作為起始點,從這個節(jié)點向下搜索,搜索走過的路徑稱為ReferenceChain,當一個對象到GCRoots沒有任何ReferenceChain相連時,(圖論:這個對象不可到達),則證明這個對象不可用。

可以作為GC Root 引用點的是:

  • JavaStack中的引用的對象。
  • 方法區(qū)中靜態(tài)引用指向的對象。
  • 方法區(qū)中常量引用指向的對象。
  • Native方法中JNI引用的對象。

所謂“GC roots”,或者說tracing GC的“根集合”,就是一組必須活躍的引用。

Tracing GC的根本思路就是:給定一個集合的引用作為根出發(fā),通過引用關(guān)系遍歷對象圖,能被遍歷到的(可到達的)對象就被判定為存活,其余對象(也就是沒有被遍歷到的)就自然被判定為死亡。注意再注意:tracing GC的本質(zhì)是通過找出所有活對象來把其余空間認定為“無用”,而不是找出所有死掉的對象并回收它們占用的空間。

GC roots這組引用是tracing GC的起點。要實現(xiàn)語義正確的tracing GC,就必須要能完整枚舉出所有的GC roots,否則就可能會漏掃描應(yīng)該存活的對象,導(dǎo)致GC錯誤回收了這些被漏掃的活對象。

這就像任何遞歸定義的關(guān)系一樣,如果只定義了遞推項而不定義初始項的話,關(guān)系就無法成立——無從開始;而如果初始項定義漏了內(nèi)容的話,遞推出去也會漏內(nèi)容。

常說的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的對象,GC會收集那些不是GC roots且沒有被GC roots引用的對象。

Java 進行GC的時候會從GC root進行可達性判斷,常見的GC Root有如下:

  • 通過System Class Loader或者Boot Class Loader加載的class對象(通過自定義類加載器加載的class不一定是GC Root)
  • 處于激活狀態(tài)的線程
  • 棧中的對象
  • JNI棧中的對象
  • JNI中的全局對象
  • 正在被用于同步的各種鎖對象
  • JVM自身持有的對象,比如系統(tǒng)類加載器等。

在調(diào)查內(nèi)存泄漏原因的時候可以根據(jù)GC Root來推導(dǎo).

常用的GC算法

了解了這些,我們來看一下常用的GC算法

標記回收算法

從GC root進行遍歷,把可達對象都標記,剩下那些不可達的進行回收,這種方式需要中斷其他線程,并且可能產(chǎn)生內(nèi)存碎片

復(fù)制算法

把內(nèi)存區(qū)域分為兩塊,每次使用一塊,GC的時候把一塊中的內(nèi)容移動到另一塊中,原始內(nèi)存中的對象就可以被回收了。

標記壓縮算法

和標記回收差不多,但是在回收的時候會對可達對象進行整理,將其壓縮到內(nèi)存的一段,避免內(nèi)存碎片

分代算法

將內(nèi)存區(qū)域分代,對不同的代使用不同的回收算法,通常分為新生代,老年代,和永久帶。

新生代一般包含三個區(qū)域,Eden區(qū)和兩個Survivor區(qū),新生代一般采用復(fù)制算法

老年代一般采用標記壓縮算法.

GC Root 對象有哪些?

JVM垃圾回收的根對象的范圍有以下幾種:

(1)虛擬機(JVM)棧中引用對象

(2)方法區(qū)中的類靜態(tài)屬性引用對象

(3)方法區(qū)中常量引用的對象(final 的常量值)

(4)本地方法棧JNI的引用對象

一個對象可以屬于多個root,GC root有幾下種:

  •  Class由系統(tǒng)類加載器(system class loader)加載的對象,這些類是不能夠被回收的,他們可以以靜態(tài)字段的方式保存持有其它對象。我們需要注意的一點就是,通過用戶自定義的類加載器加載的類,除非相應(yīng)的java.lang.Class實例以其它的某種(或多種)方式成為roots,否則它們并不是roots,.
  • Thread活著的線程
  • Stack Local Java方法的local變量或參數(shù)
  • JNI Local JNI方法的local變量或參數(shù)
  • JNI Global 全局JNI引用
  • Monitor Used 用于同步的監(jiān)控對象
  • Held by JVM 用于JVM特殊目的由GC保留的對象,但實際上這個與JVM的實現(xiàn)是有關(guān)的??赡芤阎囊恍╊愋褪牵合到y(tǒng)類加載器、一些JVM知道的重要的異常類、一些用于處理異常的預(yù)分配對象以及一些自定義的類加載器等。然而,JVM并沒有為這些對象提供其它的信息,因此就只有留給分析分員去確定哪些是屬于"JVM持有"的了。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入了解java中常見的五種比較方法

    深入了解java中常見的五種比較方法

    在程序的世界里面,比較也是必不可少的,通過比較可以確定對象的相對順序、相等性以及其他比較條件,下面我們就來深入了解一下java中常見的五種比較方法吧
    2023-12-12
  • IDEA 2020.1.2 安裝教程附破解教程詳解

    IDEA 2020.1.2 安裝教程附破解教程詳解

    這篇文章主要介紹了IDEA 2020.1.2 安裝教程附帶破解教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • spring security自定義認證登錄的全過程記錄

    spring security自定義認證登錄的全過程記錄

    這篇文章主要給大家介紹了關(guān)于spring security自定義認證登錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java實現(xiàn)定時讀取json文件里內(nèi)容的示例代碼

    Java實現(xiàn)定時讀取json文件里內(nèi)容的示例代碼

    有時候我們會需要定時來讀取JSON配置文件里的內(nèi)容,來執(zhí)行一些業(yè)務(wù)邏輯上的操作,本文就介紹了Java實現(xiàn)定時讀取json文件里內(nèi)容的示例代碼,感興趣的可以了解一下
    2023-08-08
  • Java 中普通代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊區(qū)別及代碼示例

    Java 中普通代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊區(qū)別及代碼示例

    這篇文章主要介紹了Java 中普通代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊區(qū)別及代碼示例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • JAVA十大排序算法之快速排序詳解

    JAVA十大排序算法之快速排序詳解

    這篇文章主要介紹了java中的快速排序,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • java POI 如何實現(xiàn)Excel單元格內(nèi)容換行

    java POI 如何實現(xiàn)Excel單元格內(nèi)容換行

    這篇文章主要介紹了java POI 如何實現(xiàn)Excel單元格內(nèi)容換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送

    SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送

    這篇文章主要介紹了SpringBoot+netty-socketio實現(xiàn)服務(wù)器端消息推送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java?Semaphore共享鎖實現(xiàn)原理解析

    java?Semaphore共享鎖實現(xiàn)原理解析

    這篇文章主要為大家介紹了Semaphore共享鎖實現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • maven將項目打包上傳到nexus私服的詳細教程

    maven將項目打包上傳到nexus私服的詳細教程

    這篇文章主要介紹了maven將項目打包上傳到nexus私服,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-07-07

最新評論