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

淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程

 更新時(shí)間:2017年10月10日 11:02:12   作者:馬克吐溫  
這篇文章主要介紹了淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程的相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。

一、對(duì)象的標(biāo)記

1、什么是標(biāo)記?怎么標(biāo)記? 

        第一個(gè)問(wèn)題相信大家都知道,標(biāo)記就是對(duì)一些已死的對(duì)象打上記號(hào),方便垃圾收集器的清理。 至于怎么標(biāo)記,一般有兩種方法:引用計(jì)數(shù)和可達(dá)性分析。

引用計(jì)數(shù)實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,就是給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí)就加1,引用失效時(shí)就減1,當(dāng)計(jì)數(shù)器為0的時(shí)候就標(biāo)記為可回收。這種判斷效率很高,但是很多主流的虛擬機(jī)并沒(méi)有采用這種方法,主要是因?yàn)樗茈y解決幾個(gè)對(duì)象之間循環(huán)引用的問(wèn)題,雖然不怎么用了,但還是值得我們學(xué)習(xí)!

public class Test {
private Object obj;
Public static void main(){
Test t1=new Test();
Test t2=new Test();
t1.obj=t2;
t2.obj=t1;
t1=null;
t2=null;
//如果對(duì)象在這行發(fā)生gc,那么t1和t2對(duì)象是否能被回收
System.gc();
}
}

 可達(dá)性分析的基本思路就是:通過(guò)將一些稱(chēng)為"GC Roots"的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開(kāi)始搜索,搜索和該節(jié)點(diǎn)發(fā)生直接或者間接引用關(guān)系的對(duì)象,將這些對(duì)象以鏈的形式組合起來(lái),形成一張“關(guān)系網(wǎng)”,又叫做引用鏈。最后垃圾收集器就回收一些不在這張關(guān)系網(wǎng)上的對(duì)象。如圖:

連接GC Roots對(duì)象的object是確定還存活的對(duì)象,而右邊的die obj由于和GCROOTS沒(méi)有關(guān)系,所以會(huì)標(biāo)記為可回收的對(duì)象。目前主流的商用虛擬機(jī)用的都是類(lèi)似的方法。那什么對(duì)象才能作為“GC Roots”呢?在java中,有四種對(duì)象可以作為“GC Roots”

        1:棧幀(第一章的名詞)中的引用對(duì)象。(棧中的)

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

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

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

二、對(duì)象的二次回收

說(shuō)過(guò)對(duì)象的標(biāo)記,但是不是被標(biāo)記了就肯定會(huì)被回收呢?不知道小伙伴們記不記得Object類(lèi)有一個(gè)finalize()方法,所有類(lèi)都繼承了Object類(lèi),因此也默認(rèn)實(shí)現(xiàn)了這個(gè)方法。

finalize的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過(guò)程中,才會(huì)真正回收對(duì)象的內(nèi)存.所以如果使用finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除或清掃工作.
finalize()在什么時(shí)候被調(diào)用?

有三種情況

1.所有對(duì)象被Garbage Collection時(shí)自動(dòng)調(diào)用,比如運(yùn)行System.gc()的時(shí)候.

2.程序退出時(shí)為每個(gè)對(duì)象調(diào)用一次finalize方法。

3.顯式的調(diào)用finalize方法

這個(gè)方法的用途就是:在該對(duì)象被回收之前,該對(duì)象的finalize()方法會(huì)被調(diào)用。這里的回收之前指的就是被標(biāo)記之后,問(wèn)題就出在這里,有沒(méi)有一種情況就是原本一個(gè)對(duì)象開(kāi)始不再上一章所講的“關(guān)系網(wǎng)”(引用鏈)中,但是當(dāng)開(kāi)發(fā)者重寫(xiě)了finalize()后,并且將該對(duì)象重新加入到了“關(guān)系網(wǎng)”中,也就是說(shuō)該對(duì)象對(duì)我們還有用,不應(yīng)該被回收,但是已經(jīng)被標(biāo)記啦,怎么辦呢?

        針對(duì)這個(gè)問(wèn)題,虛擬機(jī)的做法是進(jìn)行兩次標(biāo)記,即第一次標(biāo)記不在“關(guān)系網(wǎng)”中的對(duì)象。第二次的話(huà)就要先判斷該對(duì)象有沒(méi)有實(shí)現(xiàn)finalize()方法了,如果沒(méi)有實(shí)現(xiàn)就直接判斷該對(duì)象可回收;如果實(shí)現(xiàn)了就會(huì)先放在一個(gè)隊(duì)列中,并由虛擬機(jī)建立的一個(gè)低優(yōu)先級(jí)的線(xiàn)程去執(zhí)行它,隨后就會(huì)進(jìn)行第二次的小規(guī)模標(biāo)記,在這次被標(biāo)記的對(duì)象就會(huì)真正的被回收了。

