91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Java 垃圾回收機制

發布時間:2021-11-20 15:17:14 來源:億速云 閱讀:117 作者:柒染 欄目:軟件技術

怎么理解Java 垃圾回收機制,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

什么是自動垃圾回收

自動垃圾回收是一種在堆內存中找出哪些對象在被使用,還有哪些對象沒被使用,并且將后者刪掉的機制。

所謂使用中的對象(已引用對象),指的是程序中有指針指向的對象;而未使用中的對象(未引用對象),則沒有被任何指針給指向,因此占用的內存也可以被回收掉。

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

第一步:標記

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

怎么理解Java 垃圾回收機制

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

第二步:清除

這一步會刪掉標記出的未引用對象。

怎么理解Java 垃圾回收機制

內存分配器會保留指向可用內存的引用,以供分配新對象。

壓縮

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

怎么理解Java 垃圾回收機制

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

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

來看個例子吧。(下圖中,豎軸代表已分配的字節,而橫軸代表程序運行時間)

怎么理解Java 垃圾回收機制

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

JVM 分代

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

怎么理解Java 垃圾回收機制

新對象會被分配在新生代內存。一旦新生代內存滿了,就會開始對死掉的對象,進行所謂的小型垃圾回收過程。一片新生代內存里,死掉的越多,回收過程就越快;至于那些還活著的對象,此時就會老化,并最終老到進入老年代內存。

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 空間都是空的。

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

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

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

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

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

怎么理解Java 垃圾回收機制

關于怎么理解Java 垃圾回收機制問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

修水县| 增城市| 措勤县| 濉溪县| 翼城县| 关岭| 宁阳县| 建平县| 舒兰市| 开平市| 温泉县| 丽水市| 宜丰县| 潼南县| 田林县| 甘肃省| 阿鲁科尔沁旗| 丁青县| 剑阁县| 自贡市| 湘潭市| 嘉祥县| 乌审旗| 迁安市| 广河县| 米易县| 永修县| 库尔勒市| 江油市| 乌拉特中旗| 师宗县| 津市市| 尼勒克县| 襄城县| 紫阳县| 秭归县| 涞水县| 石棉县| 林周县| 拜城县| 金湖县|