1. 程式人生 > >Java垃圾回收機制與典型的垃圾回收演算法

Java垃圾回收機制與典型的垃圾回收演算法

說到垃圾回收(Garbage Collection,GC),很多人就會自然而然地把它和Java聯絡起來。在Java中,程式設計師不需要去關心記憶體動態分配和垃圾回收的問題,這一切都交給了JVM來處理。顧名思義,垃圾回收就是釋放垃圾佔用的空間,那麼在Java中,什麼樣的物件會被認定為“垃圾”?那麼當一些物件被確定為垃圾之後,採用什麼樣的策略來進行回收(釋放空間)?在目前的商業虛擬機器中,有哪些典型的垃圾收集器?下面我們就來逐一探討這些問題。以下是本文的目錄大綱:

  一.如何確定某個物件是“垃圾”?

  二.典型的垃圾收集演算法

  三.典型的垃圾收集器

  如果有不正之處,希望諒解和批評指正,不勝感激。

  請尊重作者勞動成果,轉載請標明原文連結:

一.如何確定某個物件是“垃圾”?

  在這一小節我們先了解一個最基本的問題:如果確定某個物件是“垃圾”?既然垃圾收集器的任務是回收垃圾物件所佔的空間供新的物件使用,那麼垃圾收集器如何確定某個物件是“垃圾”?—即通過什麼方法判斷一個物件可以被回收了。

  在java中是通過引用來和物件進行關聯的,也就是說如果要操作物件,必須通過引用來進行。那麼很顯然一個簡單的辦法就是通過引用計數來判斷一個物件是否可以被回收。不失一般性,如果一個物件沒有任何引用與之關聯,則說明該物件基本不太可能在其他地方被使用到,那麼這個物件就成為可被回收的物件了。這種方式成為引用計數法

  這種方式的特點是實現簡單,而且效率較高,但是它無法解決迴圈引用的問題,因此在Java中並沒有採用這種方式(Python採用的是引用計數法)。看下面這段程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Main { public static void main(String[] args) { MyObject object1 = new MyObject();
MyObject object2 = new MyObject(); object1.object = object2; object2.object = object1; object1 = null; object2 = null; } } class MyObject{ public Object object = null; }

  最後面兩句將object1和object2賦值為null,也就是說object1和object2指向的物件已經不可能再被訪問,但是由於它們互相引用對方,導致它們的引用計數都不為0,那麼垃圾收集器就永遠不會回收它們。

  為了解決這個問題,在Java中採取了 可達性分析法。該方法的基本思想是通過一系列的“GC Roots”物件作為起點進行搜尋,如果在“GC Roots”和一個物件之間沒有可達路徑,則稱該物件是不可達的,不過要注意的是被判定為不可達的物件不一定就會成為可回收物件。被判定為不可達的物件要成為可回收物件必須至少經歷兩次標記過程,如果在這兩次標記過程中仍然沒有逃脫成為可回收物件的可能性,則基本上就真的成為可回收物件了。

  至於可達性分析法具體是如何操作的我暫時也沒有看得很明白,如果有哪位朋友比較清楚的話請不吝指教。

  下面來看個例子:

1 2 3 4 5 6 7 Object aobj = new Object ( ) ; Object bobj = new Object ( ) ; Object cobj = new Object ( ) ; aobj = bobj; aobj = cobj; cobj = null; aobj = null;

   第幾行有可能會使得某個物件成為可回收物件?第7行的程式碼會導致有物件會成為可回收物件。至於為什麼留給讀者自己思考。

  再看一個例子:

相關推薦

Java垃圾回收機制典型垃圾回收演算法

說到垃圾回收(Garbage Collection,GC),很多人就會自然而然地把它和Java聯絡起來。在Java中,程式設計師不需要去關心記憶體動態分配和垃圾回收的問題,這一切都交給了JVM來處理。顧名思義,垃圾回收就是釋放垃圾佔用的空間,那麼在Java中,什麼樣的

Java 垃圾回收機制幾種垃圾回收演算法

一、如何確定某個物件是“垃圾”? 這一小節先了解一個最基本的問題:如果確定某個物件是“垃圾”?既然垃圾收集器的任務是回收垃圾物件所佔的空間供新的物件使用,那麼垃圾收集器如何確定某個物件是“垃圾”?通過什麼方法判斷一個物件可以被回收了。 在java中是通過引用來和物件進行關

垃圾回收機制內存分配

