每日五分鐘,玩轉JVM 兩種演算法

2022-02-26 02:06:43 字數 1082 閱讀 2035

上篇文章,我們了解了gc 的相關概念,這篇文章我們通過兩個演算法來了解如何去確定堆中的物件例項哪些是我們需要去**的垃圾物件

引用計數法的原理很簡單,就是在物件中維護乙個計數器,當有乙個物件引用它的時候,該計數器的值就會加一,當這個引用失效的時候,計數器的值就會減少一,當計數器的值為零的時候,就意味著這個物件是乙個垃圾物件,需要被 gc **,這個演算法是乙個比較高效的演算法,但是會存在一種物件迴圈引用導致記憶體洩露的問題,什麼是迴圈引用呢?

就像這樣,物件 a 和物件 b 之間存在相互引用,但是除此之外,這兩個物件再無引用,講道理,這兩個物件是屬於我們定義的垃圾中的,但是由於計數器的值不為零,所以就無法被標記為垃圾,我們的 gc 也就無法去**這兩個物件,這兩個物件會失去控制,長久的存在我們的物件中占用記憶體,造成記憶體的洩露。

這個演算法我一般理解為落葉歸根演算法(遠離家鄉 不甚唏噓 幻化成秋夜 而我卻像落葉歸根 墜在你心間~),為什麼這麼說呢?這個演算法的原理也很簡單,就是維護一系列的『gc root』的物件作為我們的根,從這些根搜尋,走過的路徑官方話叫做引用鏈(reference chain),當乙個物件到根節點沒有任何引用,就意味著這個物件是不可用的,也就是我們俗稱的垃圾~

換個說法來理解很簡單:長在樹上的葉子是我們的可用物件,當葉子脫離了樹枝,與樹根之間沒有任何聯絡的時候,就需要落葉歸根,被 gc **,也就是落紅不是無情物,化作春泥更護花~

那麼在我們的 jvm 中,可以被認為是 gc roots的物件有以下幾種:

每日五分鐘,玩轉 JVM GC 概覽

gc garbage collection 是我們在學習 jvm 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 gc。做一件事情之前,我們一定要去知道我們為什麼要去做,這裡不僅僅指 gc,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。下面我們先去了解為什麼要有 gc,以及...

五分鐘玩轉git

許多人認為git太混亂,或認為它是一種複雜的版本控制系統,其實不然,這篇文章有助於大家快速上手使用git。使用git前,需要先建立乙個倉庫 repository 您可以使用乙個已經存在的目錄作為git倉庫或建立乙個空目錄。使用您當前目錄作為git倉庫,我們只需使它初始化。git init使用我們指定...

五分鐘帶你玩轉rocketMQ(五)實戰廣播與集群

1.集群消費方式 乙個consumergroup中的consumer例項平均分攤消費生產者傳送的訊息。例如某個topic有九條訊息,其中乙個consumer group有三個例項 可能是3個程序,或者3臺機器 那麼每個例項只消費其中的3條訊息,consumer不指定消費方式的話預設是集群消費的,適用...