1. 程式人生 > >java GC工作機制

java GC工作機制

  GC:垃圾回收站,是將java的無用的堆物件進行清理,釋放記憶體,以免發生記憶體洩露。在介紹java回收站前,首先介紹下幾種回收機制

  1. 引用計數:

  當一個物件A被其他物件B引用時,物件A引用+1,斷開引用則-1,GC工作時,會檢查所有物件中的引用計數,如果為0則代表要清除,>0則表示有其他物件引用不能清除。這種機制有一個致命缺點,就是當兩個物件互引用時,在遍歷時可能會發生這兩個物件引數永遠不為0,則永遠不會被刪除。此機制java從不使用。

  2. 停止-複製:

程式暫停執行,啟動GC,GC從堆或靜態儲存區開始遍歷所有物件,判斷物件是否“活”的物件,如果是活不刪除,反之刪除。判斷是否“活”就是判斷該物件是否有被其他物件引用,從鏈上去查詢。當是活物件時,GC會從另外堆裡開避一個大空間,然後將活物件複製一份到新空間裡,在複製時按著緊密排列,同時更新所有引用地址為新的地址,不活物件原封不動。遍歷完後,再遍歷一次,這次是將不活的物件徹底給刪除。

  優點:所有物件能夠重新緊密排列,不會出現記憶體碎片,這對以後建立物件能提供更快的效率。

  缺點:佔用的記憶體空間大,要原物件的2倍空間;這種模式無論如何所有活的物件都要複製一份,假設遍歷到最後,物件很穩定,只出現少量垃圾物件或者根本沒垃圾物件,這時已經做了複製工作,浪費了資源。

  3. 標記-刪除:

程式暫停執行,啟動GC,GC從堆或靜態儲存區開始遍歷所有物件,判斷物件是否“活”的物件,如果是活不刪除,反之刪除。判斷是否“活”就是判斷該物件是否有被其他物件引用,從鏈上去查詢。當是活物件時,會給物件給個標記符號,死物件則不標記,遍歷完後,第二次遍歷時,只保留標記的物件,把所有沒標記的物件都刪除。

  以上第2和第3種都是要遍歷兩次,而且都是最後一次才執行真正刪除,比起第1種來說要慢很多,因為要遍歷2次,尤其是第2種,還要複製動作,但這2種歸避了第1種的致命缺點。

  早期的jvm採用的是標記-刪除模式,繼java5後,jvm採用自適應技術,就是根據自身狀態情況,在”停止-複製“和”標記-刪除“自動切換以達到最快效率。在第1遍歷時,如果確定物件需要回收,則會先執行物件的finalize()方法。

  java GC具體工作原理:

  JVM分配記憶體是以較大的塊為單位,如果物件為較大,則該物件本身為一個塊。GC先啟動“停止-複製”模式,遍歷物件時,遇到活物件,則把物件複製到新塊裡,同時塊代數+1,如果物件較大,則保持不動,代數+1;如果檢測到垃圾物件稀少,則自動切換到“標記-刪除”模式,如果檢測到物件分佈到記憶體太零散,則又會自動切換到“停止-複製”模式來重新整理記憶體緊密分佈。這就是自適應技術。

  JVM分配記憶體時,有一個堆指標,堆指標指向當前最後一個被分配的記憶體塊,由於“停止-複製”模式,物件大部分都是連續排列的,則堆指標移動下一格,就是尚未分配的記憶體,這時就不用在整個堆空間裡查詢未分配的記憶體了,這對建立速度有很大提高。

  關於物件的finalize()方法:

finalize方法是指物件完成時執行的一些清理工作,是Object裡的受保護方法,在外界不能呼叫。實質上這個方法是給GC呼叫的,什麼時候呼叫以上有講。此方法是強調進一步物件需要釋放非託管物件,是一個檢測保險的作用,比如一個類裡包含訪問一個流內容,如下:

class AccessStream
{
private InputStream stream;

private boolean isClose = false;

/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable
{
if (!isClose)
{
stream.close();
}
super.finalize();
}
}

   此類在操作流完後,正確作法是,應該即時關閉流(呼叫close());有時因為程式設計師某些租心大意原因,並沒及時關閉流,這時重寫finalize() 作最後保險作用,當沒有關閉時,釋放此物件前關閉流。

  通常不建議重寫finalize,除了要求程式設計師嚴格習慣,最重要的是finalize並不能馬上執行,即使是顯式呼叫System.gc() 也不保證立刻執行,只能說建議GC執行,GC是否要執行,要看當前記憶體佔用量等因素。如果finalize不能馬上執行,這就意味著本來應該早點釋放流,而出現很長時間才釋放。

相關推薦

Java GC工作機制 //TODO

感謝 千古壹號 公眾號的分享 以下為自己看了這篇文章後的整理記錄,方便記憶及複習。 GC的概念 GC:Garbage Collections 字面意思是垃圾回收器,釋放垃圾佔用的空間。讓建立的物件不需要像c、c++那樣需要程式設計師手動的delete、free掉

簡述java GC工作機制原理,或你瞭解的GC演算法?

  GC:垃圾回收站,是將java的無用的堆物件進行清理,釋放記憶體,以免發生記憶體洩露。在介紹java回收站前,首先介紹下幾種回收機制  1. 引用計數:  當一個物件A被其他物件B引用時,物件A引用+1,斷開引用則-1,GC工作時,會檢查所有物件中的引用計數,如果為0則代表要清除,>0則表示有其他物