總結(jié):簡(jiǎn)單說(shuō),對(duì)象先進(jìn)行第一次標(biāo)記,在下一次GC之前會(huì)執(zhí)行對(duì)象的finalize()方法。在執(zhí)行finalize()方法的時(shí)候判斷對(duì)象是否實(shí)現(xiàn)了finalize()方法,沒(méi)有實(shí)現(xiàn)直接清除;實(shí)現(xiàn)了,將對(duì)象放在一個(gè)隊(duì)列中執(zhí)行finalize方法,進(jìn)行第二次標(biāo)記
在java根搜索算法中判斷對(duì)象的可達(dá)性,對(duì)于不可達(dá)的對(duì)象,也并不一定是必須清理。這個(gè)時(shí)候有一個(gè)緩刑期,真正的判斷一個(gè)對(duì)象死亡,至少要經(jīng)過(guò)倆次標(biāo)記過(guò)程:如果對(duì)象在進(jìn)行根搜索后發(fā)現(xiàn)沒(méi)有與GC roots相關(guān)聯(lián)的引用鏈,那他將會(huì)第一次標(biāo)記并且進(jìn)行一次篩選,篩選的條件是此對(duì)象是否有必要執(zhí)行finalize()方法,當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過(guò),虛擬機(jī)將這倆種情況都視為“沒(méi)有必要執(zhí)行”。

即當(dāng)一個(gè)對(duì)象重寫(xiě)了finalize()方法的時(shí)候,這個(gè)對(duì)象被判定為有必要執(zhí)行finalize()方法,那么這個(gè)對(duì)象被放置在F-Queue隊(duì)列之中,并在稍后由一條由虛擬機(jī)自動(dòng)建立的、低優(yōu)先級(jí)的Finalizer線(xiàn)程去執(zhí)行。這里所謂的執(zhí)行是指虛擬機(jī)會(huì)出發(fā)這個(gè)方法,但不承諾會(huì)等待它運(yùn)行結(jié)束。這樣做的原因:如果一個(gè)對(duì)象在finalize()方法中執(zhí)行緩慢,或者發(fā)生了死循環(huán)(極端的情況下),將可能會(huì)導(dǎo)致F-Queue隊(duì)列中的其他對(duì)象永久處于等待狀態(tài),甚至導(dǎo)致整個(gè)內(nèi)存回收系統(tǒng)崩潰。finalize()方法是對(duì)象逃脫死亡命運(yùn)的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次小規(guī)模的標(biāo)記,如果對(duì)象要在finalize()中成功拯救自己----只要重新與引用鏈上的任何建立關(guān)聯(lián)即可,那么在第二次標(biāo)記時(shí)它將會(huì)被移出“即將回收”的集合;如果對(duì)象這時(shí)候沒(méi)有逃脫,就會(huì)被回收。代碼示例:參考《深入理解java虛擬機(jī)》對(duì)應(yīng)章節(jié)

總結(jié)

以上就是本文關(guān)于淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Java有所幫助。感興趣的朋友可以參閱:Java虛擬機(jī)裝載和初始化一個(gè)class類(lèi)代碼解析 、Java編程思想對(duì)象的容納實(shí)例詳解、Java系統(tǒng)的高并發(fā)解決方法詳解等,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。

