1. 程式人生 > >gc運作流程和底層實現

gc運作流程和底層實現

 Garbage Collection簡稱為GC,即垃圾回收。記憶體處理器是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰。Java語言提供的GC功能可以自動的檢測物件是否超過作用域,從而達到自動回收記憶體的目的,java語言沒有提供釋放已分配記憶體的顯示操作方法,資源回收工作全部交由GC來完成,程式設計師不能精確的控制垃圾回收的時機。

GC在實現垃圾回收時的基本原理:

    Java的記憶體管理實際就是物件的管理,其中包括對像的分配和釋放。對於程式設計師來說,分配物件使用new關鍵字,釋放物件時只是將物件賦值為null,讓程式設計師不能夠再訪問到這個物件,該物件被稱為“不可達”。GC將負責回收所有“不可達”物件的記憶體空間。

  對於GC來說,當程式設計師建立物件時,GC就開始監控這個物件地址、大小以及使用情況。通常GC採用有向圖的方式記錄並管理堆中的所有物件,通過這種方式確定哪些物件是“可達”的,哪些物件是“不可達”的。當GC確定一些物件為“不可達時”GC就有責任回收這些記憶體空間,但為了GC能夠在不同的平臺上實現,java規範對GC的很多行為都沒有進行嚴格的規定。例如對於採用什麼型別的回收演算法、什麼時候進行回收等重要問題都沒有明確的規定,因此不同的JVM實現著不同的的實現演算法,這也給JAVA程式設計師的開發帶來了很多不確定性。

     根據GC的工作原理,可以通過一些技巧讓GC執行更加高效合理。如下:

1、儘早釋放無用物件的引用,特別注意一些複雜物件,如陣列,佇列等。對於此類物件,GC回收它們的效率一般較低,如果程式允許,應儘早將不用的引用物件賦為null,這樣可以加速GC的工作。

2、儘量少用finalize函式。finalize是java提供給程式設計師用來釋放物件或資源的函式,但是它會加大GC的工作量,因此儘量少採用finalize函式回收資源。 當程式有一定的等待時間,程式設計師可以手動執行System.gc(),通知GC執行,但是java語言規範並不保證GC一定會執行。

finalize是方法名,java技術允許使用finalize()方法在垃圾收集器從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件的呼叫的。它是在Object類定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者執行其他清理工作。finalize()方法是在垃圾收集器刪除物件之前對這個物件的呼叫的。

想要知道更多,推薦:JVM結構、GC工作機制詳解 - CSDN部落格 https://blog.csdn.net/tonytfjing/article/details/44278233

相關推薦

gc運作流程底層實現

 Garbage Collection簡稱為GC,即垃圾回收。記憶體處理器是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰。Java語言提供的GC功能可以自動的檢測物件是否超過作用域,從而達到自動回收記憶體的目的,java語言沒有提供

9.3-全棧Java筆記:List接口常用實現類的特點底層實現

java上節我們講到「List接口的特點和常用方法」,本節接著上節的內容繼續深入學習。課前回顧: List接口常用的實現類有3個:ArrayList、LinkedList、Vector。那麽它們的特點和底層實現有哪些呢?ArrayList特點和底層實現ArrayList底層是用數組實現的存儲。特點:查詢效率高

Java並發機制底層實現原理

差距 32處理器 們的 trac 結點 exce jdk cep 定性   Java代碼在編譯後會變成Java字節碼,字節碼被類加載器加載到JVM裏,JVM執行字節碼轉化為匯編指令在CPU上執行。Java中的並發機制依賴於JVM的實現和CPU的指令。      Java語言

JMM底層實現原理

現代計算機物理上的記憶體模型 物理機遇到的併發問題與虛擬機器中的情況有不少相似之處,物理機對併發的處理方案對於虛擬機器的實現也有相當大的參考意義。 其中一個重要的複雜性來源是絕大多數的運算任務都不可能只靠處理器“計算”就能完成,處理器至少要與記憶體互動,如讀取運算資料、儲存運算結果

java的知識點23——泛型Generics、Collection介面、List特點常用方法、 ArrayList特點底層實現

泛型Generics 一般通過“容器”來容納和管理資料。程式中的“容器”就是用來容納和管理資料。 陣列就是一種容器,可以在其中放置物件或基本型別資料。 陣列的優勢:是一種簡單的線性序列,可以快速地訪問陣列元素,效率高。如果從效率和型別檢查的角度講,陣列是最好的。 陣列的劣勢:不靈活。

深入理解String、StringBuffer、StringBuilder區別底層實現

