Java GC機制簡要總結(Java垃圾回收的基本工作原理)

来源:https://www.cnblogs.com/osirisrx/archive/2019/05/07/mrx.html
-Advertisement-
Play Games

第一次編輯 2019-05-07 01:09:39 垃圾回收的對象 程式中的不可用對象(不存活的對象,沒有任何引用),或者無用的變數信息等,在程式中長期存在會逐漸占用較多的記憶體空間,導致沒有足夠的空間分配給新生成的對象等. 判斷哪些是需要回收的對象 早期jdk使用引用計數法,計數每個對象的引用次數, ...


第一次編輯  2019-05-07  01:09:39

垃圾回收的對象

程式中的不可用對象(不存活的對象,沒有任何引用),或者無用的變數信息等,在程式中長期存在會逐漸占用較多的記憶體空間,導致沒有足夠的空間分配給新生成的對象等.

判斷哪些是需要回收的對象

早期jdk使用引用計數法,計數每個對象的引用次數,對於沒有引用的對象進行刪除,但是該方法無法處理迴圈引用情況.

之後引入了可達性分析演算法,將所有的引用關係看作一張圖,從一個結點(GC ROOT)開始,尋找向下的引用結點,之後重覆這一過程,其中的路徑被稱為引用鏈,當一個對象沒有與GC ROOT相連的引用鏈時,該對象是不可用的

執行回收的時間

在CPU空閑時自動回收,或在堆記憶體滿後進行回收,或者程式中調用System.gc()後進行回收

執行回收的演算法

共有四種

  1. 1.      標記-清除演算法

      分兩步執行,首先標記,根據可達性分析標記出所有需要回收的對象,之後對被標記的對象進行回收.

      該方法不需要移動對象,只對不可用對象操作,較為簡單.但是一般情況下,效率較低,同時由於直接回收垃圾,會產生記憶體碎片,後續為較大對象分配空間時,可能因為無法找到較大的連續記憶體空間而必須再次進行垃圾回收過程

  1. 2.      複製演算法

      將可用的記憶體按照容量大小等分,每次只使用一塊空間進行分配,當這一塊用完時,將可用對象移動到另一塊空間上,然後清理已經用過的空間.

      該方法每次只需要對一半的空間進行回收,同時解決了記憶體碎片的問題.但是使用中浪費了一半的記憶體空間,在可用對象較多的情況下需要進行較多的複製,效率降低.

  1. 3.      標記-整理演算法

      標記-清除法的改進.在使用標記-清除演算法回收不可用對象後,將所有可用的對象壓縮到記憶體的一端,之後清理端邊界之外的所有記憶體.

      該方法解決了記憶體碎片的問題,但是增加了對象移動的過程,執行的成本較高

  1. 4.      分代收集演算法

      目前主要使用的方法

      根據對象存活的周期將記憶體(堆)分為多塊,一般是新生代,老年代和永生代(永久代).在不同的代使用不同的收集器(收集器使用不同的演算法)進行回收,提高效率.

      新生代

      儘快的收集生命周期短的對象.新生代內部一般被分為三個部分,分別是Eden區,survivor0區和survivor1區,分配的比例為8:1:1.新產生的對象首先被放置到Eden區,當該區被放置滿之後,將該區的存活對象移動到survivor0區,之後清空Eden區,當survivor0區也被放置滿時,將Eden區和survivor0區存活對象複製到survivor1區,之後清空Eden區和survivor0區.,交換survivro0區和survivor1區,即保持survivor1區為空,之後重覆該過程.

      當survivor1區不夠存放eden區和survivor0區的存活對象時,將這些對象放入老年代.

      在這個過程中的垃圾回收過程被稱為Minor GC(小型垃圾回收),該過程發生比較頻繁,不一定嚴格等待eden區滿才執行.該回收過程發生時,所有程式線程暫停,直到完成回收工作,是Stop the world(STW)事件的一種.

      老年代

      存放生命周期較長的對象.老年代的空間較新生代大,當老年代滿時觸發Major GC,該過程同樣導致STW,並且時間比Minor GC更長.

      永久代

      存放靜態文件,如類或方法等.一些運行過程中動態生成的類會被放置到這裡.

           各代使用不同的回收器,新生代使用應用複製演算法的收集器,老年代使用應用標記-清除或標記-整理演算法的收集器

              Java8廢棄了永久代,用元空間進行代替;在JDK1.7中推出了新的G1收集器.

 

參考如下

 https://baijiahao.baidu.com/s?id=1610753983428990724&wfr=spider&for=pc

 https://blog.csdn.net/weixin_39067991/article/details/81045201

 https://blog.csdn.net/w372426096/article/details/81360083

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在APP的開發是愈發平常的事了,可是如何讓自己的APP真正留在用戶手機上,關鍵還是質量問題。 ...
  • gRPC全局異常捕獲 引 一般的.net項目比如ASP.NET、控制台程式、Windows服務、桌面程式等都會有framework自帶的全局異常捕獲機制。ASP.NET的ExceptionFilterAttribute,控制台和Windos服務的AppDomain.CurrentDomain.Unh ...
  • 組合模式概述 定義:組合多個對象形成樹形結構以表示具有部分-整體關係的層次結構。組合模式讓客戶端可以統一對待單個對象和組合對象。又被成為“部分-整體”(Part-Whole)模式,屬於對象結構性模式 定義什麼的,最枯燥了。簡單的來說,就如我們滑鼠右擊新建文件夾一樣,在一個磁碟里,我們可以新建一個文件 ...
  • 這篇我們學習的是單例模式,相信很多朋友都或多或少使用過這個模式。很多設計模式的入門,都把單例模式作為第一個的,但是因為我們是跟著書本學習,所以放在了第五個裡面。那麼,你使用過的單例模式是怎麼樣的呢?懶漢式?餓漢式?雙重校驗?靜態? 先來看下定義,單例模式(Singleton Pattern): 用來 ...
  • 命名的註意事項: 命名要有實際含義 命名風格保持一致 不用拼音命名 不用語言關鍵字 適當的使用註釋 好的代碼應該是自描述的 難以理解的地方加上註釋 函數的功能加上註釋說明 類的功能和使用方法加註釋 多備份重要的代碼 代碼不能只有一份 啟用編譯器的自動備份 用代碼管理工具備份 堅持字元編碼統一 PHP ...
  • 1. 在開發機上的準備工作 2. 在伺服器上的準備工作 3.安裝uwsgi 4.編寫uwsgi配置文件,使用配置文件啟動uwsgi 5. 安裝nginx 6. 收集靜態文件 7. 編寫nginx配置文件: 8. 使用supervisor配置 1. 在開發機上的準備工作 git init git re ...
  • 01、Lombok 的自我介紹 Lombok 在官網是這樣作自我介紹的: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boil ...
  • Python編程實現對視頻文件進行剪切的功能。截取指定長度的視頻並保存,運行後首先選擇要裁剪的視頻,然後輸入開始時間點和停止時間點即可。將剪切後的視頻保存為output.avi文件 Python編程實現對視頻文件進行剪切的功能。截取指定長度的視頻並保存,運行後首先選擇要裁剪的視頻,然後輸入開始時間點 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...