1. 程式人生 > 其它 >Jvm面試題及答案 100道(持續更新)

Jvm面試題及答案 100道(持續更新)

最新Jvm面試題及答案【附答案解析】Jvm面試題及答案2021,Jvm面試題最新面試題,Jvm面試題新答案已經全部更新完了,有些答案是自己總結的,也有些答案是在網上搜集整理的。這些答案難免會存在一些錯誤,僅供大家參考。如果發現錯誤還望大家多多包涵,不吝賜教,謝謝~

如果不背 Jvm面試題的答案,肯定面試會掛!

這套Jvm面試題大全,希望對大家有幫助哈~

博主已將以下這些面試題整理成了一個面試手冊,是PDF版的

1、標記清除演算法( Mark-Sweep)

最基礎的垃圾回收演算法,分為兩個階段,標註和清除。標記階段標記出所有需要回收的物件,清除階段回收被標記的物件所佔用的空間。

從圖中我們就可以發現,該演算法最大的問題是記憶體碎片化嚴重,後續可能發生大物件不能找到可利用空間的問題。

2、Serial Old 收集器(單執行緒標記整理演算法 )

Serial Old 是 Serial 垃圾收集器年老代版本,它同樣是個單執行緒的收集器,使用標記-整理演算法,這個收集器也主要是執行在 Client 預設的

java 虛擬機器預設的年老代垃圾收集器。在 Server 模式下,主要有兩個用途:

1、在 JDK1.5 之前版本中與新生代的 Parallel Scavenge 收集器搭配使用。

2、作為年老代中使用 CMS 收集器的後備垃圾收集方案。新生代 Serial 與年老代 Serial Old 搭配垃圾收集

新生代 Parallel Scavenge 收集器與 ParNew 收集器工作原理類似,都是多執行緒的收集器,都使用的是複製演算法,在垃圾收集過程中都需要暫停所有的工作執行緒。新生代 ParallelScavenge/ParNew 與年老代 Serial Old 搭配垃圾收集過程圖:

3、你都有哪些手段用來排查記憶體溢位?

(這個話題很大,可以從實踐環節中隨便摘一個進行總結,下面舉例一個最普通的)

你可以來一箇中規中矩的回

記憶體溢位包含很多種情況,我在平常工作中遇到最多的就是堆溢位。有一次線上遇到故障,重新啟動後,使用jstat命令,發現Old區在一直增長。我使用jmap命令,匯出了一份線上堆疊,然後使用MAT進行分析。通過對GC Roots的分析,我發現了一個非常大的HashMap物件,這個原本是有位同學做快取用的,但是一個無界快取,造成了堆記憶體佔用一直上升。後來,將這個快取改成 guava的Cache,並設定了弱引用,故障就消失了。

這個回答不是十分出彩,但著實是常見問題,讓人挑不出毛病。

4、類載入為什麼要使用雙親委派模式,有沒有什麼場景是打破了這個模式?

雙親委託模型的重要用途是為了解決類載入過程中的安全性問題。

1、假設有一個開發者自己編寫了一個名為java.lang.Object的類,想借此欺騙JVM。現在他要使用自定義ClassLoader來載入自己編寫的java.lang.Object類。

2、然而幸運的是,雙親委託模型不會讓他成功。因為JVM會優先在Bootstrap ClassLoader的路徑下找到java.lang.Object類,並載入它

Java的類載入是否一定遵循雙親委託模型?

1、在實際開發中,我們可以通過自定義ClassLoader,並重寫父類的loadClass方法,來打破這一機制。

2、SPI就是打破了雙親委託機制的(SPI:服務提供發現)。

5、描述一下 JVM 載入 class 檔案的原理機制

1、JVM 中類的裝載是由類載入器(ClassLoader)和它的子類來實現的,Java 中各類載入器是一個重要的 Java 執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。

2、由於 Java 的跨平臺性,經過編譯的 Java 源程式並不是一個可執行程式,而是一個或多個類檔案。當 Java 程式需要使用某個類時,JVM 會確保這個類已經被載入、連線(驗證、準備和解析)和初始化。類的載入是指把類的.class 檔案中的資料讀入到記憶體中,通常是建立一個位元組陣列讀入.class 檔案,然後產生與所載入類對應的 Class 物件。

