跟我一起學JVM(三)——垃圾收集,刻不容緩

​本節的內容是Java虛擬機的核心——垃圾收集算法與垃圾收集器。

現實生活中我們都要講究垃圾分類,垃圾收集。計算機的內存空間就像現實生活中的儲物室一樣,存放雜物的同時需要定期清理,畢竟空間有限。那Java虛擬機在內存垃圾處理上面用到了哪些技術呢?讓我們開始本章的學習。

第一章Java虛擬機內存結構中我們學習了程序計數器,虛擬機棧以及本地方法棧都是線程私有的,會伴隨線程的結束而自動釋放空間,但是Java堆和方法區就不是這樣了,因爲他們是線程共享的空間,而且很多對象是在程序運行過程中被創建的,所以這兩塊內存空間的垃圾清理就變得複雜了起來。爲了讓程序運行的效率提高,內存空間的利用率最大化,程序員們對於這兩塊內存空間的優化可以說是絞盡腦汁。經過幾十年的發展,出現了一些非常優質的算法,但是算法優化的道路永遠沒有止境~

話不多說,先上腦圖,該腦圖增加了自動內存管理中的垃圾收集算法,垃圾收集器以及獨立模塊“對象”的相應內容。
在這裏插入圖片描述

(一)垃圾收集算法

說到垃圾回收,我們首先要做的是判斷它是垃圾,這就需要一系列的垃圾收集算法幫助系統識別哪些類,哪些對象是可以回收掉的。

通過腦圖我們發現判斷一個對象或者類是否可以回收,只要他們與周邊的聯繫消失(也就是所謂的“孤魂野鬼”了)那麼就可以被回收了。找聯繫就像找路徑,會用到算法裏的樹的遍歷之類的算法知識。

比如在判斷對象是否可以回收的“可達性分析算法”中常常把常量,靜態屬性等不容易變化和被回收的老對象作爲樹的根節點(GCRoots)然後從根節點出發尋路,找到與節點相連的對象,從而形成一棵對象樹,凡是不在樹上的對象則可以被認爲是“脫離團隊”了,那就可以進行回收。

分代收集算法:
新生代
複製算法
(目的是爲了用額外空間換得更高的內存分配效率)。

老年代
1.標記清除算法
2.標記整理算法

說白了都是先標記是否爲垃圾。因爲標記後直接清除算法會讓內存都不連續了,人們就想辦法把內存碎片清除掉,於是發明了標記整理算法,可以提高內存使用的便捷性,畢竟連續空間的分配肯定是最快捷的方式。

對象的引用程度
強引用,軟引用,弱引用,虛引用
將一個對象和其他對象之間的關係分爲以上四種,更加細緻,有利於虛擬機作出更好的回收決策。

強引用:在程序代碼中普遍存在的,垃圾回收器永遠不會回收掉的對象

軟引用:描述一些還有用但並非必須的對象,在系統將要發生內存溢出異常時會將這些對象列入進回收範圍內進行二次回收,如果該回收結束後依舊沒有足夠內存纔會拋出內存溢出異常

弱引用:描述非必須對象的,強度低於軟引用,該對象只能生存到下一次垃圾回收發生之前,當垃圾收集器工作時,無論當時內存是否足夠,都會回收掉弱引用關聯的對象

虛引用:幽靈引用或者幻影引用,是最弱的引用關係,無法通過虛引用獲得一個對象實例,爲對象設置虛引用唯一目的就是該對象回收時收到一個系統通知。

(二)垃圾收集器

因爲垃圾收集過程相當於倉庫管理員在清理庫存的時候,那肯定是不希望在他清理的時依舊有進出貨物的行爲發生,因爲他沒有對新來的貨物進行標記,也不知道這些貨物是不是垃圾。同樣的,對於系統來說,在執行垃圾回收時,要暫停所有的線程,也就是所謂的“Stop the world” 。爲了避免一些線程出現執行了一部分的尷尬情況,執行GC時需要設置安全點或者安全區域,線程一旦到達安全點或者進入安全區域就可以進行GC,此時線程都要全部停止。可見垃圾清理雖然釋放了內存空間,但是影響了用戶體驗和運行效率。

爲了獲得更好的用戶體驗,人們開始研發各種各樣的垃圾回收器,從一開始的serial單線程的到CMS,G1多線程的 。腦圖中提供了各式收集器,並不是多線程一定快於單線程,因爲有時候開一個分支線程執行標記和回收都是佔用了許多計算資源的,在一些情況下的單線程反而更加安全與便捷。具體問題具體分析,採用針對性的解決方式纔是有意義的。

下一章就進入故障處理工具以及實際開發中的小例子,學了新東西總要拿出來溜溜才能明白學習的意義嘛 。

喜歡請三連~微信公衆號對應博文封面圖是前些日子去的紐約世貿中心,確實豪華啊!


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
WeChat: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章