??大家好,我是陳哈哈,北漂五年,相信大家和我一樣,
都有一個大廠夢,作為一名資深Java選手,深知面試重要性,接下來我準備用100天時間,基于Java崗面試中的高頻面試題,以每日3題的形式,帶你過一遍熱門面試題及恰如其分的解答,
??一路走來,隨著問題加深,發現不會的也愈來愈多,但底氣著實足了不少,相信不少朋友和我一樣,榷訓月累才是最有效的學習方式!想起高三時一個同學的座右銘:只有沉下去,才能浮上來,共勉(juan),

坐標:煙花臺風來之前的上海
作者:對你何止一句鐘意
車票
- 面試題1:如何判斷物件是否存活
- 面試題2:哪些物件可以作為GC Roots?
- 面試題3:你了解的物件參考方式都有哪些?
- 每日小結
??本欄目Java開發崗高頻面試題主要出自以下各技術堆疊:Java基礎知識、集合容器、并發編程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL資料庫、Redis快取、RabbitMQ訊息佇列、Linux操作技巧等,
??地球人都知道,Java有個東西叫垃圾收集器(GC),它讓創建的物件不需要像c/c++那樣delete、free掉,你能不能談談,
GC是在什么時候,對什么東西,做了什么事情?
??這個是經典拋磚引玉的問法,既能看出我們對GC掌握的情況,也能從多點切入深問,看著三句話,其實每句話的知識點都夠我們喝一壺的,JVM接下來三篇會以:什么時候進行GC、對哪些物件、做哪些處理三個角度的面試問題進行整理,來吧,卷,
??本篇的內容為第二篇,主要基于對哪些物件這個方向來學習,大家有問題請在評論區噴我或互噴,噴出來的問題才會印象深刻,
??對哪些物件,對于GC垃圾回收來說很好理解,當然是針對垃圾,或者說堆中占著茅坑不拉屎(無參考)的物件,將這類物件的記憶體釋放,給新的物件騰出坑來(空間),
這些
垃圾我們通常把他們稱為已死亡物件或可回收物件,
說到這里突然有了一絲絲傷感,是的,有些人20歲的時候已經死了,只是80歲才埋,比如,,,
這短短的一生,我們最終都會失去,你不妨大膽一些,愛一個人,攀一座山,追一個夢!《大魚海棠》

面試題1:如何判斷物件是否存活
??對于判斷物件是否存活,主要是兩種基本演算法,參考計數和可達性分析,目前java主要采用的是可達性分析演算法
1.參考計數演算法
??判斷物件是否存活的方式如:在物件中添加一個參考計數器,每當有一個地方參考它時,計數器值就加一;當參考失效時,計數器值就減一;任何時刻計數器為零的物件就是不可能再被使用的,
??其優點是實作簡單,判定效率高;缺點是該演算法有很多例外情況要考慮,必須要配合大量額外處理才能保證正確地作業,且存在一個基本的難題,也就是很難處理回圈參考關系,
2.可達性分析演算法
??其原理簡單來說,就是將物件及其參考關系看作一個圖,通過一系列稱為GC Roots的根物件作為起始節點集,從這些節點開始,通過參考關系向下搜索,搜索程序所走過的路徑稱為參考鏈(Reference Chain),如果一個物件和 GC Roots 之間不可達,也就是不存在參考鏈條,那么即認為是可回收物件,JVM會把虛擬機堆疊和本地方法堆疊中正在參考的物件、靜態屬性參考的物件和常量,作為 GC Roots,

??如圖所示,物件object 5、object 6、object 7雖然互有關聯,但是它們到GC Roots是不可達的, 因此它們將會被判定為可回收的物件,

課間休息,又來秀一下來自咱們群里同學家里的曇花,
作者:小梅同學
面試題2:哪些物件可以作為GC Roots?
??在Java技術體系里面,固定可作為GC(Garbage Collector) Roots的物件包括以下幾種:

??常說的GC(Garbage Collector) roots,特指的是垃圾收集器的根物件(GC Root Object),也叫作稱為GC垃圾回收根(GC Root),GC會收集那些不是GC roots且沒有被GC roots參考的物件清理掉,
一個物件可以屬于多個root,GC root存在幾下種:
-
虛擬機堆疊中參考 的物件- 如各個執行緒被呼叫的方法堆疊中使用到的 引數、區域變數、臨時變數等,
-
方法區中類靜態屬性參考的物件- 如Java 類的參考型別靜態變數
-
方法區中常量參考的物件- 如字串常量池(String Table) 里的參考
-
本地方法堆疊內 JNI(通常說的本地方法)參考的物件 -
所有被同步鎖 (synchronized關鍵字) 持有的物件 -
Java 虛擬機內部的參考- 如基本資料型別對應的Class物件,一些常駐的例外物件(比如 NullPointExcepiton、OutOfMemoryError)、系統類加載器等,
-
反映 Java 虛擬機內部情況的 JMXBean、JVMTI 中注冊的回呼、本地代碼快取等,
-
除了固定的 GC Roots 集合以外,根據用戶所選用的垃圾收集器以及當前回收的記憶體區域不同,還可以有其他物件
臨時性地加入,共同構成完整 GC Roots 集合,