3、載入完成後,Class 物件還不完整,所以此時的類還不可用。當類被載入後就進入連線階段,這一階段包括驗證、準備(為靜態變數分配記憶體並設定預設的初始值)和解析(將符號引用替換為直接引用)三個步驟。最後 JVM 對類進行初始化,包括:1)如果類存在直接的父類並且這個類還沒有被初始化,那麼就先初始化父類;2)如果類中存在初始化語句,就依次執行這些初始化語句。

4、類的載入是由類載入器完成的,類載入器包括:根載入器(BootStrap)、擴充套件載入器(Extension)、系統載入器(System)和使用者自定義類載入器(java.lang.ClassLoader 的子類)。

5、從 Java 2(JDK 1.2)開始,類載入過程採取了父親委託機制(PDM)。PDM 更好的保證了 Java 平臺的安全性,在該機制中,JVM 自帶的Bootstrap 是根載入器,其他的載入器都有且僅有一個父類載入器。類的載入首先請求父類載入器載入,父類載入器無能為力時才由其子類載入器自行載入。JVM 不會向 Java 程式提供對 Bootstrap 的引用。下面是關於幾個類

載入器的說明:

1、Bootstrap:一般用原生代碼實現,負責載入 JVM 基礎核心類庫(rt.jar);

2、Extension:從 java.ext.dirs 系統屬性所指定的目錄中載入類庫,它的父載入器是 Bootstrap;

3、System:又叫應用類載入器,其父類是 Extension。它是應用最廣泛的類載入器。它從環境變數 classpath 或者系統屬性

java.class.path 所指定的目錄中記載類,是使用者自定義載入器的預設父載入器。

6、能夠找到 Reference Chain 的物件,就一定會存活麼?

這不一定,還要看reference型別。弱引用會在GC時會被回收,軟引用會在記憶體不足的時候被回收。但沒有Reference Chain的物件就一定會被回收。

7、類載入器雙親委派模型機制?

基本定義:

雙親委派模型的工作流程是:如果一個類載入器收到了類載入的請求,它首先不會自己去載入這個類,而是把請求委託給父載入器去完成,依次向上,因此,所有的類載入請求最終都應該被傳遞到頂層的啟動類載入器中,只有當父載入器沒有找到所需的類時,子載入器才會嘗試去載入該類。

雙親委派機制:

1、當 AppClassLoader 載入一個 class 時,它首先不會自己去嘗試載入這個類,而是把類載入請求委派給父類載入器 ExtClassLoader 去完成。

2、當 ExtClassLoader 載入一個 class 時,它首先也不會自己去嘗試載入這個類,而是把類載入請求委派給 BootStrapClassLoader 去完成。

3、如果 BootStrapClassLoader 載入失敗,會使用 ExtClassLoader 來嘗試載入;

4、若 ExtClassLoader 也載入失敗,則會使用 AppClassLoader 來載入,如果 AppClassLoader 也載入失敗,則會報出異常 ClassNotFoundException。

如下圖所示:

雙親委派作用:

1、通過帶有優先順序的層級關可以避免類的重複載入;

2、保證 Java 程式安全穩定執行,Java 核心 API 定義型別不會被隨意替換。

8、字串常量存放在哪個區域?

1、字串常量池,已經移動到堆上(jdk8之前是perm區),也就是執行intern方法後存的地方。

2、類檔案常量池,constant_pool,是每個類每1個介面所擁有的,這部分資料在方法區,也就是元資料區。而執行時常量池是在類載入後的一個記憶體區域,它們都在元空間。

9、你知道哪些記憶體分配與回收策略?

物件優先在 Eden 區分配

大多數情況下物件在新生代 Eden 區分配,當 Eden 沒有足夠空間時將發起一次 Minor GC。

大物件直接進入老年代

大物件指需要大量連續記憶體空間的物件,典型是很長的字串或數量龐大的陣列。大物件容易導致記憶體還有不少空間就提前觸發垃圾收集以獲得足夠的連續空間。

