技術面試題分享:含答案的10道Jvm面試專題

陝西優就業發表於2019-11-11

JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是透過在實際的計算機上模擬模擬各種計算機功能來實現的。引入Java語言虛擬機器後,Java語言在不同平臺上執行時不需要重新編譯。

Java語言使用Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言編譯程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。下面, 陝西優就業小編給大家分享十道題,大家可以嘗試著回答一下以下問題:

qunhao:    838     940     752

一、記憶體模型以及分割槽,需要詳細到每個區放什麼。

(1)JVM 分為堆區和棧區,還有方法區,初始化的物件放在堆裡面,引用放在棧裡面, class 類資訊常量池(static 常量和 static 變數)等放在方法區 new:

(2)方法區:主要是儲存類資訊,常量池(static 常量和 static 變數),編譯後的程式碼(字 節碼)等資料 · 堆:初始化的物件,成員變數(那種非 static 的變數),所有的物件例項和陣列都要 在堆上分配

(3)棧:棧的結構是棧幀組成的,呼叫一個方法就壓入一幀,幀上面儲存區域性變數表,操 作數棧,方法出口等資訊,區域性變數表存放的是 8 大基礎型別加上一個應用型別,所 以還是一個指向地址的指標

(4)本地方法棧:主要為 Native 方法服務

(5)程式計數器:記錄當前執行緒執行的行號

二、簡述java垃圾回收機制?

在java中,程式設計師是不需要顯示的去釋放一個物件的記憶體的,而是由虛擬機器自行執行。在JVM中,有一個垃圾回收執行緒,它是低優先順序的,在正常情況下是不會執行的。

只有在虛擬機器空閒或者當前堆記憶體不足時,才會觸發執行,掃面那些沒有被任何引用的物件,並將它們新增到要回收的集合中,進行回收。

三、什麼是類載入器,類載入器有哪些?

實現透過類的許可權定名獲取該類的二進位制位元組流的程式碼塊叫做類載入器。

主要有一下四種類載入器:

(1)啟動類載入器(Bootstrap ClassLoader)用來載入java核心類庫,無法被java程式直接引用。

(2)擴充套件類載入器(extensions class loader):它用來載入 Java 的擴充套件庫。Java 虛擬機器的實現會提供一個擴充套件庫目錄。該類載入器在此目錄裡面查詢並載入 Java 類。

(3)系統類載入器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來載入 Java 類。一般來說,Java 應用的類都是由它來完成載入的。可以透過ClassLoader.getSystemClassLoader()來獲取它。

(4)使用者自定義類載入器,透過繼承 java.lang.ClassLoader類的方式實現。

四、GC 的兩種判定方法

(1)引用計數法:指的是如果某個地方引用了這個物件就+1,如果失效了就-1,當為 0 就會回收但是 JVM 沒有用這種方式,因為無法判定相互迴圈引用(A 引用 B,B 引用 A) 的情況。

(2)引用鏈法: 透過一種 GC ROOT 的物件(方法區中靜態變數引用的物件等-static 變數)來判斷,如果有一條鏈能夠到達 GC ROOT 就說明,不能到達GC ROOT 就說明可以回收 。

五、GC 收集器有哪些?CMS 收集器與 G1 收集器的特點。

並行收集器:序列收集器使用一個單獨的執行緒進行收集,GC 時服務有停頓時間 序列收集器:次要回收中使用多執行緒來執行 CMS 收集器是基於“標記—清除”演算法實現的,經過多次標記才會被清除 G1 從整體來看是基於“標記—整理”演算法實現的收集器,從區域性(兩個 Region 之間) 上來看是基於“複製”演算法實現的 。

六、說一下堆疊的區別?

(1)功能方面:堆是用來存放物件的,棧是用來執行程式的。

(2)共享性:堆是執行緒共享的,棧是執行緒私有的。

(3)空間大小:堆大小遠遠大於棧。

七、說一下類裝載的執行過程?

類裝載分為以下 5 個步驟:

(1)載入:根據查詢路徑找到相應的 class 檔案然後匯入;

(2)檢查:檢查載入的 class 檔案的正確性;

(3)準備:給類中的靜態變數分配記憶體空間;

(4)解析:虛擬機器將常量池中的符號引用替換成直接引用的過程。符號引用就理解為一個標示,而在直接引用直接指向記憶體中的地址;

(5)初始化:對靜態變數和靜態程式碼塊執行初始化工作。

八、簡述minor gc和full gc

(1)Minor GC:從新生代回收記憶體,關鍵是Eden區記憶體不足,造成不足的原因是Java物件大部分是朝生夕死(java區域性物件),而死掉的物件就需要在合適的時機被JVM回收.

(2)Major GC:從老年代回收記憶體,一般比Minor GC慢10倍以上。

(3)Full GC:對整個堆來說的,出現Full GC通常伴隨至少一次Minor GC,但非絕對。Full GC被觸發的時候:老年代記憶體不足;持久代記憶體不足;統計得到的Minor GC晉升到老年代平均大小大於老年代空間。

九、Java記憶體模型的happen before原則

如果兩個操作存在happens-before關係,那麼前一個操作的結果就會對後面一個操作可見,是定義的兩個操作之間的偏序關係,常見的規則:

(1)程式順序規則:一個執行緒中每個操作,happens-before於該執行緒中的任意後續操作。

(2)監視器鎖規則:對一個鎖的解鎖,happens-before於隨後這個鎖的加鎖。

(3)volatile變數規則:對一個volatile域的寫,happens-before於任意後續對這個域的讀。

(4)傳遞性:若A happens-before B,B happens-before C,則A happens-before C.

(5)start()規則:如果執行緒A執行ThreadB.start(),那麼A執行緒的ThreadB.start()操作happens-before於執行緒B中的任意操作。

(6)join()規則:若執行緒A 執行ThreadB.join()併成功返回,則執行緒B的任意操作happens-before於執行緒A從ThreadB.jion()操作返回成功。

十、說一下 JVM 有哪些垃圾回收演算法?

(1)標記-清除演算法:標記無用物件,然後進行清除回收。缺點:效率不高,無法清除垃圾碎片。

(2)標記-整理演算法:標記無用物件,讓所有存活的物件都向一端移動,然後直接清除掉端邊界以外的記憶體。

(3)複製演算法:按照容量劃分二個大小相等的記憶體區域,當一塊用完的時候將活著的物件複製到另一塊上,然後再把已使用的記憶體空間一次清理掉。缺點:記憶體使用率不高,只有原來的一半。

(4)分代演算法:根據物件存活週期的不同將記憶體劃分為幾塊,一般是新生代和老年代,新生代基本採用複製演算法,老年代採用標記整理演算法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69902581/viewspace-2663450/,如需轉載,請註明出處,否則將追究法律責任。

相關文章