1. 程式人生 > >Java gc回收機制

Java gc回收機制

一、概要

垃圾回收又稱gc, gc是執行在Jvm中,回收應用程式中建立的一些無用的物件(學習過Java的人都應該知道)。

二、問題概要

大家在學習gc的回收機制之前,還是先帶著問題去思考,這樣呢,能在最短的時間內,做到最有效的收穫。

1.gc是什麼東西? 
2.gc是怎麼樣執行的? 
3.gc的裡面的演算法是如何實現的? 
4.gc的新老以及永久區是什麼? 
5.什麼樣的垃圾才被回收? 
6.什麼時候會導致垃圾回收? 
…. 

三、什麼是垃圾

對於垃圾的理解,如果拋開Java語言,大家的理解是怎麼樣的呢?可能也就是塑料袋,廢品,破東西,壞東西。

簡而言之:其實所謂的垃圾也就是沒有任何價值,沒有任何用的東西,那麼gc所回收的垃圾,跟這個一樣麼,往下看。

1.如何判斷它是垃圾?
  • 1
  • 2

剛才已經說了,所謂的垃圾就是沒有用的,而gc要回收的東西,也是類似的

Java通過引用來和物件進行關聯的,操作一個物件,那麼其實是要通過引用來操作的,比如:

User user = new User();

操作物件,其實,我們是使用user這個引用來控制的

比如:user.getAge(); 獲取年齡

那麼顯然意見:這個user物件是有用的,所以它不屬於垃圾,另外這樣產生的一個物件也屬於強引用,而gc一般情況下是不會去回收的。 
PS:如果不瞭解引用,大家可以去了解下強,軟,弱,虛引用的區別。

很簡單,反過來,所謂垃圾:其實就是沒有引用指向這個物件,也就是說該物件已經沒有任何引用,那麼它就是垃圾

四、如何判定是“垃圾”

上面已經做了很清楚的,沒有任何引用,就視為垃圾,所以判定方法如下:

方法一:引用計數演算法
  • 1
  • 2

1.給物件新增計數器—>如果引用—>計數器+1 
2.引用失效—>計數器-1 
3.任何時刻計數器為0—物件不能再使用

這也就是每一個程式執行,Jvm對於生成,而計數器也是獨立的,互不影響

方法二:根搜尋法
  • 1
  • 2

1.GC Roots為起點,從這個節點開始向下搜尋 
2.所走過的路勁,使用Wie引用鏈 
3.物件到GC Roots沒有任何鏈相連,物件不可用

五、那些常見的場景會被回收

如下:

1.物件被賦值null,或者手動釋放
  • 1
  • 2

User user = new User(); 
…. 
user = null;

又如:

Bitmap btimap = Bitmap.createBitmap(src, 0, 0, width, height, m, filter); 
…… 
btimap.recycle();

Android 開發中圖片的釋放

2.弱引用
  • 1
  • 2

果一個物件具有弱引用,在GC執行緒掃描記憶體區域的過程中,不管當前記憶體空間足夠與否,都會回收記憶體,使用弱引用 構建非敏感資料的快取。

弱引用申明:

WeakReferenceweakReference=new WeakReference(new User());

3.虛引用
  • 1
  • 2

如果一個物件僅持有虛引用,在任何時候都可能被垃圾回收,虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列聯合使用,虛引用主要用來跟蹤物件 被垃圾回收的活動。

虛引用申明:

PhantomReference phantomReference=new PhantomReference(new User(),new ReferenceQueue());

六、gc回收器

看到上面,大家對gc有一定的瞭解了,下面我們正式進入大門,去裡面看看,gc到底是如何的…

1.gc的劃分
  • 1
  • 2

新域:儲存所有生成的物件 
舊域:新域中的物件經過幾次gc之後,沒有被回收,進入舊域中 
永久域:儲存類和方法物件,從配置的角度看,這個域是獨立的,不包括在JVM堆內。預設為4M。

如下圖:

這裡寫圖片描述

2.新域
  • 1
  • 2

新域中會被分為三個部分:一個緩衝區,兩個休閒區 
新域中,產生的大部分物件都會被回收,少部分進入舊域

1.第一個部分叫做Eden(伊甸園) 
2.輔助的生成空間(幼兒園) 
    A空間… 
    B空間…

3.舊域
  • 1
  • 2

舊域也被分為幾部分,但是舊域中,存活的物件就比較多,所以,舊域中一般回收的物件會比較少

4.永久域
  • 1
  • 2

