深入理解JVM學習筆記(十九、JVM 垃圾回收機制---如何判斷物件是否為垃圾【引用計數法】)
一、引用計數法
引用計數演算法作為垃圾收集器最早的演算法,有其優勢,也有其劣勢,雖然現在的JVM都不再採用引用計數演算法進行垃圾回收【例如Sun的Java hotspot採用了火車演算法進行垃圾回收】,但這種演算法也並未被淘汰,在著名的單程序高併發快取Redis中依然採用這種演算法來進行記憶體回收。
直白一點,引用計數演算法就是對於建立的每一個物件都有一個與之關聯的計數器,這個計數器記錄著該物件被使用的次數,垃圾收集器在進行垃圾回收時,對掃描到的每一個物件判斷一下計數器是否等於0,若等於0,就會釋放該物件佔用的記憶體空間,同時將該物件引用的其他物件的計數器進行減一操作。
優勢:簡單易於垃圾回收器判定。
劣勢:採用引用計數器進行垃圾回收,最大的缺點就是不能解決迴圈引用的問題,例如一個父物件持有一個子物件的引用,子物件也持有父物件的引用,這種情況下,父子物件將一直存在於JVM的堆中,無法進行回收。
接下來,我們寫一個例子來佐證引用計數法的劣勢,程式碼如下:
package com.zjt.test.jvm007; public class Main { private Object instence; public Main() { //開闢一片20MB大小的記憶體,便於形象的看出釋放效果 byte [] b = new byte[20 * 1024 * 1024]; } public static void main(String[] args) { //建立m1、m2.此時棧中有兩個引用m1、m2分別指向堆中的兩個Main中。 Main m1 = new Main(); Main m2 = new Main(); //讓堆中m1指向m2 m1.instence = m2; //讓堆中m2指向m1 m2.instence = m1; //將棧隊堆的引用斷開 m1 = null ; m2 = null ; //主動呼叫垃圾回收機制 System.gc(); } }
執行後如下圖所示:
圖中紅框所示為回收前堆佔用記憶體和回收後堆佔用記憶體情況。 可以看出正好回收了40M,也就是兩個Main的空間。因此可以得出結論:JDK8所採用的垃圾收集演算法不是引用計數法。
可能你還有疑問,為什麼你執行後沒有打出這個日誌呢,不要急,跟著我在eclipse上做以下簡單配置在執行就可以了。
執行即可。
相關推薦
深入理解JVM學習筆記(十九、JVM 垃圾回收機制---如何判斷物件是否為垃圾【引用計數法】)
一、引用計數法 引用計數演算法作為垃圾收集器最早的演算法,有其優勢,也有其劣勢,雖然現在的JVM都不再採用引用計數演算法進行垃圾回收【例如Sun的Java hotspot採用了火車演算法進行垃圾回收】,但這種演算法也並未被淘汰,在著名的單程序高併發快取Red
深入理解JVM學習筆記(十七、物件的訪問定位)
之前我們理解java棧堆時可能會說棧中儲存指標,指向堆中的物件地址。其實這種說法是不嚴謹的,其一是java中沒有指標的概念,其二是棧中不一定儲存物件的地址,也可能是其他地址。那麼問題來了,物件是如何進行訪問定位的呢。 虛擬機器棧是 java方
深入理解JVM學習筆記(十五、物件的建立)
下圖是JAVA虛擬機器物件的建立過程: 現在我們就以下幾點說明物件的建立: 1、給物件分配記憶體 給物件分配記憶體有指標碰撞和空閒列表兩種方式。具體描述如下圖所示。按時 2、執行緒安全性問題 無論是指標碰撞還是空閒列表,在高併發情況下都有可能存線
python cookbook第三版學習筆記十九:未包裝的函式新增引數
比如有下面如下的程式碼,每個函式都需要判斷debug的是否為True,而預設的debug為False def a(x,debug=False): if debug:  
資料科學和人工智慧技術筆記 十九、資料整理(下)
十九、資料整理(下) 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 連線和合並資料幀 # 匯入模組 import pandas as pd from IPython.display import display from
資料科學和人工智慧技術筆記 十九、資料整理(上)
十九、資料整理(上) 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 在 Pandas 中通過分組應用函式 import pandas as pd # 建立示例資料幀 data = {'Platoon': ['A','A
OpenCV學習筆記十九---運動跟蹤 CamShift以及meanShift詳解
#include <opencv2/video/tracking.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream
java之jvm學習筆記十(策略和保護域)
前面一節,我們做了一個簡單的實驗,來說明什麼是策略檔案,在文章的最後,也順帶的講了一下什麼是策略,還有策略的作用。 為了引出另外一個很重要的概念ProtectionDomain(保
java之jvm學習筆記十一(訪問控制器)
這一節,我們要學習的是訪問控制器,在閱讀本節之前,如果沒有前面幾節的基礎,對你來說可能會比較困難! 知識回顧: 我們先來回顧一下前幾節的內容,在筆記三的時候我們學了類裝載器,它主
設計模式學習筆記(十九)—Chain of Responsibility職責鏈模式
轉貼自 http://www.blogjava.net/flustar/archive/2007/12/14/cor.htmlChain of Responsibility模式定義: 為了避免請求的傳送者和接收者之間的耦合關係,使多個接受物件都有機會處理請求。將這些物件連成一
ElasticSearch學習筆記之九 複雜資料型別和巢狀物件
複雜資料型別 除了前面說到的簡單資料型別,Elasticsearch還支援JSON 的null ,陣列,和物件. 空域 欄位取值可以為空,當然,陣列也可以為空。 然而,在 Lucene 中是不能儲存 null 值的,所以我們認為存在 null 值的域為空域。
JVM中垃圾回收機制如何判斷是否死亡?詳解引用計數法和可達性分析 !
> 因為熱愛,所以堅持。 > 文章下方有本文參考電子書和視訊的**下載地址**哦~ 這節我們主要講垃圾收集的一些基本概念,先了解垃圾收集是什麼、然後觸發條件是什麼、最後虛擬機器如何判斷物件是否死亡。 ### 一、前言 我們都知道Java和C++有一個非常大的區別就是Java有自動的垃圾回收
深入理解JVM學習筆記(二十六、JVM 記憶體分配----優先分配到eden&空間分配擔保)
一、優先分配到eden 我們寫一個程式來驗證物件優先分配到eden,原始碼如下: package com.zjt.test.jvm008; public class Main { public static void main(String[] args) { b
深入理解JVM學習筆記(二十七、JVM 記憶體分配----大物件直接分配到老年代)
一、驗證 首先我們編寫如下程式 package com.zjt.test.jvm008; public class Main { public static void main(String[]
深入理解JVM學習筆記(二十二、JVM 垃圾回收機制---如何回收垃圾---回收策略【複製演算法】)
上一節我們講到了標記-清除演算法因為需要進行兩次記憶體掃描導致效率不高,那麼這一節我們介紹一種複製演算法,比較好的解決了這個問題。 講複製演算法前,我們先回顧一下JVM的記憶體結構。JVM記憶體大體分為兩大塊,分別為執行緒共享區、執行緒獨佔區。
深入理解JVM學習筆記(三十、JVM 記憶體分配----逃逸分析與棧上分配)
一、概念 我們之前提到過,JVM堆已經不是物件記憶體分配的唯一選擇。 棧上分配就是java虛擬機器提供的一種優化技術,基本思想是對於那些執行緒私有的物件(指的是不可能被其他執行緒訪問的物件),可以將它們打散分配在棧上,而不是分配在堆上。分配在棧上的好處是可以在函式呼叫結束
深入理解JVM學習筆記(一、總覽)
1、JVM歷史2、JVM記憶體結構3、JVM垃圾回收機制4、JVM效能監控工具5、JVM效能調優案例時間6、JVM類檔案結構7、JVM類載入機制8、JVM位元組碼執行引擎9、JVM虛擬機器編譯及其執行時
深入理解JVM學習筆記(五、JAVA發展歷史)
一、JDK Version 1.0 開發代號為Oak(橡樹),於1996-01-23發行 其提出了“Write Once,Run Anywhere”的口號二、JDK Version 1.1於1997-02-19發行。引入的新特性包括:引入JDBC(Java Dat
深入理解計算機系統第十二章學習筆記
應用級併發應用情況:訪問慢速I/O裝置;與人互動;通過推遲工作以降低延遲;服務多個網路客戶端;在多核機器上進行併發計算。 三種基本構造併發程式的方法:程序、I/O多路複用、執行緒 1、基於程序的併發程式設計 例如構建一個併發伺服器: 假設有1個伺服器和2個客戶端,伺服器正在監聽lis
深入理解JAVA虛擬機器學習筆記(一)JVM記憶體模型
一、JVM記憶體模型概述 JVM記憶體模型其實也挺簡單的,這裡先提2個知識點: 1、組成:java堆,java棧(即虛擬機器棧),本地方法棧,方法區和程式計數器。 2、是否共享:其中方法區和堆區是執行緒共享的,虛擬機器棧,本地方法棧和程式計數器是執行緒私有的,也稱執行緒