Java虛擬機:如何判定哪些對象可回收?

版權聲明:本文為博主原創文章,轉載請注明出處,歡迎交流學習!

? ? ? ?在堆內存中存放著Java程序中幾乎所有的對象實例,堆內存的容量是有限的,Java虛擬機會對堆內存進行管理,回收已經“死去”的對象(即不可能再被任何途徑使用的對象),釋放內存。垃圾收集器在對堆內存進行回收前,首先要做的第一件事就是確定這些對象中哪些還存活著,哪些已經死去。Java虛擬機是如何判斷對象是否可以被回收的呢?

? ? ? ?引用計數算法

? ? ? ?引用計數算法的原理是這樣的:給對象添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;在任何時刻計數器的值為0的對象就是不可能再被使用的,也就是可被回收的對象。

? ? ? ?引用計數算法的效率很高,但是主流的JVM并沒有選用這種算法來判定可回收對象,因為它有一個致命的缺陷,那就是它無法解決對象之間相互循環引用的的問題,對于循環引用的對象它無法進行回收。

? ? ? ?假設有這樣一段代碼:

? ? ? ?

public class Object {public Object instance;public static void main(String[] args) {// 1Object objectA = new Object();Object objectB = new Object();// 2objectA.instance = objectB;objectB.instance = objectA;// 3objectA = null;objectB = null;}

? ? ? ?程序啟動后,objectA和objectB兩個對象被創建并在堆中分配內存,這兩個對象都相互持有對方的引用,除此之外,這兩個對象再無任何其他引用,實際上這兩個對象已經不可能再被訪問(引用被置空,無法訪問),但是它們因為相互引用著對方,導致它們的引用計數器都不為0,于是引用計數算法無法通知GC收集器回收它們。

? ? ? ?實際上,當第1步執行時,兩個對象的引用計數器值都為1;當第2步執行時,兩個對象的引用計數器都為2;當第3步執行時,二者都清為空值,引用計數器值都變為1。根據引用計數算法的思想,值不為0的對象被認為是存活的,不會被回收;而事實上這兩個對象已經不可能再被訪問了,應該被回收。

? ? ? ?可達性分析算法

? ? ? ?在主流的JVM實現中,都是通過可達性分析算法來判定對象是否存活的。可達性分析算法的基本思想是:通過一系列被稱為"GC Roots"的對象作為起始點,從這些節點開始向下搜索,搜索走過的路徑稱為引用鏈,當一個對象到GC Roots對象沒有任何引用鏈相連,就認為GC Roots到這個對象是不可達的,判定此對象為不可用對象,可以被回收。

? ? ? ?

? ? ? ?在上圖中,objectA、objectB、objectC是可達的,不會被回收;objectD、objectE雖然有關聯,但是它們到GC Roots是不可達的,所以它們將會被判定為是可回收的對象。

? ? ? ?在Java中,可作為GC Roots的對象包括下面幾種:

? ? ? ?1、虛擬機棧中引用的對象;

? ? ? ?2、方法區中類靜態屬性引用的對象;

? ? ? ?3、方法區中常量引用的對象;

? ? ? ?4、本地方法棧中Native方法引用的對象。

? ? ? ?以上探討了判定對象是否可回收的兩種算法,判定對象是否可回收只是垃圾回收的第一步,接下來還要解決何時回收以及如何回收的問題,在后面的文章中我們來探討這些問題。

?

轉載于:https://www.cnblogs.com/fangfuhai/p/7197750.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/369971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/369971.shtml
英文地址,請注明出處:http://en.pswp.cn/news/369971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html標簽object和embed,html標簽object和embed的區別

object和embed的區別The code in bold above is the actual code that you need to place in your page to embed a FusionCharts chart.In the above code, weveused and tags to embed the 3D Column Chart (Column3D.swf) within the HTML page.used &dataUrlData.xml u…

Apache Apollo REST API

Apache Apollo是新一代,高性能,多協議的消息傳遞代理,它是從頭開始構建的,可以替代ActiveMQ5.x。 我過去曾在博客上發表過文章 (第一部分已經與第二部分一起發布了)。 Apollo的非阻塞異步體系結構使其速度…

bzoj1588 [HNOI2002]營業額統計

1588: [HNOI2002]營業額統計 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17931 Solved: 7391[Submit][Status][Discuss]Description 營業額統計 Tiger最近被公司升任為營業部經理,他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 T…

python管道通信_Python進程通信之匿名管道實例講解

匿名管道管道是一個單向通道,有點類似共享內存緩存.管道有兩端,包括輸入端和輸出端.對于一個進程的而言,它只能看到管道一端,即要么是輸入端要么是輸出端.os.pipe()返回2個文件描述符(r, w),表示可讀的和可寫的.示例代碼如下:復制代碼 代碼如下:#!/usr/bin/pythonimport timeim…

css3中的box-sizing屬性的使用

box-sizing屬性用來定義元素的width和height所表示的區域,該屬性一般有三種值:content-box、border-box、inherit。 其中inherit表示box-sizing的值應該從父元素繼承。 content-box和border-box的主要區別就是元素的width和height的值包不包括border、padding這兩…

ES6擴展運算符...進行的數組刪除

今天寫了按照React小書寫了Reducer,發現基礎真是太重要了,所有關于上層建筑的細節都需要回到下層細節中去尋找,而且現在的基礎也由ES3變成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大學在線考試答案計算機基礎,中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc...

中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc 計算機基礎01 總共89題共100分 一. 單選題 (共35題,共35分) 1. 域名服務器DNS的主要功能是( )。 (1分) A.通過請求及回答獲取主機和網絡相關的信息 B.查詢主機的MAC地址 C.為主機自動命名 D.合理分配IP地址 ★標準答案&…

自動化的OSGi測試運行器

在我的團隊成員中,我以忘記維護(JUnit)測試套件而聞名。 我只是無法為此付出額外的手動為套件添加測試的步驟。 幸運的是,有連續的集成服務器通過命名模式收集測試。 如果我介紹的一項孤立測試失敗了,那么它會脫穎而出…

php post請求后端拿不到值_PHP Post獲取不到非表單數據的問題解決辦法

問題描述在使用vue-axios向后端post數據時,PHP端獲取不到post的數據。問題解決修改php.ini配置找到php.ini配置文件,查找enable_post_data_reading變量,修改為打開狀態,注釋掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作簡單loading動畫

曾經以為,loading的制作需要一些比較高深的web動畫技術,后來發現大多數loading都可以用“障眼法”做出來。比如一個旋轉的圓圈,并不都是將gif圖放進去,有些就是畫個靜止圖像,然后讓它旋轉就完了。gif圖也可以&#xff…

機器學習:多變量線性回歸

************************************** 注:本系列博客是博主學習Stanford大學 Andrew Ng 教授的《機器學習》課程筆記。博主深感學過課程后,不進行總結非常easy遺忘,依據課程加上自己對不明確問題的補充遂有此系列博客。本系列博客包含線性…

Java對象復活

總覽 收集覆蓋了finalize()的對象之后,將其添加到終結處理隊列中,以在調用每個對象的finalize()方法之后進行清理。 如果您復活該物體,會發生什么? 何時定稿? finalize方…

經過路由無法找到計算機,電腦無法啟動服務提示系統找不到指定的路徑(圖)

原標題:"電腦無法啟動服務提示系統找不到指定的路徑"相關電腦問題教程分享。 - 來源:191路由網。眾所周知,使用電腦的時候需要啟動一些服務才能使用相關的功能,但是如果出現無法啟動服務項,并且提示“錯誤3:…

有關域索引錯誤產生的原因及解決辦法

1說明 數據庫錯誤ORA-29861:域索引標記為LOADING/FAILED/UNUSABLE,其錯誤原因及解決辦法,根據ORACLE官方文檔的說法如下: // *Cause: An attempt has been made to access a domain index that is// being built or is marked faile…

詳細解讀css中的浮動以及清除浮動的方法

對于前端初學者來說,css浮動部分的知識是一塊比較難以理解的部分,下面我將把我學習過程中的心得分享給大家。 導讀: 1.css塊級元素講解 2.css中浮動是如何產生的 3.出現浮動后,如何清除浮動(本文將涉及到多種清除浮動…

微信多開txt_電腦版微信怎么雙開、多開

新建一個txt文本文件,在文件中寫入如下代碼:echo offstart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exestart /d "C:\Program Files (x86)\Tencent\WeChat\" WeChat.exeexit保存文本文件。這里需要注意的是&#xff1a…

java 基礎--隨筆

---恢復內容開始--- java 對大小寫敏感。 java沒有任何無符號類型(unsigned)。 C/C是編譯型語言,java是解釋性語言。 JAVA編譯過程同C/C 的 編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運行而…

多源計算機培訓,多源數據匯聚的多流形學習算法研究

摘要:隨著信息技術和互聯網的飛速發展,人們可以從多個信息源獲得數據,即多源數據.由于多源數據具有類型多樣,尺度不統一等特點,對多源數據進行匯聚并提取有效信息是機器學習和模式識別等領域研究的熱點.由于多流形學習能夠有效地揭示復雜數據中的內在結構,因此本文主…

Ubuntu 16.04 安裝mysql5.7

技術更新換代,數據庫也不斷更新,需要不斷努力學習,下面就是如何在 ubuntu中安裝 mysql。 廢話不多說,上來就是干 一、安裝mysql 5.7 sudo apt-get update sudo apt-get install mysql-server 中間會提示您輸出root 密碼&#xff…

CSS多列布局(實例)

前言 一列布局二列布局三列布局 1 一列布局 一列布局&#xff1a; HTML部分 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>一列布局</title> </head> <body> <div class"head">…