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

Java怎樣判斷堆區(qū)中的對象可以被回收了

 更新時間:2024年12月25日 14:57:47   作者:高錳酸鉀_  
文章介紹了Java垃圾回收機制的工作原理,主要通過引用計數法和可達性分析法來判斷對象是否可以被回收,引用計數法存在循環(huán)引用問題,而可達性分析法則使用GCRoot對象來判斷對象是否可達,從而決定是否回收,這兩種方法各有優(yōu)缺點,但Java最終采用了可達性分析法來實現垃圾回收

如何判斷堆區(qū)中的對象可以被回收了

在Java中,垃圾回收機制會幫助我們自動回收不再被使用的對象,已到達即使釋放內存的效果,但是Java又是怎么知道哪些對象不會再被我們繼續(xù)使用了呢,希望你通過本篇文章,理解引用計數法與可達性分析法的運行方式

垃圾回收機制

在C/C++中,一個對象如果不再使用,就要手動將其釋放掉,但是很多程序員在編寫程序的時候經常忘記將一些對象回收,從而就導致了內存泄漏

在Java中為了簡化對象的內存釋放,引入了自動的垃圾回收機制,通過垃圾回收器把不再使用的對象完成自動回收,垃圾回收器主要負責堆上的內存回收,那么垃圾回收器又是如何知道哪些對象可以被回收了呢?

在Java中,一個對象是否可以被回收,主要是看這個對象是否被引用,如果對象被引用了,說明對象還在使用,是不可以被回收的,比如說如下代碼中,堆內存中的Demo對象被demo引用,那么堆中的Demo對象就不會被回收:

public class Demo {
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

若此時將demo的引用設置為null:

demo = null;

那么此時Demo對象就處于了沒有被引用的狀態(tài):

此時Demo會被垃圾回收器進行回收,那么垃圾回收器又是怎么知道Demo對象目前沒有被引用呢???

引用計數法

引用計數法會為每一個對象維護一個引用計數器,當對象被引用時加一,取消引用時減一,在上面的代碼中,demo引用了堆上的Demo對象,所以Demo對象的引用計數器就加一,當把demo賦值為null的時候,也就是取消了Demo的引用,此時Demo對象引用計數器將減一成為0,此時垃圾回收器就認為Demo對象此時沒有被任何引用,可以回收

但是此時會出現一個問題,如果我new了兩個對象A與B,并且A對象與B對象的互為彼此的成員變量,那么就會出現循環(huán)引用的現象,此時A對象被棧內存中的a1引用,也被B對象中的a變量引用,那么他的引用技術器應該為2:

public class Demo {
    public static void main(String[] args) {
        A a1 = new A();
        B b1 = new B();
        a1.b = b1;
        b1.a = a1;

    }
}
class A {
    B b;
}
class B {
    A a;
}

那么此時,我取消a1、b1對A與B的引用

a1 = null;
b1 = null;

我們已經無法在程序中獲取到A與B對象了,因為他們兩個除了彼此間的引用關系,已經沒有任何引用能夠找到他們,所以按照常理來說,A與B對象都不會在程序中再使用了,理應被垃圾回收器進行回收,但是又由于存在彼此間的引用關系,引用計數器的值并不是0,那么此時垃圾回收器又會認為A與B都存在被引用的關系,所以并不會回收這兩個類

那么這種情況顯然是不對的,無法回收的對象有可能會導致內存泄漏,所以Java并沒有使用這種方法來判斷類是否應該被回收,而是使用了另外一種方式

可達性分析法

Java使用的是可達性分析算法來判斷對象是否可以被回收

可達性分析法將對象分為兩類:

