国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

06-JVM對(duì)象內(nèi)存回收機(jī)制深度剖析

這篇具有很好參考價(jià)值的文章主要介紹了06-JVM對(duì)象內(nèi)存回收機(jī)制深度剖析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

上一篇:05-JVM內(nèi)存分配機(jī)制深度剖析

堆中幾乎放著所有的對(duì)象實(shí)例,對(duì)堆垃圾回收前的第一步就是要判斷哪些對(duì)象已經(jīng)死亡(即不能再被任何途徑使用的對(duì)象)。

1.引用計(jì)數(shù)法

給對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它,計(jì)數(shù)器就加1;當(dāng)引用失效,計(jì)數(shù)器就減1;任何時(shí)候計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。

這個(gè)方法實(shí)現(xiàn)簡(jiǎn)單,效率高,但是目前主流的虛擬機(jī)中并沒(méi)有選擇這個(gè)算法來(lái)管理內(nèi)存,其最主要的原因是它很難解決對(duì)象之間相互循環(huán)引用的問(wèn)題。 所謂對(duì)象之間的相互引用問(wèn)題,如下面代碼所示:除了對(duì)象objA 和 objB 相互引用著對(duì)方之外,這兩個(gè)對(duì)象之間再無(wú)任何引用。但是他們因?yàn)榛ハ嘁脤?duì)方,導(dǎo)致它們的引用計(jì)數(shù)器都不為0,于是引用計(jì)數(shù)算法無(wú)法通知 GC 回收器回收他們。

public class ReferenceCountingGc {
   Object instance = null;

   public static void main(String[] args) {
      ReferenceCountingGc objA = new ReferenceCountingGc();
      ReferenceCountingGc objB = new ReferenceCountingGc();
      objA.instance = objB;
      objB.instance = objA;
      objA = null;
      objB = null;
   }
}

2.可達(dá)性分析算法

將“GC Roots” 對(duì)象作為起點(diǎn),從這些節(jié)點(diǎn)開(kāi)始向下搜索引用的對(duì)象,找到的對(duì)象都標(biāo)記為非垃圾對(duì)象,其余未標(biāo)記的對(duì)象都是垃圾對(duì)象
GC Roots根節(jié)點(diǎn):線(xiàn)程棧的本地變量、靜態(tài)變量、本地方法棧的變量等等
06-JVM對(duì)象內(nèi)存回收機(jī)制深度剖析,性能調(diào)優(yōu)-JVM,jvm,java,開(kāi)發(fā)語(yǔ)言

3.常見(jiàn)引用類(lèi)型

java的引用類(lèi)型一般分為四種:強(qiáng)引用、軟引用、弱引用、虛引用
**強(qiáng)引用:**普通的變量引用

public static User user = new User();

**軟引用:**將對(duì)象用SoftReference軟引用類(lèi)型的對(duì)象包裹,正常情況不會(huì)被回收,但是GC做完后發(fā)現(xiàn)釋放不出空間存放新的對(duì)象,則會(huì)把這些軟引用的對(duì)象回收掉。軟引用可用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存。

public static SoftReference<User> user = new SoftReference<User>(new User());

軟引用在實(shí)際中有重要的應(yīng)用,例如瀏覽器的后退按鈕。按后退時(shí),這個(gè)后退時(shí)顯示的網(wǎng)頁(yè)內(nèi)容是重新進(jìn)行請(qǐng)求還是從緩存中取出呢?這就要看具體的實(shí)現(xiàn)策略了。
  1. 如果一個(gè)網(wǎng)頁(yè)在瀏覽結(jié)束時(shí)就進(jìn)行內(nèi)容的回收,則按后退查看前面瀏覽過(guò)的頁(yè)面時(shí),需要重新構(gòu)建
  2. 如果將瀏覽過(guò)的網(wǎng)頁(yè)存儲(chǔ)到內(nèi)存中會(huì)造成內(nèi)存的大量浪費(fèi),甚至?xí)斐蓛?nèi)存溢出

弱引用: 將對(duì)象用WeakReference軟引用類(lèi)型的對(duì)象包裹,弱引用跟沒(méi)引用差不多,GC會(huì)直接回收掉,很少用