一路下來,如果物件還未被回收,那麼久會流入永久域中存起來,並不是物件到這裡了,gc就不去回收了,只是gc不太會去回收這裡面的物件。

七、垃圾回收器演算法+新舊永三域

1.Mark-Sweep演算法
  • 1
  • 2

Mark-Sweep演算法,也稱為:筆記-清除法,這是最基本的垃圾回收器演算法,他過程如下:

1.Mark-Sweep分為:標記階段和清除階段 
2.標記要回收的物件,清除 回收被標記所佔的空間

PS:會導致碎片太多,分配大物件的時候,空間不足,提前觸發一次新的垃圾回收操作

這裡寫圖片描述

1.Copying演算法
  • 1
  • 2

上面說了Mark-Sweep演算法,有很大的問題,請看紅色文字,所以,演算法不停的改進,產生了Copying演算法,具體情況如下:

1.將記憶體分為大小相等的兩塊,每次只使用一塊 
2.將活著的物件複製到另一塊上,使用的清除掉

PS:不容易產生記憶體碎片,但是記憶體會縮減到以前的一半,如果存活物件多,效率會很低,所以可以於新區的時候。

這裡寫圖片描述

3.Mark-Compact演算法
  • 1
  • 2

為了解決,空間浪費的問題,演算法繼續改進,Mark-Compact演算法問世 
具體情況如下:

1.標記階段和Mark-Sweep一樣 
2.完成標記後,不直接清除回收物件,將物件移向一段 
3.清理邊界記憶體

這裡寫圖片描述

4.Generational Collection演算法
  • 1
  • 2

Generational Collection法

分代收集法,聽名字就知道,因為我們根據存活的生命週期分為了:新生代,老年代和永久代,也就是新區,舊區和永久區

具體情況如下:

1.根據存活的生命週期將記憶體分為若干個區:新生代和老年代和永久代 
2.新生代:每次都回收大量物件——>Copying複製法 
3.老年代:每次都回收少量物件——>Mark-Compact法 
4.永久代:儲存class類,常量,方法描述:回收廢棄常量和無用類

分代收集法:也就是Jvm的垃圾回收所使用的演算法,這種演算法,既提高了記憶體空間的使用,而且根據各代的特點,針對處理,減少了cpu的使用率,提高了效能。

以上,差不多就是gc的回收機制了,其實,並沒有結束

這裡裡面還有有些:比如:

1.minor gc/full gc的觸發條件? 
2.OOM的觸發條件? 
3. 如何降低GC的調優的策略? 
4. 頻繁的觸發gc的原因? 
…. 
..

結束。。。 Thanks !

相關推薦

Java GC回收機制總結

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

簡述JAVA GC回收機制,深入理解GC原理

什麼是“GC” 垃圾回收機制。 為什麼要用“GC” 眾所周知,JAVA 這語言,與C語言不同,Java記憶體(堆記憶體)的分配與回收由JVM垃圾收集器自動完成,比如 C語言自己定義的變數,不用時需要 自己回收這個變數 。JAVA 這就是自動完成了,自動檢測,無用的

Java gc回收機制

一、概要垃圾回收又稱gc, gc是執行在Jvm中,回收應用程式中建立的一些無用的物件(學習過Java的人都應該知道)。二、問題概要大家在學習gc的回收機制之前,還是先帶著問題去思考,這樣呢,能在最短的時間內,做到最有效的收穫。1.gc是什麼東西? 2.gc是怎麼樣執行的? 3

Java垃圾回收機制GC

什麼是垃圾(堆): 1、沒有被引用的物件就是垃圾物件 2、所有不再存活的物件 3、沒有物件引用指向原先分配給某個物件的記憶體時(百度百科) Java棧空間垃圾回收: 1、我們定義一些基本型別的變數和對應的變數資料還有物件的引用變數,都在函式的棧記憶體中分配。當在一段程式碼塊定義一

JAVA 垃圾回收機制GC

JVM的堆是Java物件的活動空間,程式中的類的物件從中分配空間,其儲存著正在執行著的應用程式用到的所有物件。 GC的工作目的:在堆中,找到已經無用的物件,並把這些物件佔用的空間收回使其可以重新利用. JVM堆 (1) 新域:儲存所有新成生的物件 (2) 舊域:新域中的物件,經過了一

成為Java GC專家(1):深入淺出Java垃圾回收機制

  對於Java開發人員來說,瞭解垃圾回收機制(GC)有哪些好處呢?首先可以滿足作為一名軟體工程師的求知慾,其次,深入瞭解GC如何工作可以幫你寫出更好的Java應用。   這僅僅代表我個人的意見,但我堅信一個精通GC的人往往是一個好的Java開發者。如果你對GC的處理過程感

