1. 程式人生 > >java虛擬機器常見面試題整理

java虛擬機器常見面試題整理

-1.JVM的記憶體模型
1)程式計數器:當前執行緒所執行的位元組碼的行號執行器。再多執行緒上下文切換中將非常有用。
上下文切換:儲存到在載入的過程。可以理解為你看書看到第幾頁以後不看了,然後折了一下作為標誌,下次就從這裡開始看
2)java虛擬機器棧:我們常說的棧就是java虛擬機器棧,它是方法執行的記憶體模型。方法在執行時會建立一個棧幀,每個方法從呼叫到執行完成的過程,對應的棧幀的入棧和出棧。
棧幀:儲存區域性變量表、運算元棧、動態連結等。
區域性變量表:儲存基本型別、物件引用、returnAddress型別(指向位元組碼的指令)
3)本地方法棧:一些native方法吧
4)java堆:執行緒共享的一塊記憶體區域,java堆是垃圾收集器管理的主要區域
5)方法區:類資訊、常量、靜態變數、即時編譯器編譯以後的程式碼的儲存
6)執行時常量池:class檔案中常量池的儲存地方,主要儲存的是類的版本、欄位、方法、介面等描述資訊
7)直接記憶體:
-2.垃圾回收的時候如何判斷一個物件需要回收


判斷一個物件是否需要回收,即判斷是否存活,有兩種演算法。jvm採用的是第二種演算法
1)引用計數演算法
假設每個物件都有一個引入計數器,每當引用一個物件進行加1操作,不再引用時計數器減1。jvm沒有使用這個演算法,因為它存在物件之間互相引用的問題(主要是堆裡面互相引用,而在棧裡已經沒有引用指向它了)

2)可達性分析演算法
當一個物件到GCRoots不可達時,即沒有引用鏈,則該物件是可回收的

繼續追問:可以作為GC ROOTs的物件:
1)虛擬機器棧(棧幀中的本地變量表)中引用的物件
2)方法區中類靜態屬性引用的物件
3)方法區中常量引用物件
4)本地方法棧中引用的物件