public static WeakReference<User> user = new WeakReference<User>(new User());

虛引用: 虛引用也稱(chēng)為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系,幾乎不用

4.finalize()方法最終判定對(duì)象是否存活

即使在可達(dá)性分析算法中不可達(dá)的對(duì)象,也并非是“非死不可”的,這時(shí)候它們暫時(shí)處于“緩刑”階段,要真正宣告一個(gè)對(duì)象死亡,至少要經(jīng)歷再次標(biāo)記過(guò)程。
標(biāo)記的前提是對(duì)象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒(méi)有與GC Roots相連接的引用鏈。

  1. 第一次標(biāo)記并進(jìn)行一次篩選。
    篩選的條件是此對(duì)象是否有必要執(zhí)行finalize()方法。
    當(dāng)對(duì)象沒(méi)有覆蓋finalize方法,對(duì)象將直接被回收。
  2. 第二次標(biāo)記
    如果這個(gè)對(duì)象覆蓋了finalize方法,finalize方法是對(duì)象脫逃死亡命運(yùn)的最后一次機(jī)會(huì),如果對(duì)象要在finalize()中成功拯救自己,只要重新與引用鏈上的任何的一個(gè)對(duì)象建立關(guān)聯(lián)即可,譬如把自己賦值給某個(gè)類(lèi)變量或?qū)ο蟮某蓡T變量,那在第二次標(biāo)記時(shí)它將移除出“即將回收”的集合。如果對(duì)象這時(shí)候還沒(méi)逃脫,那基本上它就真的被回收了。
    注意:一個(gè)對(duì)象的finalize()方法只會(huì)被執(zhí)行一次,也就是說(shuō)通過(guò)調(diào)用finalize方法自我救命的機(jī)會(huì)就一次。

示例代碼:

public class OOMTest {

   public static void main(String[] args) {
      List<Object> list = new ArrayList<>();
      int i = 0;
      int j = 0;
      while (true) {
         list.add(new User(i++, UUID.randomUUID().toString()));
         new User(j--, UUID.randomUUID().toString());
      }
   }
}


//User類(lèi)需要重寫(xiě)finalize方法
@Override
protected void finalize() throws Throwable {
    OOMTest.list.add(this);
    System.out.println("關(guān)閉資源,userid=" + id + "即將被回收");
}

finalize()方法的運(yùn)行代價(jià)高昂, 不確定性大, 無(wú)法保證各個(gè)對(duì)象的調(diào)用順序, 如今已被官方明確聲明為不推薦使用的語(yǔ)法。 有些資料描述它適合做“關(guān)閉外部資源”之類(lèi)的清理性工作, 這完全是對(duì)finalize()方法用途的一種自我安慰。 finalize()能做的所有工作, 使用try-finally或者其他方式都可以做得更好、更及時(shí), 所以建議大家完全可以忘掉Java語(yǔ)言里面的這個(gè)方法。

5.如何判斷一個(gè)類(lèi)是無(wú)用的類(lèi)

方法區(qū)主要回收的是無(wú)用的類(lèi),那么如何判斷一個(gè)類(lèi)是無(wú)用的類(lèi)呢?
類(lèi)需要同時(shí)滿(mǎn)足下面3個(gè)條件才能算是 “無(wú)用的類(lèi)” :文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-704559.html

  • 該類(lèi)所有的對(duì)象實(shí)例都已經(jīng)被回收,也就是 Java 堆中不存在該類(lèi)的任何實(shí)例。
  • 加載該類(lèi)的 ClassLoader 已經(jīng)被回收。
  • 該類(lèi)對(duì)應(yīng)的 java.lang.Class 對(duì)象沒(méi)有在任何地方被引用,無(wú)法在任何地方通過(guò)反射訪(fǎng)問(wèn)該類(lèi)的方法。

