最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

你知道JVM中GC?Root對(duì)象有哪些嗎

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

JVM中GC Root對(duì)象有哪些

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

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

(一)虛擬機(jī)棧中引用的對(duì)象

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

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

簡(jiǎn)單的說就是我們?cè)陬愔惺褂玫膕tatic聲明的引用類型字段,例如:

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

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

簡(jiǎn)單的說就是我們?cè)陬愔惺褂胒inal聲明的引用類型字段,例如:

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

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

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

JVM 中的 GC Roots 和可達(dá)鏈

什么是GC Root 對(duì)象?

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

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

GC Roots 定義:

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

可以作為GC Root 引用點(diǎn)的是:

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

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

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

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

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

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

Java 進(jìn)行GC的時(shí)候會(huì)從GC root進(jìn)行可達(dá)性判斷,常見的GC Root有如下:

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

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

常用的GC算法

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

標(biāo)記回收算法

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

復(fù)制算法

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

標(biāo)記壓縮算法

和標(biāo)記回收差不多,但是在回收的時(shí)候會(huì)對(duì)可達(dá)對(duì)象進(jìn)行整理,將其壓縮到內(nèi)存的一段,避免內(nèi)存碎片

分代算法

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

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

老年代一般采用標(biāo)記壓縮算法.

GC Root 對(duì)象有哪些?

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

(1)虛擬機(jī)(JVM)棧中引用對(duì)象

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

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

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

一個(gè)對(duì)象可以屬于多個(gè)root,GC root有幾下種:

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

總結(jié)

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

相關(guān)文章

  • Java中Iterator迭代器的使用詳解

    Java中Iterator迭代器的使用詳解

    在程序開發(fā)中,經(jīng)常需要遍歷集合中的所有元素。針對(duì)這種需求,JDK專門提供了一個(gè)接口java.util.Iterator。本文就來詳細(xì)說說Iterator迭代器的使用,感興趣的可以了解一下
    2022-10-10
  • Servlet方法生命周期及執(zhí)行原理詳解

    Servlet方法生命周期及執(zhí)行原理詳解

    運(yùn)行在服務(wù)器端的小程序,Servlet就是一個(gè)接口,定義了Java類被瀏覽器訪問到(tomcat識(shí)別)的規(guī)則,將來我們自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法
    2021-09-09
  • Java中HashSet和LinkedHashSet詳解

    Java中HashSet和LinkedHashSet詳解

    這篇文章主要介紹了Java中HashSet和LinkedHashSet詳解,   HashSet是Set接口的子類,其內(nèi)部采用了HashMap作為數(shù)據(jù)存儲(chǔ),HashSet其實(shí)就是在操作HashMap的key,HashSet是無序存儲(chǔ)的,不能保證元素的順序;HashSet并沒有進(jìn)行同步處理,因此是線程不安全的,需要的朋友可以參考下
    2023-09-09
  • Spring Boot Admin實(shí)踐詳解

    Spring Boot Admin實(shí)踐詳解

    在本篇文章里小編給大家整理了關(guān)于Spring Boot Admin實(shí)踐的相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • 詳解Java SpringAOP切面類

    詳解Java SpringAOP切面類

    這篇文章主要為大家介紹了Java SpringAOP的切面類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Java?中導(dǎo)入excel時(shí)使用?trim()?無法去除空格的問題解決方案

    Java?中導(dǎo)入excel時(shí)使用?trim()?無法去除空格的問題解決方案

    這篇文章主要介紹了Java中導(dǎo)入excel時(shí)使用trim()無法去除空格的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java獲取登錄用戶的IP地址示例代碼

    Java獲取登錄用戶的IP地址示例代碼

    在開發(fā)中我們經(jīng)常需要獲取用戶IP地址,通過地址來實(shí)現(xiàn)一些功能,下面這篇文章主要給大家介紹了關(guān)于Java獲取登錄用戶的IP地址的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • spring boot的maven配置依賴詳解

    spring boot的maven配置依賴詳解

    本篇文章主要介紹了spring boot的maven配置依賴詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • springboot2.6.7集成springfox3.0.0的示例代碼

    springboot2.6.7集成springfox3.0.0的示例代碼

    這篇文章主要介紹了springboot2.6.7集成springfox3.0.0的示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • jar包手動(dòng)添加到本地maven倉庫的步驟詳解

    jar包手動(dòng)添加到本地maven倉庫的步驟詳解

    在寫程序的過程中,有時(shí)候會(huì)遇到私服里沒有需要的jar包的情況,這時(shí)候我們就可以手動(dòng)導(dǎo)入jar包到本地倉庫進(jìn)行使用,下面這篇文章主要給大家介紹了關(guān)于jar包手動(dòng)添加到本地maven倉庫的相關(guān)資料,需要的朋友可以參考下
    2022-08-08

最新評(píng)論

浦北县| 新巴尔虎左旗| 宁明县| 彭泽县| 枣庄市| 林周县| 泗洪县| 霞浦县| 金华市| 大悟县| 安福县| 安泽县| 张家川| 卢龙县| 玛纳斯县| 凭祥市| 高唐县| 泰宁县| 利辛县| 根河市| 云南省| 遂川县| 高尔夫| 富宁县| 商丘市| 珲春市| 威宁| 蕉岭县| 商河县| 花莲县| 昭平县| 塘沽区| 南城县| 长宁县| 芮城县| 通城县| 祁连县| 阳原县| 东阳市| 临澧县| 河北区|