1. 程式人生 > >圖解 Java 垃圾回收機制,寫得非常好!

圖解 Java 垃圾回收機制,寫得非常好!

原文:https://dwz.cn/UrCZL9XA

譯文:https://dwz.cn/tlhgis7R

翻譯:Rhys_Lee, AzureSora, 溪邊九節, 小小菜鳥雞

Java架構/分散式:705127209(大牛交流群)沒有開發經驗勿加!

什麼是自動垃圾回收?

自動垃圾回收是一種在堆記憶體中找出哪些物件在被使用,還有哪些物件沒被使用,並且將後者刪掉的機制。

所謂使用中的物件(已引用物件),指的是程式中有指標指向的物件;而未使用中的物件(未引用物件),則沒有被任何指標給指向,因此佔用的記憶體也可以被回收掉。

在用 C 之類的程式語言時,程式設計師需要自己手動分配和釋放記憶體。而 Java 不一樣,它有垃圾回收器,釋放記憶體由回收器負責。本文接下來將介紹垃圾回收機制的基本過程。

第一步:標記

垃圾回收的第一步是標記。垃圾回收器此時會找出哪些記憶體在使用中,還有哪些不是。

上圖中,藍色表示已引用物件,橙色表示未引用物件。垃圾回收器要檢查完所有的物件,才能知道哪些有被引用,哪些沒。如果系統裡所有的物件都要檢查,那這一步可能會相當耗時間。

第二步:清除

這一步會刪掉標記出的未引用物件。

記憶體分配器會保留指向可用記憶體的引用,以供分配新物件。

壓縮

為了提升效能,刪除了未引用物件後,還可以將剩下的已引用物件放在一起(壓縮),這樣就能更簡單快捷地分配新物件了。

為什麼需要分代垃圾收集?

之前說過,逐一標記和壓縮 Java 虛擬機器裡的所有物件非常低效:分配的物件越多,垃圾回收需時就越久。不過,根據統計,大部分的物件,其實用沒多久就不用了。

來看個例子吧。(下圖中,豎軸代表已分配的位元組,而橫軸代表程式執行時間)

上圖可見,存活(沒被釋放)的物件隨執行時間越來越少。而圖中左側的那些峰值,也表明了大部分物件其實都挺短命的。

JVM 分代

根據之前的規律,就可以用來提升 JVM 的效率了。方法是,把堆分成幾個部分(就是所謂的分代),分別是新生代、老年代,以及永生代。

新物件會被分配在新生代記憶體。一旦新生代記憶體滿了,就會開始對死掉的物件,進行所謂的小型垃圾回收過程。一片新生代記憶體裡,死掉的越多,回收過程就越快;至於那些還活著的物件,此時就會老化,並最終老到進入老年代記憶體。

Stop the World 事件—— 小型垃圾回收屬於一種叫 "Stop the World" 的事件。在這種事件發生時,所有的程式執行緒都要暫停,直到事件完成(比如這裡就是完成了所有回收工作)為止。

老年代用來儲存長時間存活的物件。通常,設定一個閾值,當達到該年齡時,年輕代物件會被移動到老年代。最終老年代也會被回收。這個事件成為 Major GC。

Major GC 也會觸發STW(Stop the World)。通常,Major GC會慢很多,因為它涉及到所有存活物件。所以,對於響應性的應用程式,應該儘量避免Major GC。還要注意,Major GC的STW的時長受年老代垃圾回收器型別的影響。

永久代包含JVM用於描述應用程式中類和方法的元資料。永久代是由JVM在執行時根據應用程式使用的類來填充的。此外,Java SE類庫和方法也儲存在這裡。

如果JVM發現某些類不再需要,並且其他類可能需要空間,則這些類可能會被回收。

世代垃圾收集過程

現在你已經理解了為什麼堆被分成不同的代,現在是時候看看這些空間是如何相互作用的。 後面的圖片將介紹JVM中的物件分配和老化過程。

首先,將任何新物件分配給 eden 空間。 兩個 survivor 空間都是空的。