相關(guān)文章

  • SpringBoot整合Mybatis Plus實(shí)現(xiàn)基本CRUD的示例代碼

    SpringBoot整合Mybatis Plus實(shí)現(xiàn)基本CRUD的示例代碼

    Mybatis Plus是在Mybatis的基礎(chǔ)上的增強(qiáng),使得我們對(duì)一些基本的CRUD使用起來(lái)更方便,本文主要介紹了SpringBoot整合Mybatis Plus實(shí)現(xiàn)基本CRUD的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • 一文教你搞定Java Optional類(lèi)判空操作

    一文教你搞定Java Optional類(lèi)判空操作

    有時(shí)項(xiàng)目組內(nèi)做code review,會(huì)充斥著大量的、原始的、丑陋的判空語(yǔ)句。讓整體的代碼顯得十分的臃腫龐大丑陋,那么怎么辦呢?利用Optional這個(gè)jdk8中引入的類(lèi)就可以?xún)?yōu)雅的處理,現(xiàn)在我們來(lái)詳細(xì)講解下這個(gè)類(lèi)的使用和源碼
    2022-10-10
  • 踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式

    踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式

    這篇文章主要介紹了踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺析java修飾符訪(fǎng)問(wèn)權(quán)限(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    淺析java修飾符訪(fǎng)問(wèn)權(quán)限(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java有四種訪(fǎng)問(wèn)權(quán)限,其中三種有訪(fǎng)問(wèn)權(quán)限修飾符,分別為private,public和protected,還有一種不帶任何修飾符,下面通過(guò)本文給大家簡(jiǎn)單介紹下java修飾符訪(fǎng)問(wèn)權(quán)限相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • SpringBoot開(kāi)發(fā)中使用DTO層的方法示例

    SpringBoot開(kāi)發(fā)中使用DTO層的方法示例

    DTO層是在應(yīng)用程序的業(yè)務(wù)邏輯層和數(shù)據(jù)訪(fǎng)問(wèn)層之間引入的一個(gè)中間層,用于在不同層之間傳輸數(shù)據(jù),本文主要介紹了SpringBoot開(kāi)發(fā)中使用DTO層,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Java dom4j生成與解析XML案例詳解

    Java dom4j生成與解析XML案例詳解

    這篇文章主要介紹了Java dom4j生成與解析XML案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot配置攔截器方式實(shí)例代碼

    SpringBoot配置攔截器方式實(shí)例代碼

    在本篇文章里小編給大家分享的是關(guān)于SpringBoot配置攔截器方式實(shí)例代碼,有需要的朋友們可以參考下。
    2020-04-04
  • RocketMQ?Broker消息如何刷盤(pán)源碼解析

    RocketMQ?Broker消息如何刷盤(pán)源碼解析

    這篇文章主要為大家介紹了RocketMQ?Broker消息如何刷盤(pán)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解SpringBoot的jar為什么可以直接運(yùn)行

    詳解SpringBoot的jar為什么可以直接運(yùn)行

    SpringBoot提供了一個(gè)插件spring-boot-maven-plugin用于把程序打包成一個(gè)可執(zhí)行的jar包,本文給大家介紹了為什么SpringBoot的jar可以直接運(yùn)行,文中有相關(guān)的代碼示例供大家參考,感興趣的朋友可以參考下
    2024-02-02
  • SpringBoot詳細(xì)講解yaml配置文件的用法

    SpringBoot詳細(xì)講解yaml配置文件的用法

    這篇文章主要介紹了SpringBoot中的yaml配置文件問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

奉化市| 阜南县| 同德县| 万盛区| 卓尼县| 双鸭山市| 仁化县| 泽州县| 肥乡县| 阿克| 金坛市| 建平县| 天气| 颍上县| 阜新市| 加查县| 年辖:市辖区| 枞阳县| 汉沽区| 金川县| 盐津县| 塔河县| 延川县| 元阳县| 明水县| 黔西县| 馆陶县| 正阳县| 云和县| 沐川县| 郓城县| 扎囊县| 饶阳县| 周宁县| 仁怀市| 马边| 莱西市| 陇川县| 财经| 江川县| 斗六市|