1. 程式人生 > 實用技巧 >JVM怎樣判斷是垃圾物件進行垃圾回收

JVM怎樣判斷是垃圾物件進行垃圾回收

前言
相信大家都聽說過JVM垃圾回收機制,大概就是當我們的記憶體滿了的話就會進行垃圾回收機制,將不再用到的物件清理掉,這樣我們的記憶體就又可以有空間存東西了,那麼JVM怎麼能夠知道哪些物件不再用到了呢?下面我來用一個小故事講解一下。
小故事
李老闆開了一個小超市,但是自己平時特別忙,就僱傭了一個管家來看店,平時管家一個人還可以忙的過來,但是快要過年了,大家都來買年貨了,管家一個人忙不過來了,然後李老闆就找了兩個假期短工,一個是學生小明,一個是小明的老師老王,但是呢這兩個都需要管家去面試,李老闆因為在外地談生意就直接打電話讓兩個假期短工直接去超市找管家面試,這裡管家只能要一個人,管家想了想覺得學生又便宜又聽話,所以就要了學生。到目前為止理論上老師沒有面試上就應該回家了,但是在這裡管家沒有權利讓老師回家,老師就賴在店裡不走了,老師也不幹活也不領工資就是佔個座位睡大覺。這個時候店裡越來越忙了,這時李老闆從外地回來了而且還帶回來一個更便宜的假期工小紅,但是超市只能容納三個人,目前已經滿了,分別是管家、學生小明、睡覺的老師老王,這個時候李老闆就問管家:“你招收了哪個人做假期工了啊!”。管家指向了學生小明,然後李老闆知道睡覺的老師老王沒有用了,就把他攆出去了,然後李老闆讓小紅進來工作了。

解析
在這裡插入圖片描述
通過上面的小故事我們來理解一下上面這個圖片,上面的圖片中person對應管家、student對應小明、teacher對應老師老王,為什麼我們在這裡要把student和teacher都new出來呢,因為一開始李老闆也不知道要哪個人,所以都讓他們去超市裡面試去了,所以兩個人都得new出來,然後再超市裡管家招收了學生,就相當於指向了學生一個引用,然後李老闆就把老師攆出來了,在這裡管家相當於專有名詞來說就是“GCRoot根”,而李老闆就相當於JVM中用來執行垃圾收集的方法,所以說JVM判斷一個物件是不是垃圾就看它有沒有被GCRoot根物件引用。
可達性分析演算法
上述例子他有一個專有名詞叫做“可達性分析演算法”,就是通過GCRoot根出發,看看能不能達到一個物件,如果能達到就不是垃圾物件,如果不能達到就是垃圾物件,我們的一個指向就相當於一個小路,由於李老闆在問管家招收了誰的時候,管家指向了學生小明,所以學生小明不是垃圾物件就不會被清理,而管家沒有指向老師老王,所以老王就相當於垃圾物件就會被清理掉。

總結
所以在java中一個物件不再被使用的時候是不能被立馬清理的,必須等李老闆(jvm垃圾清理方法)來清理,那麼李老闆必須等人滿了才會過來清理,不滿的話是不會過來清理的,所以jvm垃圾清理執行的前提是記憶體滿了,但是垃圾清理方法是會造成系統短暫停頓的,所以我們在jvm調優的時候就是為了儘量不讓jvm執行垃圾清理方法。