當 eden 空間填滿時,會觸發輕微的垃圾收集。

引用的物件被移動到第一個 survivor 空間。 清除 eden 空間時,將刪除未引用的物件。

在下一次Minor GC中,Eden區也會做同樣的操作。刪除未被引用的物件,並將被引用的物件移動到Survivor區。然而,這裡,他們被移動到了第二個Survivor區(S1)。

此外,第一個Survivor區(S0)中,在上一次Minor GC倖存的物件,會增加年齡,並被移動到S1中。待所有幸存物件都被移動到S1後,S0和Eden區都會被清空。注意,Survivor區中有了不同年齡的物件。

在下一次Minor GC中,會重複同樣的操作。不過,這一次Survivor區會交換。被引用的物件移動到S0,。倖存的物件增加年齡。Eden區和S1被清空。

 此幻燈片演示了 promotion。 在較小的GC之後,當老化的物體達到一定的年齡閾值(在該示例中為8)時,它們從年輕一代晉升到老一代。

隨著較小的GC持續發生,物體將繼續被推廣到老一代空間。

所以這幾乎涵蓋了年輕一代的整個過程。 最終,將主要對老一代進行GC,清理並最終壓縮該空間。

相關推薦

圖解 Java 垃圾回收機制非常

原文:https://dwz.cn/UrCZL9XA 譯文:https://dwz.cn/tlhgis7R 翻譯:R

圖解CMS垃圾回收機制你值得擁有

簡書 佔小狼,轉載請註明原創出處,謝謝! 最近在整理JVM相關的PPT,把CMS演算法又過了一遍,每次閱讀原始碼都能多瞭解一點,繼續堅持。 什麼是CMS CMS全稱 Concurrent Mark Sweep,是一款併發的、使用標記-清除演算法的垃圾回收器, 如果老年代使用

圖解Java 垃圾回收機制

摘要:   Java技術體系中所提倡的 自動記憶體管理 最終可以歸結為自動化地解決了兩個問題:給物件分配記憶體 以及 回收分配給物件的記憶體,而且這兩個問題針對的記憶體區域就是Java記憶體模型中的 堆區。關於物件分配記憶體問題,筆者的博文《JVM 記憶體模型概述》已經闡述了 如何劃分可用空間及其涉及到的

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

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

java中存在垃圾回收機制但是還會有內存泄漏的問題原因是

java 自己 data .so 這樣的 即使 垃圾 ref stack 答案是肯定的,但不能拿這一句回答面試官的問題。分析:JAVA是支持垃圾回收機制的,在這樣的一個背景下,內存泄露又被稱為“無意識的對象保持”。如果一個對象引用被無意識地保留下來,那麽垃圾回收器不僅不會處

要想學好Java程式設計構造器、方法過載、this關鍵字、垃圾回收機制這4關一定要過

有人說,你應該關注時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式設計師的圈子真的很小,即便是像鴻祥那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,我都不愛看! 我想說,你們

要想學好Java編程構造器、方法重載、this關鍵字、垃圾回收機制這4關一定要過

社會 tor 沒有 type 遇到 一個 結果 回收 爆笑 有人說,你應該關註時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程序員的圈子真的很小,即便是像鴻洋那樣的招牌大牛,文章是那麽的幹貨,瀏覽量有多少?不到萬吧;有

Java記憶體洩漏問題--java既然存在垃圾回收機制為什麼還存在記憶體洩漏?

1.什麼叫記憶體洩漏? 簡單來說就是一個東西放在記憶體裡的時間太長了,當你的程式都跑完了,它還存在那裡。這時它是白白的佔用了你的記憶體,累積起來佔用的記憶體越來越多……最後就會導致JVM報錯:out of memory。他佔用的是我們的實體記憶體。 2.java記憶體洩漏的根本原因是? 記

java垃圾回收機制什麼物件會被回收掉?

從GC-root搜尋不到,而且經過第一次標記,清理後,仍然沒有復活的物件。http://www.importnew.com/21492.htmlhttps://www.cnblogs.com/xiaoxi/p/6486852.html

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的服