HotSpot 提供了-XX:PretenureSizeThreshold引數,大於該值的物件直接在老年代分配,避免在 Eden 和 Survivor 間來回複製。

長期存活物件進入老年代

虛擬機器給每個物件定義了一個物件年齡計數器,儲存在物件頭。如果經歷過第一次 Minor GC 仍然存活且能被 Survivor 容納,該物件就會被移動到 Survivor 中並將年齡設定為 1。物件在 Survivor 中每熬過一次 Minor GC 年齡就加 1 ,當增加到一定程度(預設15)就會被晉升到老年代。物件晉升老年代的閾值可通過-XX:MaxTenuringThreshold設定。

動態物件年齡判定

為了適應不同記憶體狀況,虛擬機器不要求物件年齡達到閾值才能晉升老年代,如果在 Survivor 中相同年齡所有物件大小的總和大於 Survivor 的一半,年齡不小於該年齡的物件就可以直接進入老年代。

空間分配擔保

MinorGC 前虛擬機器必須檢查老年代最大可用連續空間是否大於新生代物件總空間,如果滿足則說明這次 Minor GC 確定安全。

如果不滿足,虛擬機器會檢視-XX:HandlePromotionFailure引數是否允許擔保失敗,如果允許會繼續檢查老年代最大可用連續空間是否大於歷次晉升老年代物件的平均大小,如果滿足將冒險嘗試一次 Minor GC,否則改成一次 FullGC。

冒險是因為新生代使用複製演算法,為了記憶體利用率只使用一個 Survivor,大量物件在 Minor GC 後仍然存活時,需要老年代進行分配擔保,接收 Survivor 無法容納的物件。

10、Java 8 為什麼要將永久代(PermGen)替換為元空間(MetaSpace)呢?

整個永久代有一個 JVM 本身設定固定大小上線,無法進行調整,而元空間使用的是直接記憶體,受本機可用記憶體的限制,並且永遠不會出現java.lang.OutOfMemoryError。你可以使用 -XX:MaxMetaspaceSize 標誌設定最大元空間大小,預設值為 unlimited,這意味著它只受系統記憶體的限制。-XX:MetaspaceSize 調整標誌定義元空間的初始大小如果未指定此標誌,則 Metaspace 將根據執行時的應用程式需求動態地重新調整大小。

11、ZGC 瞭解嗎?

JDK11 中加入的具有實驗性質的低延遲垃圾收集器,目標是儘可能在不影響吞吐量的前提下,實現在任意堆記憶體大小都可以把停頓時間限制在 10ms 以內的低延遲。

基於 Region 記憶體佈局,不設分代,使用了讀屏障、染色指標和記憶體多重對映等技術實現可併發的標記-整理,以低延遲為首要目標。

ZGC 的 Region 具有動態性,是動態建立和銷燬的,並且容量大小也是動態變化的。

12、safepoint是什麼?

STW並不會只發生在記憶體回收的時候。現在程式設計師這麼卷,碰到幾次safepoint的問題機率也是比較大的。

當發生GC時,使用者執行緒必須全部停下來,才可以進行垃圾回收,這個狀態我們可以認為JVM是安全的(safe),整個堆的狀態是穩定的。

如果在GC前,有執行緒遲遲進入不了safepoint,那麼整個JVM都在等待這個阻塞的執行緒,造成了整體GC的時間變長。

13、JVM 提供的常用工具

jps:

用來顯示本地的 Java 程序,可以檢視本地執行著幾個 Java 程式,並顯示他們的程序號。 命令格式:jps

jinfo:

執行環境引數:Java System 屬性和 JVM 命令列引數,Java class path 等資訊。 命令格式:jinfo 程序 pid

jstat:

監視虛擬機器各種執行狀態資訊的命令列工具。 命令格式:jstat -gc 123 250 20

jstack:

可以觀察到 JVM 中當前所有執行緒的執行情況和執行緒當前狀態。 命令格式:jstack 程序 pid

jmap:

觀察執行中的 JVM 實體記憶體的佔用情況(如:產生哪些物件,及其數量)。 命令格式:jmap [option] pid

14、CMS 收集器(多執行緒標記清除演算法)