成為Java GC專家(2):如何監控Java垃圾回收機制

  本文是成為Java GC專家系列文章的第二篇。在第一篇《深入淺出Java垃圾回收機制》中我們學習了不同GC演算法的執行過程,GC是如何工作的,什麼是新生代和老年代,你應該瞭解的JDK7中的5種GC型別,以及這5種類型對於應用效能的影響。   在本文中,我將解釋JVM到底

Java垃圾回收機制GC

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

Java 垃圾回收機制(以及怎麼減少呼叫GC,提高效能)

 綜合了若干人的blog~ 1. 垃圾回收的意義  在C++中,物件所佔的記憶體在程式結束執行之前一直被佔用,在明確釋放之前不能分配給其它物件;而在Java中,當沒有物件引用指向原先分配給某個物件的記憶體時,該記憶體便成為垃圾。JVM的一個系統級執行緒會自動釋放該記憶體

JavaGC專家(1)—深入淺出Java垃圾回收機制

java性能優化 追蹤 jdk5 structure 每一個 內存管理 過程 hot ati 在學習GC之前,你首先應該記住一個單詞:“stop-the-world”。Stop-the-world會在任何一種GC算法中發生。Stop-the-world意味著 JVM 因為要

深入理解 Java 垃圾回收機制

nbsp 循環引用 方式 不同的 整理 一個 復制 垃圾回收機制 提高 垃圾回收機制中的算法: 1.引用計數法:無法檢測出循環引用。如父對象有一個對子對象的引用,子對象反過來引用父對象。這樣,他們的引用計數永遠不可能為0. 2 標記-清除算法:采用從根集合進行掃描,對存活

轉:深入淺出Java垃圾回收機制

但是 enter 相關 html 帶來 生命周期 不同 追蹤 lee 原文鏈接:http://www.importnew.com/1993.html 對於Java開發人員來說,了解垃圾回收機制(GC)有哪些好處呢?首先可以滿足作為一名軟件工程師的求知欲,其次,深入了解GC如

細述 Java垃圾回收機制→Types of Java Garbage Collectors

ade con -s 通過 分享 釋放 數組 collect 程序員 細述 Java垃圾回收機制→Types of Java Garbage Collectors 轉自:https://segmentfault.com/a/1190000006214497

java垃圾回收機制的使用

checkout ati pub bool logs int [] ring static public class Test { public static void main(String[] args) throws Exception {

Java 垃圾回收機制(早期版本)

重新 速度 交互 綜合 技術 -1 遍歷 我們 後臺 Java 垃圾回收機制在我們普通理解來看,應該視為一種低優先級的後臺進程來實現的,其實早期版本的Java虛擬機並非以這種方式實現的。 先從一種很簡單的垃圾回收方式開始。 引用計數   引用計數是一種簡單但是速度很慢

java垃圾回收機制和調優

user 機制 xmx erp 存儲 這樣的 其他應用 pan time                           java垃圾回收機制和調優 gc即垃圾收集機制是指jvm用於釋放那些不再使用的對象所占用的內存。java語言並不要求jvm有gc,也沒有規定gc如何

深入解析Java垃圾回收機制

normal tor 技術分享 統計分析 time method 堆內存 出棧 類結構 引入垃圾回收 哪些內存需要回收? 引用計數法 可達性分析 如何回收 Marking 標記 Normal Deletion 清除 Deletion with Compacting 壓縮

Java 垃圾回收機制

導致 垃圾回收 事件 相互 等於 理論 不同 基礎 其中 1.如何確定對象是個垃圾?   引用計數法:實現簡單、效率高,但是如何兩個對象同時等於null,他們會相互引用,導致他們的引用計數都不為0,永遠不會被回收。   可達性分析法: 2.典型的垃圾收集算法   標記-清楚

成為JavaGC專家(3)—如何監控Java垃圾回收機制(轉載)

生成 head builder 清除 內存清理 每次 com con book 原文:http://www.importnew.com/3146.html 為什麽需要優化GC 或者說的更確切一些,對於基於Java的服務,是否有必要優化GC?應該說,對於所有的基於Java的服

Java垃圾回收機制

位置 永久代 map 大小 ocl html init nfa 壓縮 1.前言   本文歸納一下對Java內存管理機制的理解,盡可能通俗易懂,知識來自於深入理解Java虛擬機一書。 2.起源   計算機簡單理解就是根據執行計劃,通過參數得到結果。執行計劃就是程序了,參數就是