public static void main(String[] args) { /** * 情景一:字串池 * JAVA虛擬機器(JVM)中存在著一個字串池,其中儲存著很多String物件;

HashTable原理底層實現

1. 概述 上次討論了HashMap的結構,原理和實現,本文來對Map家族的另外一個常用集合HashTable進行介紹。HashTable和HashMap兩種集合非常相似,經常被各種面試官問到兩者的區別。 對於兩者的區別,主要有以下幾點: HashMap是非同步的,

traceroute使用底層實現

traceroute:https://blog.csdn.net/microtong/article/details/3220450 traceroute原始碼剖析:https://blog.csdn.net/ooooo12345re/article/details/51603353 tra

List介面常用實現類的特點底層實現

List介面常用的實現類有3個:ArrayList、LinkedList、Vector。 那麼它們的特點和底層實現有哪些呢? ArrayList特點和底層實現 ArrayList底層是用陣列實現的儲存。 特點:查詢效率高,增刪效率低,執行緒不安全。我們一般使用它。 圖1 檢視原始碼

[Android] 徹底瞭解Binder機制原理底層實現

1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的差別,瞭解為什麼Android會另起爐灶,採用Binder。接著,會根據 Binder的機制,去理解什麼是Service Manager,在C/S模型中扮演什麼角色。最後,會從一次完整的通訊活動中,去理解Binder通訊

徹底瞭解Binder機制原理底層實現

轉載地址: http://www.2cto.com/kf/201606/515548.html http://www.2cto.com/kf/201606/515548.html 1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的

LinkedHashMap原理底層實現

1.概述 在使用HashMap的時候,可能會遇到需要按照當時put的順序來進行雜湊表的遍歷。通過上篇對HashMap的瞭解,我們知道HashMap中不存在儲存順序的機制。本篇文章要介紹的LinkedHashMap專為此特性而生。在LinkedHashMap中可以保持兩種順序

面試官:說說一條查詢sql的執行流程底層原理?

序章 自我介紹 我是一條sql,就是一條長長的字串,不要問我長什麼樣,因為我比較傲嬌。   額~~不是我不

Java併發程式設計系列-(8) JMM底層實現原理

8. JMM和底層實現原理 8.1 執行緒間的通訊與同步 執行緒之間的通訊 執行緒的通訊是指執行緒之間以何種機制來交換資訊。在程式設計中,執行緒之間的通訊機制有兩種,共享記憶體和訊息傳遞。 在共享記憶體的併發模型裡,執行緒之間共享程式的公共狀態,執行緒之間通過寫-讀記憶體中的公共狀態來隱式進行通訊,典型的

Java 中級 學習筆記 1 JVM的理解以及新生代GC處理流程常量池、執行時常量池、字串常量池的理解

寫在最前 從畢業到現在已經過去了差不多一年的時間,工作還算順利,但總是離不開CRUD ,我覺得這樣下去肯定是不行的,溫水煮青蛙,勢必有一天,會昏昏沉沉的迷失在溫水裡。所以,需要將之前學習JAVA 當中一些中高階部分的知識需要進行學習和記錄,並將其整理部落格,一起成長,一起努力。 JVM JAVA虛擬機器在執行

初探ASP.NET Core 3.x (3) - Web的運作流程ASP.NET Core的運作結構

本文地址:https://www.cnblogs.com/oberon-zjt0806/p/12215717.html 注意:本篇大量地使用了mermaid繪製圖表,載入需要較長的時間,請見諒 [TOC] O 前請提要 在第1期中,我們通過一個簡單的過程構建了一個ASP.NET的初始專案,當然,實際上

prototypenew的底層實現

bject span console prot pan var col tor 包含 <script type="text/javascript"> function A(){ this.name = "jack

android原生熱修復流程原理分析實現

首先apk就是一個壓縮檔案,解壓apk檔案的內容如下圖: 安卓原生熱修復主要原理圖和流程圖如下,我花了好長時間才繪好,中間改了好幾次,應該來說是很直觀明白的,其中有截取了BaseDexClassLoader的關鍵原始碼,還有DexPathList的原始碼 a.現將打

HashMap的實現原理底層結構 圖解+原始碼分析

 雜湊表(hash table)也叫散列表,是一種非常重要的資料結構,應用場景及其豐富,許多快取技術(比如memcached)的核心其實就是在記憶體中維護一張大的雜湊表,而HashMap的實現原理也常常出現在各類的面試題中,重要性可見一斑。本文會對java集合框架中的對應實現HashMap的實現原理

.集合Set,HashSet,TreeSet及其底層實現HashMap紅黑樹;Collection總結

ONE.Set集合 one.Set集合的特點  無序,唯一 TWO.HashSet集合 1.底層資料結構是雜湊表(是一個元素為連結串列的陣列) 2.那麼HashSet如何來實現元素的唯一性的呢? 通過一HashSet新增字串的案例檢視HashSet中add()的原始碼,