java GC工作機制

  GC:垃圾回收站,是將java的無用的堆物件進行清理,釋放記憶體,以免發生記憶體洩露。在介紹java回收站前,首先介紹下幾種回收機制   1. 引用計數:   當一個物件A被其他物件B引用時,物件A引用+1,斷開引用則-1,GC工作時,會檢查所有物件中的引用計數,如果為0則代表要清除,>0則表示

JVM結構、GC工作機制詳解

固定 本地方法棧 內存池 為什麽 water aml 並且 兩種 數據區 轉自:http://blog.csdn.net/tonytfjing/article/details/44278233 JVM結構、內存分配、垃圾回收算法、垃圾收集器。下面我們一一來看。 一、JVM結

JVM、Gc工作機制詳解

相同 生命 棧幀 VM 每次 失效 劃分 地址 .com JVM主要包括四個部分: 類加載器(ClassLoad) 執行引擎 內存區: 本地方法接口:類似於jni調本地native方法 內存區包括四個部分: 1.方法區:包含了靜態變量、常量池、構造函數等

業余草分享面試題,JVM結構、GC工作機制詳解

影響 根節點 tac 關註 共享 產生 我想 tar 效果 題外話:最近在應聘阿裏2015暑期實習,感觸頗多。機會總是留給有準備的人的,所以平常一定要註意知識的鞏固和積累。知識的深度也要有一定的理解,不比別人知道的多,公司幹嘛選你?關於JVM和GC,我相信學java的絕大部

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

GC工作機制詳解

一、JVM結構 根據《java虛擬機器規範》規定,JVM的基本結構一般如下圖所示: 從左圖可知,JVM主要包括四個部分: 1.類載入器(ClassLoader):在JVM啟動時或者在類執行時將需要的class載入到JVM中。(右圖表示了從java原始檔到JVM的整

Java NIO工作機制簡介

前言 本部落格只簡單介紹NIO的原理實現和基本工作流程 I/O和NIO的本質區別 NIO將填充和提取緩衝區的I/O操作轉移到了作業系統 I/O 以流的方式處理資料,而 NIO 以緩衝區的方式處理資料;IO是阻塞的,NIO是非阻塞的,直到有資料被讀取或

了解一下JVM和GC工作機制

今天 載器 執行c 運行時常量 引擎 ati 局部變量 容易 ive 題外話:很久沒有寫博客了,事情頗多,今天空閑下來,學習一下順便寫一下自己的了解,機會總是留給有準備的人,所以平常一定要註意知識的鞏固和積累。知識的深度也要有一定的理解,不比別人知道的多,公司幹嘛選你?

Java垃圾回收(GC機制詳解

nbsp 引用計數 維護 png 對象 最新 新的 com 前沿 垃圾回收算法有兩種,根據不同的虛擬機策略不同 1、引用計數法 2、可達性分析法 由於我們平常使用的hotspot虛擬機用的是第二種。 那哪些是可達的呢? 這個算法的基本思想是通過一系列稱為“GC Roots”

[Java]I/O底層原理之二:Socket工作機制

tcp連接 fin 連接建立 src 並發 如果 send rec 轉換 一、TCP狀態轉化 TCP連接的狀態轉換圖如下 註:SYN 表示建立鏈接、FIN 表示關閉鏈接、ACK 表示響應、PSH 表示有數據傳輸、RST 表示鏈接重置。 CLOSED:初始狀態,在超時或

轉發Java GC - 垃圾回收機制

devel 時間段 first 並行 不能 lean com ring 更新 1、簡介 對於Java developer來說,了解JVM GC工作原理能夠幫助我們開發出更優秀的應用,同時在處理JVM瓶頸時能夠更加自由。在最近一年的應用開發中能體會到這些知識帶來的好處

Android內存優化1 了解java GC 垃圾回收機制3

速度 一個 這就是 並發 mod class 授權 回收 collector 引言 接App優化之內存優化(序), 作為App優化系列中內存優化的一個小部分. 由於內存相關知識比較生澀, 內存優化中使用到的相關工具, 也有很多專有名詞. 對Java內存管理, GC, A

【轉】Java學習---HashMap和HashSet的內部工作機制

link 實踐 離散 val 數據結構 結構 通過 如何 factor 【原文】https://www.toutiao.com/i6593863882484220430/ HashMap和HashSet的內部工作機制 HashMap 和 HashSet 內部是如何工作的?散

Java垃圾回收機制GC

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

Java虛擬機器 :Java垃圾回收(GC機制詳解

轉自:http://www.importnew.com/28413.html 哪些記憶體需要回收? 哪些記憶體需要回收是垃圾回收機制第一個要考慮的問題,所謂“要回收的垃圾”無非就是那些不可能再被任何途徑使用的物件。那麼如何找到這些物件? 1、引用計數法 這個演算法的實現是,給物件中新

Java GC 垃圾收集機制解讀

Java垃圾回收概況 Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫記憶體回收和垃圾清理代 碼,對記憶體洩露和溢位的問題,也不需要像C程式設計師那樣戰