到了這里,關(guān)于06-JVM對(duì)象內(nèi)存回收機(jī)制深度剖析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    3.Java面試題—JVM基礎(chǔ)、內(nèi)存管理、垃圾回收、JVM 調(diào)優(yōu)

    一篇文章掌握整個(gè)JVM,JVM超詳細(xì)解析!??! JVM (Java虛擬機(jī)) 是運(yùn)行 Java 字節(jié)碼 的 虛擬機(jī) 。 JVM 針對(duì) 不同系統(tǒng) 有 特定實(shí)現(xiàn) ( Windows 、 Linux 等),目的是 同樣的代碼 在 不同平臺(tái) 能運(yùn)行出 相同的結(jié)果 。 Java 語(yǔ)言 要經(jīng)過(guò) 編譯 和 解釋 兩個(gè)步驟: 編譯 :通過(guò) 編譯器 將 代碼 一

    2024年02月15日
    瀏覽(23)
  • 深入理解JVM——垃圾回收與內(nèi)存分配機(jī)制詳細(xì)講解

    深入理解JVM——垃圾回收與內(nèi)存分配機(jī)制詳細(xì)講解

    所謂垃圾回收,也就是要回收已經(jīng)“死了”的對(duì)象。 那我們?nèi)绾闻袛嗄男?duì)象“存活”,哪些已經(jīng)“死去”呢? 給對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器就加一;當(dāng)引用失效時(shí),計(jì)數(shù)器就減1;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。 但是

    2024年02月12日
    瀏覽(26)
  • JVM學(xué)習(xí) GC垃圾回收機(jī)制 (堆內(nèi)存結(jié)構(gòu)、GC分類(lèi)、四大垃圾回收算法)

    JVM學(xué)習(xí) GC垃圾回收機(jī)制 (堆內(nèi)存結(jié)構(gòu)、GC分類(lèi)、四大垃圾回收算法)

    ?? 作者簡(jiǎn)介: 努力的clz ,一個(gè)努力編程的菜鳥(niǎo) ?????? ? ?? 文章專(zhuān)欄: 《JVM 學(xué)習(xí)筆記》 ,本專(zhuān)欄會(huì)專(zhuān)門(mén)記錄博主在學(xué)習(xí) JVM 中學(xué)習(xí)的知識(shí)點(diǎn),以及遇到的問(wèn)題。 ? ?? 文章詳情: 本篇博客是學(xué)習(xí) 【狂神說(shuō)Java】JVM快速入門(mén)篇 的學(xué)習(xí)筆記,關(guān)于 GC垃圾回收機(jī)制 (堆內(nèi)存結(jié)

    2023年04月19日
    瀏覽(24)
  • JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對(duì)象判斷方法

    JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對(duì)象判斷方法

    當(dāng)需要排查各種內(nèi)存溢出問(wèn)題、當(dāng)垃圾收集成為系統(tǒng)達(dá)到更高并發(fā)的瓶頸時(shí),我們就需要對(duì)這些“自動(dòng)化”的技術(shù)實(shí)施必要的監(jiān)控和調(diào)節(jié)。 Java 的自動(dòng)內(nèi)存管理主要是針對(duì)對(duì)象內(nèi)存的回收和對(duì)象內(nèi)存的分配。同時(shí),Java 自動(dòng)內(nèi)存管理最核心的功能是 堆 內(nèi)存中對(duì)象的分配與回收

    2023年04月19日
    瀏覽(40)
  • 深入探討Java虛擬機(jī)(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機(jī)制

    深入探討Java虛擬機(jī)(JVM):執(zhí)行流程、內(nèi)存管理和垃圾回收機(jī)制

    目錄 什么是JVM? JVM 執(zhí)行流程 JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū) 堆(線(xiàn)程共享) Java虛擬機(jī)棧(線(xiàn)程私有) 什么是線(xiàn)程私有? 程序計(jì)數(shù)器(線(xiàn)程私有) 方法區(qū)(線(xiàn)程共享) JDK 1.8 元空間的變化 運(yùn)行時(shí)常量池 內(nèi)存布局中的異常問(wèn)題 1.? Java堆溢出 2.??虛擬機(jī)棧和本地方法棧溢出 JVM 類(lèi)加載 1.

    2024年02月09日
    瀏覽(27)
  • 【Java高級(jí)應(yīng)用:深入探索Java編程的強(qiáng)大功能,JVM 類(lèi)加載機(jī)制, JVM 內(nèi)存模型,垃圾回收機(jī)制,JVM 字節(jié)碼執(zhí)行,異常處理機(jī)制】

    本人詳解 作者:王文峰,參加過(guò) CSDN 2020年度博客之星,《Java王大師王天師》 公眾號(hào):JAVA開(kāi)發(fā)王大師,專(zhuān)注于天道酬勤的 Java 開(kāi)發(fā)問(wèn)題 中國(guó)國(guó)學(xué)、傳統(tǒng)文化和代碼愛(ài)好者的程序人生,期待你的關(guān)注和支持!本人外號(hào):神秘小峯 山峯 轉(zhuǎn)載說(shuō)明:務(wù)必注明來(lái)源(注明:作者:

    2024年01月16日
    瀏覽(27)
  • 04-JVM對(duì)象創(chuàng)建深度剖析

    04-JVM對(duì)象創(chuàng)建深度剖析

    上一篇:03-JVM內(nèi)存模型剖析與優(yōu)化 對(duì)象創(chuàng)建的主要流程: 虛擬機(jī)遇到一條new指令時(shí),首先將去檢查這個(gè)指令的參數(shù)是否能在常量池中定位到一個(gè)類(lèi)的符號(hào)引用,并且檢查這個(gè)符號(hào)引用代表的類(lèi)是否已被加載、解析和初始化過(guò)。如果沒(méi)有,那必須先執(zhí)行相應(yīng)的類(lèi)加載過(guò)程。 ne

    2024年02月09日
    瀏覽(22)
  • 【Jvm】性能調(diào)優(yōu)(拓展)Jprofiler如何監(jiān)控和解決死鎖、內(nèi)存泄露問(wèn)題

    【Jvm】性能調(diào)優(yōu)(拓展)Jprofiler如何監(jiān)控和解決死鎖、內(nèi)存泄露問(wèn)題

    Jprofilers是針對(duì)Java開(kāi)發(fā)的 性能分析工具(免費(fèi)試用10天) , 可以對(duì)Java程序的 內(nèi)存,CPU,線(xiàn)程,GC,鎖 等進(jìn)行監(jiān)控和分析 , 本人IDEA版本是 2020.2.2 ,選擇的Jprofiler版本是 12.0 (早期的版本是純英文的, 12.0支持中文 ,安裝主要考慮是否與IDEA插件兼容即可) 進(jìn)入Jprofiler官網(wǎng)下載 - Jprofiler 版本這

    2024年02月19日
    瀏覽(24)
  • 【jvm系列-06】深入理解對(duì)象的實(shí)例化、內(nèi)存布局和訪(fǎng)問(wèn)定位

    【jvm系列-06】深入理解對(duì)象的實(shí)例化、內(nèi)存布局和訪(fǎng)問(wèn)定位

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識(shí)虛擬機(jī)與java虛擬機(jī) https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類(lèi)加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運(yùn)行時(shí)私有區(qū)域之虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 https

    2023年04月16日
    瀏覽(34)
  • Java線(xiàn)上故障排查(CPU、磁盤(pán)、內(nèi)存、網(wǎng)絡(luò)、GC)+JVM性能調(diào)優(yōu)監(jiān)控工具+JVM常用參數(shù)和命令

    Java線(xiàn)上故障排查(CPU、磁盤(pán)、內(nèi)存、網(wǎng)絡(luò)、GC)+JVM性能調(diào)優(yōu)監(jiān)控工具+JVM常用參數(shù)和命令

    根據(jù)服務(wù)部署和項(xiàng)目架構(gòu),從如下幾個(gè)方面排查: (1)運(yùn)用服務(wù)器:排查內(nèi)存,cpu,請(qǐng)求數(shù)等; (2)文件圖片服務(wù)器:排查內(nèi)存,cpu,請(qǐng)求數(shù)等; (3)計(jì)時(shí)器服務(wù)器:排查內(nèi)存,cpu,請(qǐng)求數(shù)等; (4)redis服務(wù)器:排查內(nèi)存,cpu,連接數(shù)等; (5)db服務(wù)器:排查內(nèi)存,cpu,連接數(shù)

    2024年02月07日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包