搜尋
首頁Javajava教程JAVA垃圾回收機制

JAVA垃圾回收機制

Aug 19, 2017 pm 01:44 PM
java垃圾機制

垃圾回收是JAVA中的一個大知識點,也是一個著名知識點,畢竟JAVA號稱自己先進性的時候總是會帶上垃圾回收。於是,它也成了面試中的常客,面試官動不動的就要你解釋下什麼是垃圾回收,以及它的原理是什麼。當然,雖然,以及肯定,那個問你垃圾回收的面試官他99%也只是略知皮毛而已。當面試官問你什麼是垃圾回收機制的時候,你應該這樣一本正經的反問:請問您問的哪個VM中的垃圾回收機制?

由於垃圾回收涉及的概念複雜,演算法複雜,你若想弄清楚其中的全部細節,必定得不償失。但是,如果我們掌握了以下的垃圾回收機制的概要,相信在絕大部分的面試中你不會失分。

一:什麼是垃圾?

舉例來說,一個物件你不用了,它就是垃圾,例如:

public void test01(){
    User user = new User();
    //...
}

test01方法執行完畢,user物件沒有任何用處了,那它就是垃圾了。

 

二:為什麼要進行垃圾回收?

我們知道,物件是存放在堆上的,那麼堆有多大?雖然可以透過指令參數進行調整,但是通常情況下,32位元系統下,Java堆大小設定在2 GB其中,500 MB 分配給新生代(YoungGen)1.5 GB的分配給老年代(OldGen)空間。即便64位,想想我們PC的硬體記憶體能有多大。

所以,沒用的垃圾,統統回收,讓出記憶體空間,給其它物件用。

 

三:JDK預設的HotSpot VM垃圾回收的機制

1:堆記憶體的分類

#要理解這個機制,首先得明白堆的分類。是的,我們光知道物件存在於堆上,但不知道堆內部也分成幾個空間,如下圖:

JAVA垃圾回收機制

Young/New Generation 新生代

  其內部又分為Eden 與兩個Survivor Space 組成。新建的物件都將分配到新生代中,

Old/Tenured Generation 老年代

        舊年代用於存放程序中經過幾次垃圾回收後存活的物件

PS:Permanent Generation 非堆疊內存,用於存放靜態文件,如Java類別、方法等。持久代對垃圾回收沒有顯著影響。

2:回收順序

每個空間的執行順序如下:

    1. ##絕大多數剛剛被創造的物件會存放在伊甸園空間。

    2. 在伊甸園空間執行了第一次GC之後,存活的物件被移動到其中一個倖存者空間。

    3.   此後,在伊甸園空間執行GC之後,存活的對象會被堆積在同一個倖存者空間中。

    4. 當一個倖存者空間飽和,還在存活的物件會被移到另一個倖存者空間。之後會清空已經飽和的那個倖存者空間。

    5. 在以上的步驟中重複幾次依然存活的對象,就會被移到老年代。

 

四:垃圾收集器與回收演算法

兩種類型的代都有自己的收集器,每種收集器採用不同的演算法。請記住,對於初級選手,我們並不需要掌握每個演算法原理。

新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge

老年代收集器使用的收集器:Serial Old、Parallel Old、CMS

#其對應的演算法如下,

Serial收集器(複製演算法)

#新生代單執行緒收集器,標記和清理都是單線程,優點是簡單且有效率。

Serial Old收集器(標記-整理演算法)

老年代單執行緒收集器,Serial收集器的老年代版本。

ParNew收集器(停止-複製演算法) 

新生代收集器,可以認為是Serial收集器的多執行緒版本,在多核心CPU環境下有著比Serial更好的表現。

Parallel Scavenge收集器(停止-複製演算法)

#並行收集器,追求高吞吐量,高效利用CPU。吞吐量一般為99%,吞吐量= 使用者執行緒時間/(使用者執行緒時間+GC執行緒時間)。適合後台應用程式等對互動相應要求不高的場景。

Parallel Old收集器(停止-複製演算法)

Parallel Scavenge收集器的老年代版本,並行收集器,吞吐量優先

#CMS(Concurrent Mark Sweep)收集器(標記-清理演算法)

高併發、低停頓,追求最短GC回收停頓時間,cpu佔用比較高,反應時間快,停頓時間短,多核心cpu 追求高反應時間的選擇

 

#五:什麼時候會運行垃圾回收?

垃圾回收有兩種類型,Scavenge GC和Full GC。

當新物件生成,並且在Eden申請空間失敗時,就會觸發Scavenge GC。此時會對新生代進行垃圾回收。

當,年老代(Tenured)被寫滿、持久代(Perm)被寫滿、System.gc()被顯示調用、上一次GC之後Heap的各域分配策略動態變化,執行Full GC。

注意,無論是那種回收,並不意味著會把全部的垃圾回收掉,而是根據演算法自己的判斷,在一段時間內除掉一定數量的垃圾,這個時間和數量我們不可知。

 

以上,就是你必須知道的垃圾回收機制。

 


以上是JAVA垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?Apr 30, 2025 am 12:24 AM

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Apr 30, 2025 am 12:18 AM

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java的平台獨立性如何支持代碼可維護性?Java的平台獨立性如何支持代碼可維護性?Apr 30, 2025 am 12:15 AM

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

為新平台創建JVM面臨哪些挑戰?為新平台創建JVM面臨哪些挑戰?Apr 30, 2025 am 12:15 AM

在新平台上創建JVM面臨的主要挑戰包括硬件兼容性、操作系統兼容性和性能優化。 1.硬件兼容性:需要確保JVM能正確使用新平台的處理器指令集,如RISC-V。 2.操作系統兼容性:JVM需正確調用新平台的系統API,如Linux。 3.性能優化:需進行性能測試和調優,調整垃圾回收策略以適應新平台的內存特性。

Javafx庫如何試圖解決GUI開發中的平台不一致?Javafx庫如何試圖解決GUI開發中的平台不一致?Apr 30, 2025 am 12:01 AM

javafxeffectife addressemanddressEndressencissencies uningusement insuplatform-agnosticsCenegraphandCsSsStyling.1)itabstractsplactsplatsplatsplatsplatsplatformsthroughascenegraph,確保consistentertrenderingrenderingrenderingacrosswindows,macoswindwind,Macos,MacOs.2)

說明JVM如何充當Java代碼和基礎操作系統之間的中介。說明JVM如何充當Java代碼和基礎操作系統之間的中介。Apr 29, 2025 am 12:23 AM

JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

解釋Java虛擬機(JVM)在Java平台獨立性中的作用。解釋Java虛擬機(JVM)在Java平台獨立性中的作用。Apr 29, 2025 am 12:21 AM

JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?您將採取哪些步驟來確保Java應用程序在不同的操作系統上正確運行?Apr 29, 2025 am 12:11 AM

Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器