可用 vivo 比較 固定 類結構 缺點 思路 pau 開發人員 摘要   程序計數器、虛擬機棧、本地方法棧3個區域隨線程而生,隨線程而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執行者出棧和入棧。每個棧幀中分配多少內存基本上是在類結構確定下來時就已知的(盡管在運行期會

【達內課程】Android中的GC垃圾回收機制記憶體洩漏

當main()方法執行完,main()方法中的區域性變數都會彈棧,從棧當中銷燬 當左側棧中的e2和e銷燬後,右側中的兩個物件就是垃圾 java底層有一種GC垃圾回收機制,在java程式執行時,GC執行緒會不斷找尋垃圾,是的話會清除掉 當我們點選模擬機的返回鍵時,發生了什麼 當G

JVM 垃圾回收機制GC效能調優

一、GC概要: JVM堆相關知識     為什麼先說JVM堆?     JVM的堆是Java物件的活動空間,程式中的類的物件從中分配空間,其儲存著正在執行著的應用程式用到的所有物件。這些物件的建立方式就是那些new一類的操作,當物件

JVM的4種垃圾回收演算法垃圾回收機制總結

本文標題:直通BAT必考題系列:JVM的4種垃圾回收演算法、垃圾回收機制與總結  轉載請保留頁面地址:http://youzhixueyuan.com/jvm-garbage-collection-algorithm.html 垃圾回收演算法 1.標記清除 標記-清除演算

JavaScript的垃圾回收機制記憶體洩漏

常用的兩種演算法: 引用計數(新版瀏覽器已棄用,棄用原因:會出現迴圈引用的情況,無法進行垃圾回收,導致記憶體洩漏) 標記清除 引用計數法 引用計數,顧名思義一個物件是否有指向它的引用,即看棧中是否有指向要釋放的該塊堆記憶體中的地址,如果沒有,則該塊記憶體是不需要的,可以進行釋放,即垃圾回收 下面引用大佬的一個

Chrome 瀏覽器垃圾回收機制記憶體洩漏分析

Chorme 瀏覽器中的垃圾回收和記憶體洩漏 垃圾回收 通常情況下,垃圾資料回收分為手動回收和自動回收兩種策略。 手動回收策略,何時分配記憶體、何時銷燬記憶體都是由程式碼控制的。 自動回收策略,產生的垃圾資料是由垃圾回收器來釋放的,並不需要手動通過程式碼來釋放。 JavaScript 中呼叫棧中的資料回收 J

垃圾回收機制策略三(標記整理演算法)

概念 由名字就可以看出先標記在整理,也就是第一個過程和標記清除演算法的第一個過程一樣。然後是整理,最後在清除。也可以叫做標記-整理-清除演算法。 針對老年代進行回收的,也就是針對回收效率不高,回收的垃圾較小的情況。 圖示  清除(紅色)的向右邊去,不用清除的向左邊

JVM垃圾回收機制之對象回收算法

後臺線程 stat 無需 搜索 容易 語言 可用 需要 jvm內存 前言 在前面的文章中,介紹了JVM內存模型分為:堆區、虛擬機棧、方法區、本地方法區和程序計數器,其中堆區是JVM中最大的一塊內存區域,在Java中的所有對象實例都保存在此區域,它能被所有線程共享。

_065_Android_BaseAdapter的convertView回收機制動態控制元件響應

轉自http://blog.csdn.net/harvic880925/article/details/25335957,感謝作者的無私分享。  對於listView的BaseAdapter的派生,難度比較大。最難理解的莫過於getView(int position, View con

BaseAdapter——convertView回收機制動態控制元件響應

前言:對於listView的BaseAdapter的派生,難度比較大。最難理解的莫過於getView(int position, View convertView, ViewGroup parent)這個函式是如何產生每條記錄的,有些部落格中利用holderView,有些部

Java回撥機制OOP思想

結合Java的回撥機制總結OPP的思想,因為Java是自學的,開始抽象類和介面的概念都能理解,別人用也能懂,但等到自己設計的時候總是很生疏,等到做Android時,不停的回撥,回撥,回撥。。。看看原始碼,一點點的就有了理解,就此來總結一下,有不對的地方還請多指出評批。 語言

java delphi aes 加密解密檔案相容演算法

本文在oracle jdk 1.8, delphi xe3下面測試加密與解密模式都成功通過。 java端加密與解密演算法程式碼 package com.shit; import java.io.ByteArrayOutputStream; import java.io

Java中的物件垃圾回收機制

物件在記憶體中的狀態 當一個物件在堆記憶體中執行時,根據它被引用變數所引用的狀態,可以把它所處的狀態分為如下三種。 可達狀態:當一個物件被建立之後,若有一個以上的引用變數引用它,則這個物件在程式中處於可達狀態,程式可以通過引用變數來呼叫該物件的例項變數和方法。 可

python垃圾回收機制 Java記憶體管理垃圾回收

語言的記憶體管理是語言設計的一個重要方面。它是決定語言效能的重要因素。無論是C語言的手工管理,還是Java的垃圾回收,都成為語言最重要的特徵。這裡以Python語言為例子,說明一門動態型別的、面向物件的語言的記憶體管理方式。 物件的記憶體使用 賦值語句是語言最常見的功能了。但即使是最簡單的賦值語句,也可以

深入理解java虛擬機器---java記憶體區域記憶體溢位異常---3垃圾回收機制GC

  一、垃圾回收---物件存活演算法:     1、引用計數器法:在物件身上放上一個計數器,當有引用則加一,引用失效則減一,為零則可回收。(無法解決物件相互引用)     2、可達性分析法(java),GC roots為起始點,從節點向下搜尋,搜尋路徑為引用鏈,不在引用鏈的物件則是可回收的物件

Java效能優化三:記憶體管理垃圾回收機制,開發必備優化技巧!

一、Java 類載入機制的特點: (1)基於父類的委託機制:執行一個程式時,總是由 AppClass Loader (系統類載入器)開始載入指定的類,在載入類時,每個類載入器會將載入任務上交給其父,如果其父找不到,再由自己去載入, Bootstrap Loader (啟動類載入器)是最頂級的類載

Java平臺垃圾回收機制

JDK與JRE的區別? ①JVM(Java Virtual Machine,Java虛擬機器)是實現java跨平臺的核心,負責解釋執行class檔案. ②JRE(Java Runntime Environment, java執行環境)是執行Java程式所必須的環境的集合,不包括JV

java記憶體管理垃圾回收機制

        看了很多java記憶體管理的文章或者部落格,寫的要麼籠統,要麼劃分的不正確,且很多文章都千篇一律。例如部分地方將jvm籠統的分為堆、棧、程式計數器,這麼分太過於籠統,無法清晰的闡述java的記憶體管理模型;部分地方將jvm分為堆、棧、程式計數器、常量池、