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版的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章