Concurrent mark sweep(CMS)收集器是一種年老代垃圾收集器,其最主要目標是獲取最短垃圾回收停頓時間, 和其他年老代使用標記-整理演算法不同,它使用多執行緒的標記-清除演算法。最短的垃圾收集停頓時間可以為互動比較高的程式提高使用者體驗。CMS 工作機制相比其他的垃圾收集器來說更復雜。整個過程分為以下 4 個階段:

初始標記

只是標記一下 GC Roots 能直接關聯的物件,速度很快,仍然需要暫停所有的工作執行緒。

併發標記

進行 GC Roots 跟蹤的過程,和使用者執行緒一起工作,不需要暫停工作執行緒。

重新標記

為了修正在併發標記期間,因使用者程式繼續執行而導致標記產生變動的那一部分物件的標記記錄,仍然需要暫停所有的工作執行緒。

併發清除

清除 GC Roots 不可達物件,和使用者執行緒一起工作,不需要暫停工作執行緒。由於耗時最長的併發標記和併發清除過程中,垃圾收集執行緒可以和使用者現在一起併發工作, 所以總體上來看CMS 收集器的記憶體回收和使用者執行緒是一起併發地執行。

15、物件都是優先分配在年輕代上的嗎?

不是。當新生代記憶體不夠時,老年代分配擔保。而大物件則是直接在老年代分配。

16、有哪些 GC 演算法?

標記-清除演算法

分為標記和清除階段,首先從每個 GC Roots 出發依次標記有引用關係的物件,最後清除沒有標記的物件。

執行效率不穩定,如果堆包含大量物件且大部分需要回收,必須進行大量標記清除,導致效率隨物件數量增長而降低。

存在記憶體空間碎片化問題,會產生大量不連續的記憶體碎片,導致以後需要分配大物件時容易觸發 Full GC。

標記-複製演算法

為了解決記憶體碎片問題,將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中一塊。當使用的這塊空間用完了,就將存活物件複製到另一塊,再把已使用過的記憶體空間一次清理掉。主要用於進行新生代。

實現簡單、執行高效,解決了記憶體碎片問題。代價是可用記憶體縮小為原來的一半,浪費空間。

HotSpot 把新生代劃分為一塊較大的 Eden 和兩塊較小的 Survivor,每次分配記憶體只使用 Eden 和其中一塊 Survivor。垃圾收集時將 Eden 和 Survivor 中仍然存活的物件一次性複製到另一塊 Survivor 上,然後直接清理掉 Eden 和已用過的那塊 Survivor。HotSpot 預設Eden 和 Survivor 的大小比例是 8:1,即每次新生代中可用空間為整個新生代的 90%。

標記-整理演算法

標記-複製演算法在物件存活率高時要進行較多複製操作,效率低。如果不想浪費空間,就需要有額外空間分配擔保,應對被使用記憶體中所有物件都存活的極端情況,所以老年代一般不使用此演算法。

老年代使用標記-整理演算法,標記過程與標記-清除演算法一樣,但不直接清理可回收物件,而是讓所有存活物件都向記憶體空間一端移動,然後清理掉邊界以外的記憶體。

標記-清除與標記-整理的差異在於前者是一種非移動式演算法而後者是移動式的。如果移動存活物件,尤其是在老年代這種每次回收都有大量物件存活的區域,是一種極為負重的操作,而且移動必須全程暫停使用者執行緒。如果不移動物件就會導致空間碎片問題,只能依賴更復雜的記憶體分配器和訪問器解決。

17、有什麼堆外記憶體的排查思路?

程序佔用的記憶體,可以使用top命令,看RES段佔用的值。如果這個值大大超出我們設定的最大堆記憶體,則證明堆外記憶體佔用了很大的區域。

使用gdb可以將實體記憶體dump下來,通常能看到裡面的內容。更加複雜的分析可以使用perf工具,或者谷歌開源的gperftools。那些申請記憶體最多的native函式,很容易就可以找到。

18、SWAP會影響效能麼?

當作業系統記憶體不足的時候,會將部分資料寫入到SWAP交換分中,但是SWAP的效能是比較低的。如果應用的訪問量較大,需要頻繁申請和銷燬記憶體,就容易發生卡頓。一般高併發場景下,會禁用SWAP。

