首頁 Java java教程 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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

See all articles