  • 垃圾回收根對象(GC Root)
  • 普通對象

對象與對象之間存在引用關系,形成一個引用鏈, 可達性分析算法就是指GC Root對象到某個對象間是可達的,即從GC Root對象開始,通過引用對象可以找到的對象愛國,即認為該對象還不能被回收

此時B、C、D對象都可以通過引用被GC Root對象找到,即他們都是可達的,所以不會被視為可回收的對象,但是如果對象A與對象B之間取消引用關系,那么即使對象C與對象D任然存在引用關系,但他們是不可達的,因此他們會被回收

Java虛擬機會持有一個所有GC Root對象的列表,用來判斷哪些對象是不可達的,不可達的對象將被垃圾回收器進行回收:

再次回看上面的案例,如果使用可達性分析法,那么堆內存中應該存在一個GC Root對象引用了主線程里面mian方法的棧幀中的對象,此時如果a1與b1不再引用堆中的對象,那么就算A對象與B對象存在引用關系,但是他們是不可達的,就會被視為等待回收的對象:

那么哪些對象可以被當中GC Root對象呢?

主要有四種GC Root對象:

  • 1.線程Thread對象
  • 引用線程棧幀中的方法、參數、局部變量等等,上面我們的案例中就是線程Thread對象引用了mian方法棧幀中的a1與b1
  • 2.類加載器加載到的java.lang.Class對象
  • 引用類中的靜態(tài)變量
  • 3.監(jiān)視器對象
  • 用來保存同步鎖synchronized關鍵字持有的對象
  • 4.本地方法方法調用時使用的全局對象
  • 由Java虛擬機來控制調用

總結

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

相關文章

  • Spring Cloud體系實現標簽路由的方法示例

    Spring Cloud體系實現標簽路由的方法示例

    這篇文章主要介紹了Spring Cloud體系實現標簽路由的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • mybatis框架xml下trim中的prefix與suffix等標簽的用法

    mybatis框架xml下trim中的prefix與suffix等標簽的用法

    這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot緩存問題分析及解決方案

    Spring Boot緩存問題分析及解決方案

    SpringBoot提供緩存支持,提升應用性能,但可能出現緩存不一致、緩存穿透、緩存擊穿等問題,分析了緩存基本概念、SpringBoot緩存支持、常見緩存問題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • SpringBoot項目啟動時初始化操作常見的幾種方式

    SpringBoot項目啟動時初始化操作常見的幾種方式

    這篇文章主要介紹了SpringBoot項目啟動時初始化操作常見的幾種方式,這些方法可以幫助開發(fā)者在服務啟動時自動執(zhí)行必要的初始化操作,需要的朋友可以參考下
    2025-02-02
  • Springboot?通過FastJson實現bean對象和Json字符串互轉問題

    Springboot?通過FastJson實現bean對象和Json字符串互轉問題

    這篇文章主要介紹了Springboot?通過FastJson實現bean對象和Json字符串互轉,本文嘗試驗證兩種場景給大家詳細介紹,對Springboot?FastJson實現bean和Json互轉問題,感興趣的朋友一起看看吧
    2022-08-08
  • java注解處理器學習在編譯期修改語法樹教程

    java注解處理器學習在編譯期修改語法樹教程

    這篇文章主要為大家介紹了java注解處理器學習在編譯期修改語法樹教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 基于Java堆內存的10個要點的總結分析

    基于Java堆內存的10個要點的總結分析

    本篇文章是對Java堆內存的10個要點進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • springboot的maven多模塊混淆jar包的實現方法

    springboot的maven多模塊混淆jar包的實現方法

    springboot可以使用proguard-maven-plugin 這個插件 在 pom.xml 中自定義proguard 的指令,本文基于 springboot + maven + proguard 的maven多模塊架構進行代碼混淆,需要的朋友可以參考下
    2024-03-03
  • java基礎之包裝類的介紹及使用

    java基礎之包裝類的介紹及使用

    今天帶大家復習Java基礎知識,文中對Java包裝類作了非常詳細的介紹及總結,對正在學習java基礎的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Spring注解之@Import的簡單介紹

    Spring注解之@Import的簡單介紹

    @Import是Spring基于Java注解配置的主要組成部分,下面這篇文章主要給大家介紹了關于Spring注解之@Import的簡單介紹,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12

最新評論