19、你知道哪些JVM效能調優

設定堆記憶體大小

1、-Xmx:堆記憶體最大限制。設定新生代大小。新生代不宜太小,否則會有大量物件湧入老年代

2、-XX:NewSize:新生代大小

3、-XX:NewRatio 新生代和老生代佔比

4、-XX:SurvivorRatio:伊甸園空間和倖存者空間的佔比

5、設定垃圾回收器 年輕代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

20、你都有哪些手段用來排查記憶體溢位?

(這個話題很大,可以從實踐環節中隨便摘一個進行總結,下面舉例一個最普通的)

你可以來一箇中規中矩的回

記憶體溢位包含很多種情況,我在平常工作中遇到最多的就是堆溢位。有一次線上遇到故障,重新啟動後,使用jstat命令,發現Old區在一直增長。我使用jmap命令,匯出了一份線上堆疊,然後使用MAT進行分析。通過對GC Roots的分析,我發現了一個非常大的HashMap物件,這個原本是有位同學做快取用的,但是一個無界快取,造成了堆記憶體佔用一直上升。後來,將這個快取改成 guava的Cache,並設定了弱引用,故障就消失了。

這個回答不是十分出彩,但著實是常見問題,讓人挑不出毛病。

21、堆

JVM記憶體管理最大的一塊,對被執行緒共享,目的是存放物件的例項,幾乎所欲的物件例項都會放在這裡,當堆沒有可用空間時,會丟擲OOM異常.根據物件的存活週期不同,JVM把物件進行分代管理,由垃圾回收器進行垃圾的回收管理

22、老年代與標記複製演算法

而老年代因為每次只回收少量物件,因而採用 Mark-Compact 演算法。

1、JAVA 虛擬機器提到過的處於方法區的永生代(Permanet Generation), 它用來儲存 class 類,常量,方法描述等。對永生代的回收主要包括廢棄常量和無用的類。

2、物件的記憶體分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放物件的那一塊),少數情況會直接分配到老生代。

3、當新生代的 Eden Space 和 From Space 空間不足時就會發生一次 GC,進行 GC 後, EdenSpace 和 From Space 區的存活物件會被挪到 To Space,然後將 Eden Space 和 FromSpace 進行清理。

4、如果 To Space 無法足夠儲存某個物件,則將這個物件儲存到老生代。

5、在進行 GC 後,使用的便是 Eden Space 和 To Space 了,如此反覆迴圈。

6、當物件在 Survivor 去躲過一次 GC 後,其年齡就會+1。預設情況下年齡到達 15 的物件會被移到老生代中。

23、分代回收

分代回收基於兩個事實:大部分物件很快就不使用了,還有一部分不會立即無用,但也不會持續很長時間

年輕代->標記-複製

老年代->標記-清除

24、說一下堆和棧的區別

1、實體地址 堆的實體地址分配對物件是不連續的。因此效能慢些。在GC的時候也要考慮到不連續的分配,所以有各種演算法。比如,標記-消除,複製,標記-壓縮,分代(即新生代使用複製演算法,老年代使用標記——壓縮) 棧使用的是資料結構中的棧,先進後出的原則,實體地址分配是連續的。所以效能快。

2、記憶體分別 堆因為是不連續的,所以分配的記憶體是在執行期確認的,因此大小不固定。一般堆大小遠遠大於棧。棧是連續的,所以分配的記憶體大小要在編譯期就確認,大小是固定的。

3、存放的內容 堆存放的是物件的例項和陣列。因此該區更關注的是資料的儲存 棧存放:區域性變數,運算元棧,返回結果。該區更關注的是程式方法的執行。

4、程式的可見度 堆對於整個應用程式都是共享、可見的。棧只對於執行緒是可見的。所以也是執行緒私有。他的生命週期和執行緒相同。

25、方法區/永久代(執行緒共享)

