JVM内存管理------垃圾搜集器简介
上一章我們已經探討過GC的各個演算法,那麼垃圾蒐集器是什麼呢?
通俗的講,使用程式語言將演算法實作出來,產生的程式就是垃圾蒐集器了。既然談到了程式語言的實現,那麼在討論垃圾蒐集器的時候,就已經涉及到具體的虛擬機器實現了。
或許有不少做JAVA開發的猿友還不知道,我們平時使用的JDK中,預設的JVM是hotspot,換句話說,我們大部分時候使用的JVM都是hotspot的實現版本,因此,本次LZ討論垃圾蒐集器都是基於hotspot版JVM來進行的,請各位猿友要知曉這一點。
更直覺的,我們可以在我們平常開發的機子上,輸入java -version來查看JVM的版本,相信大部分猿友對這個命令都不陌生吧,LZ的機子截圖如下。
垃圾蒐集器的分類
上面我們已經提到,垃圾蒐集器實際上就是演算法的程式語言實作。既然牽扯到程式語言,那麼必然離不開線程,而且我們在前面講解演算法的時候也一直假設是一條GC線程在做著GC的事情。
因此,垃圾蒐集器大致分為以下三類。
串列蒐集器(serial collector):它只有一條GC線程,而且就像前面說的,它在運行的時候需要暫停使用者程式(stop the world)。
並行蒐集器(parallel collector):它有多條GC線程,而且它也需要暫停使用者程式(stop the world)。
並發蒐集器(concurrent collector):它有一條或多條GC線程,且它需要在部分階段暫停使用者程式(stop the world),部分階段與使用者程式並發執行。
看完上面的定義,相信有一部分猿友已經蒙了,一會兒單線程,一會多線程,一會串行,一會並行,一會兒並發,這都神馬玩意?
單執行緒與多執行緒就不必多說了,這個很好理解,串列與並行也比較好理解,難於分辨的就是並行(parallel)與並行(concurrent)。
對於許多有關並發的解釋,LZ覺得有一個最貼切。它是這麼解釋的,並發就是兩個任務A和B需要相互獨立的運行,A任務先開始後,B任務在A任務結束前就開始了。
並發本身是比較好理解的,那麼它與並行的關係與區別是什麼呢?
事實上,並行是並發的一種實現方式。 LZ覺得這麼說各位可能會更好理解,當然,並行並不是並發的唯一實現方式,還有一種就是我們所熟悉的時間片切換。也就是A任務執行一會,B任務執行一會,交替執行。
並行必須在多核心多處理器或分散式系統(本質還是多核心多處理器)的前提下才能發生,而交替執行或說時間片切換是在單核心的處理器上發生的。
hotspot中的垃圾蒐集器
我們上面已經簡單探討了垃圾蒐集器的分類,在hotspotJVM中,每一個種類的垃圾蒐集器都有對應的實現,如下。
串列蒐集器的實現:serial(用於新生代,採用複製演算法)、serial old(用於年老代,採用標記/整理演算法)
並行蒐集器的實作:ParNew(用於新生代,採用複製演算法)、Parallel Scavenge(用於新生代,採用複製演算法)、Parallel old(用於年老代,採用標記/整理演算法)
並發蒐集器的實作:concurrent mark sweep[CMS](用於年老世代,採用標記/清除演算法)
可以看到,上面每一種垃圾蒐集器都是針對不同記憶體區域所設計的,因為它們採用的演算法不同,凡是用於新生代的都是使用的複製演算法,而用於年老代的都是使用的標記/清除或標記/整理演算法。
在實際應用中,我們需要給JVM的新生代和年老代分別選擇垃圾蒐集器,可以看到無論是新生代還是年老代都分別有三種實現,換句話說,我們應該有3*3 =9種選擇。但是,事實並非如此。
事實上,這六種垃圾蒐集器只有六種選擇,因為有的垃圾蒐集器由於具體實現的方式等一系列原因無法在一起工作,如下圖。
針對上圖,紅的就是串列蒐集器,綠的是平行蒐集器,唯一一個黃的是並發蒐集器。上面三個是新生代的蒐集器,下面三個是年老代的蒐集器。兩者之間有連線,則表示兩者可以配合工作。
結束語
以上就是JVM記憶體管理------垃圾蒐集器簡介的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