鐵子們,快來猜猜這是哪里?
作者:名刀
面試題3:你了解的物件參考方式都有哪些?
該回答來自極客時間《Java核心技術面試精講第四講》的評論部分,
??在Java語言中,除了基本資料型別外,其他的都是指向各類物件的物件參考;Java中根據其生命周期的長短,將參考分為強參考、弱參考、軟參考、虛參考4類,
1 強參考
??我們平常典型編碼Object obj = new Object()中的obj就是強參考,通過關鍵字new創建的物件所關聯的參考就是強參考, 當JVM記憶體空間不足,JVM寧愿拋出OutOfMemoryError運行時錯誤(OOM),使程式例外終止,也不會靠隨意回收具有強參考的存活物件來解決記憶體不足的問題,對于一個普通的物件,如果沒有其他的參考關系,只要超過了參考的作用域或者顯式地將相應(強)參考賦值為null,就是可以被垃圾收集的了,具體回收時機還是要看垃圾收集策略,
2 軟參考
??軟參考通過SoftReference類實作,
??軟參考的生命周期比強參考短一些,只有當 JVM 認為記憶體不足時,才會去試圖回收軟參考指向的物件:即JVM 會確保在拋出OutOfMemoryError之前,清理軟參考指向的物件,軟參考可以和一個參考佇列(ReferenceQueue)聯合使用,如果軟參考所參考的物件被垃圾回收器回收,Java虛擬機就會把這個軟參考加入到與之關聯的參考佇列中,后續,我們可以呼叫ReferenceQueue.poll()方法來檢查是否有它所關心的物件被回收,如果佇列為空,將回傳一個null,否則該方法回傳佇列中前面的一個Reference物件,
應用場景:軟參考通常用來實作記憶體敏感的快取,如果還有空閑記憶體,就可以暫時保留快取,當記憶體不足時清理掉,這樣就保證了使用快取的同時,不會耗盡記憶體,
3 弱參考
??弱參考通過WeakReference類實作,
??弱參考的生命周期比軟參考短,在垃圾回收器執行緒掃描它所管轄的記憶體區域的程序中,一旦發現了具有弱參考的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體,由于垃圾回收器是一個優先級很低的執行緒,因此不一定會很快回收弱參考的物件,弱參考可以和一個參考佇列(ReferenceQueue)聯合使用,如果弱參考所參考的物件被垃圾回收,Java虛擬機就會把這個弱參考加入到與之關聯的參考佇列中,
應用場景:弱參考同樣可用于記憶體敏感的快取,
4 虛參考
??虛參考也叫幻象參考,通過PhantomReference類來實作,
??無法通過虛參考訪問物件的任何屬性或函式,幻象參考僅僅是提供了一種確保物件被 finalize 以后,做某些事情的機制,如果一個物件僅持有虛參考,那么它就和沒有任何參考一樣,在任何時候都可能被垃圾回收器回收,虛參考必須和參考佇列 (ReferenceQueue)聯合使用,當垃圾回收器準備回收一個物件時,如果發現它還有虛參考,就會在回收物件的記憶體之前,把這個虛參考加入到與之關聯的參考佇列中,
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
??程式可以通過判斷參考佇列中是否已經加入了虛參考,來了解被參考的物件是否將要被垃圾回收,如果程式發現某個虛參考已經被加入到參考佇列,那么就可以在所參考的物件的記憶體被回收之前采取一些程式行動,
應用場景:可用來跟蹤物件被垃圾回收器回收的活動,當一個虛參考關聯的物件被垃圾收集器回收之前會收到一條系統通知,
每日小結
??今天我們復習了面試中常考GC相關的三個問題,你做到心中有數了么?對了,如果你的朋友也在準備面試,請將這個系列扔給他,如果他認真對待,肯定會感謝你的!!好了,今天就到這里,學廢了的同學,記得在評論區留言:打卡,,給同學們以激勵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299181.html
標籤:java