即我們常說的永久代(Permanent Generation), 用於儲存被 JVM 載入的類資訊、常量、靜態變數即、時編譯器編譯後的程式碼等資料.HotSpot VM把GC分代收集擴充套件至方法區, 即使用Java堆的永久代來實現方法區, 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分記憶體,而不必為方法區開發專門的記憶體管理器(永久帶的記憶體回收的主要目標是針對常量池的回收和型別的解除安裝, 因此收益一般很小) 。

執行時常量池(Runtime Constant Pool)是方法區的一部分。Class 檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池 (Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到方法區的執行時常量池中。Java 虛擬機器對 Class 檔案的每一部分(自然也包括常量池)的格式都有嚴格的規定,每一個位元組用於儲存哪種資料都必須符合規範上的要求,這樣才會被虛擬機器認可、裝載和執行。

26、類載入器

虛擬機器設計團隊把載入動作放到 JVM 外部實現,以便讓應用程式決定如何獲取所需的類, JVM 提供了 3 種類載入器:

啟動類載入器(Bootstrap ClassLoader)

負責載入 JAVA_HOME\lib 目錄中的, 或通過-Xbootclasspath 引數指定路徑中的, 且被虛擬機器認可(按檔名識別, 如 rt.jar) 的類。

擴充套件類載入器(Extension ClassLoader)

負責載入 JAVA_HOME\lib\ext 目錄中的,或通過 java.ext.dirs 系統變數指定路徑中的類庫。

應用程式類載入器(Application ClassLoader):

負責載入使用者路徑(classpath)上的類庫。JVM 通過雙親委派模型進行類的載入, 當然我們也可以通過繼承 java.lang.ClassLoader實現自定義的類載入器。

27、談談永久代

1、JDK 8 之前,Hotspot 中方法區的實現是永久代(Perm)

2、JDK 7 開始把原本放在永久代的字串常量池、靜態變數等移出到堆,JDK 8 開始去除永久代,使用元空間(Metaspace),永久代剩餘內容移至元空間,元空間直接在本地記憶體分配。

28、ZGC收集器中的染色指標有什麼用?

染色指標是一種直接將少量額外的資訊儲存在指標上的技術,可是為什麼指標本身也可以儲存額外資訊呢?在64位系統中,理論可以訪問的記憶體高達16EB(2的64次冪)位元組 [3] 。實際上,基於需求(用不到那麼多記憶體)、效能(地址越寬在做地址轉換時需要的頁表級數越多)和成本(消耗更多電晶體)的考慮,在AMD64架構 [4] 中只支援到52位(4PB)的地址匯流排和48位(256TB)的虛擬地址空間,所以目前64位的硬體實際能夠支援的最大記憶體只有256TB。此外,作業系統一側也還會施加自己的約束,64位的Linux則分別支援47位(128TB)的程序虛擬地址空間和46位(64TB)的實體地址空間,64位的Windows系統甚至只支援44位(16TB)的實體地址空間。儘管Linux下64位指標的高18位不能用來定址,但剩餘的46位指標所能支援的64TB記憶體在今天仍然能夠充分滿足大型伺服器的需要。鑑於此,ZGC的染色指標技術繼續盯上了這剩下的46位指標寬度,將其高4位提取出來儲存四個標誌資訊。通過這些標誌位,虛擬機器可以直接從指標中看到其引用物件的三色標記狀態、是否進入了重分配集(即被移動過)、是否只能通過finalize()方法才能被訪問到。當然,由於這些標誌位進一步壓縮了原本就只有46位的地址空間,也直接導致ZGC能夠管理的記憶體不可以超過4TB(2的42次冪) 。

29、JVM垃圾回收時候如何確定垃圾?什麼是GC Roots?

JVM採用的是可達性分析演算法。JVM是通過GC Roots來判定物件的存活的。從GC Roots向下追溯、搜尋,會產生一個叫做Reference Chain的鏈條。當一個物件不能和任何一個GC Root產生關係,就判定為垃圾。

GC Roots大體包括:

1、活動執行緒相關的各種引用,比如虛擬機器棧中棧幀裡的引用。

2、類的靜態變數的引用。

3、JNI引用等。

當然也有比較詳細的回答,個人認為這些就夠了。詳細版本如下:

1、Java執行緒中,當前所有正在被呼叫的方法的引用型別引數、區域性變數、臨時值等。也就是與我們棧幀相關的各種引用。

2、所有當前被載入的Java類。

3、Java類的引用型別靜態變數。

4、執行時常量池裡的引用型別常量(String或Class型別)。

5、JVM內部資料結構的一些引用,比如sun.jvm.hotspot.memory.Universe類。

6、用於同步的監控物件,比如呼叫了物件的wait()方法。

7、JNI handles,包括global handles和local handles

30、什麼是記憶體屏障?

記憶體屏障,也叫記憶體柵欄,是一種CPU指令,用於控制特定條件下的重排序和記憶體可見性問題。LoadLoad屏障:對於這樣的語句Load1; LoadLoad; Load2,在Load2及後續讀取操作要讀取的資料被訪問前,保證Load1要讀取的資料被讀取完畢。StoreStore屏障:對於這樣的語句Store1; StoreStore; Store2,在Store2及後續寫入操作執行前,保證Store1的寫入操作對其它處理器可見。LoadStore屏障:對於這樣的語句Load1; LoadStore; Store2,在Store2及後續寫入操作被刷出前,保證Load1要讀取的資料被讀取完畢。StoreLoad屏障:對於這樣的語句Store1; StoreLoad; Load2,在Load2及後續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的。在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種記憶體屏障的功能。

更多JVM 面試題 60道

01、JAVA弱引用

02、什麼是堆

03、什麼是程式計數器

04、各種回收器,各自優缺點,重點CMS、G1

05、可以描述一下 class 檔案的結構嗎?

06、類的例項化順序

07、怎麼打出執行緒棧資訊?

08、程式計數器是什麼?

09、JVM的引用型別有哪些?

10、Serial 與 Parallel GC 之間的不同之處?

11、GC Roots 有哪些?

12、說說Java 垃圾回收機制

13、介紹一下類檔案結構吧!

14、分代收集演算法

15、堆溢位的原因?

06、Tomcat是怎麼打破雙親委派機制的呢?

17、你知道哪些垃圾收集器?

18、JVM 選項 -XX:+UseCompressedOops 有什麼作用?為什麼要使用

19、invokedynamic 指令是幹什麼的?

20、動態改變構造

21、類載入的過程是什麼?

22、談談 JVM 中的常量池

23、JVM 記憶體區域

24、G1 收集器

25、堆的作用是什麼?

26、如何檢視 JVM 當前使用的是什麼垃圾收集器?

27、GC的回收流程是怎樣的?

28、類的例項化順序

29、工作中常用的 JVM 配置引數有哪些?

30、Java裡有哪些引用型別?

31、ZGC 瞭解嗎?

32、safepoint是什麼?

33、JVM 提供的常用工具

34、CMS 收集器(多執行緒標記清除演算法)

35、物件都是優先分配在年輕代上的嗎?

36、有哪些 GC 演算法?

37、有什麼堆外記憶體的排查思路?

38、SWAP會影響效能麼?

39、你知道哪些JVM效能調優

40、你都有哪些手段用來排查記憶體溢位?

41、談談動態年齡判斷

42、類初始化的情況有哪些?

43、GC 是什麼?為什麼要有 GC?

44、MinorGC,MajorGC、FullGC都什麼時候發生?

45、Java的雙親委託機制是什麼?

46、在 Java 中,物件什麼時候可以被垃圾回收?

47、有哪些打破了雙親委託機制的案例?

48、JVM 年輕代到年老代的晉升過程的判斷條件是什麼呢?

49、JVM 資料執行區,哪些會造成 OOM 的情況?

50、JVM 類載入機制

52、老年代與標記複製演算法

53、分代回收

54、說一下堆和棧的區別

55、方法區/永久代(執行緒共享)

56、類載入器

07、談談永久代

58、ZGC收集器中的染色指標有什麼用?

59、JVM垃圾回收時候如何確定垃圾?什麼是GC Roots?

60、什麼是記憶體屏障?

如果不背 Jvm面試題的答案,肯定面試會掛!

這套Jvm面試題大全,希望對大家有幫助哈~

博主已將以下這些面試題整理成了一個面試手冊,是PDF版的