每天進步一點點:“JVM性能調優解析”,分享JVM進階面試題77問!

前言

Java虛擬機有自己完善的硬件架構,如處理器、堆棧等,還具有相應的指令系統。

Java虛擬機本質上就是一個程序,當它在命令行上啓動的時候,就開始執行保存在某字節碼文件中的指令。Java語言的可移植性正是建立在Java虛擬機的基礎上。任何平臺只要裝有針對於該平臺的Java虛擬機,字節碼文件(.class)就可以在該平臺上運行。這就是“一次編譯,多次運行”。

Java虛擬機不僅是一種跨平臺的軟件,而且是一種新的網絡計算平臺。該平臺包括許多相關的技術,如符合開放接口標準的各種API、優化技術等。Java技術使同一種應用可以運行在不同的平臺上。Java平臺可分爲兩部分,即Java虛擬機(Java virtual machine,JVM)和Java API類庫。

分享詳細解析77道Java面試時常問的JVM題,希望對各位有所幫助,另外我針對當前互聯網面試總結一些資料給大家,文末有領取方式(誠意滿滿)

由於文章篇幅問題,我這裏就不一一解析了,需要獲取全部答案解析的可以關注公衆號【風平浪靜如碼】獲取文檔!


1、java中會存在內存泄漏嗎,請簡單描述。
2、64 位 JVM 中,int 的長度是多數?
3、Serial 與 Parallel GC 之間的不同之處?
4、32 位和 64 位的 JVM,int 類型變量的長度是多數?
5、Java 中 WeakReference 與 SoftReference 的區別?
6、JVM 選項 -XX:+UseCompressedOops 有什麼作用?爲什麼要使用

當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,由於對象的指針從32 位增加到了 64 位,因此堆內存會突然增加,差不多要翻倍。這也會對 CPU緩存(容量比內存小很多)的數據產生不利的影響。因爲,遷移到 64 位的 JVM主要動機在於可以指定最大堆大小,通過壓縮OOP 可以節省一定的內存。通過-XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

7、怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64位?
8、32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數?
9、JRE、JDK、JVM 及 JIT 之間有什麼不同?
10、解釋 Java 堆空間及 GC?
11、JVM 內存區域

JVM 內存區域主要分爲線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區域【JAVA 堆、方法區】、直接內存。
線程私有數據區域生命週期與線程相同, 依賴用戶線程的啓動/結束 而 創建/銷燬(在 Hotspot VM 內, 每個線程都與操作系統的本地線程直接映射, 因此這部分內存區域的存/否跟隨本地線程的生/死對應)。

線程共享區域隨虛擬機的啓動/關閉而創建/銷燬。

直接內存並不是 JVM 運行時數據區的一部分, 但也會被頻繁的使用: 在 JDK 1.4 引入的 NIO 提供了基於 Channel 與 Buffer 的 IO 方式, 它可以使用 Native 函數庫直接分配堆外內存, 然後使用DirectByteBuffer 對象作爲這塊內存的引用進行操作, 這樣就避免了在 Java堆和 Native 堆中來回複製數據, 因此在一些場景中可以顯著提高性能。

12、程序計數器(線程私有)
13、虛擬機棧(線程私有)
14、本地方法區(線程私有)
15、你能保證 GC 執行嗎?
16、怎麼獲取 Java 程序使用的內存?堆使用的百分比?

可以通過 java.lang.Runtime 類中與內存相關方法來獲取剩餘的內存,總內存及最大堆內存。通過這些方法你也可以獲取到堆使用的百分比及堆內存的剩餘空間。Runtime.freeMemory() 方法返回剩餘空間的字節數,Runtime.totalMemory()方法總內存的字節數,
Runtime.maxMemory() 返回最大內存的字節數。

17、Java中堆和棧有什麼區別?
18、描述一下 JVM 加載 class 文件的原理機制
19、GC 是什麼?爲什麼要有 GC?
20、堆(Heap-線程共享) -運行時數據區
21、方法區/永久代(線程共享)
22、JVM 運行時內存

Java 堆從 GC 的角度還可以細分爲: 新生代(Eden 區、 From Survivor 區和 To Survivor 區)和老年代。

23、新生代
24、老年代
25、永久代
26、JAVA8 與元數據
27、引用計數法
28、可達性分析
29、標記清除算法( Mark-Sweep)

最基礎的垃圾回收算法,分爲兩個階段,標註和清除。標記階段標記出所有需要回收的對象,清除階段回收被標記的對象所佔用的空間。如圖:

從圖中我們就可以發現,該算法最大的問題是內存碎片化嚴重,後續可能發生大對象不能找到可利用空間的問題。

30、複製算法(copying)
31、標記整理算法(Mark-Compact)
32、分代收集算法
33、新生代與複製算法
34、老年代與標記複製算法
35、JAVA 強引用
36、JAVA 軟引用
37、JAVA 弱引用
38、JAVA 虛引用

虛引用需要 PhantomReference 類來實現,它不能單獨使用,必須和引用隊列聯合使用。 虛引用的主要作用是跟蹤對象被垃圾回收的狀態。

39、分代收集算法
40、在新生代-複製算法
41、在老年代-標記整理算法
42、分區收集算法
43、GC 垃圾收集器
44、Serial 垃圾收集器(單線程、 複製算法)
45、ParNew 垃圾收集器(Serial+多線程)
46、Parallel Scavenge 收集器(多線程複製算法、高效)
47、Serial Old 收集器(單線程標記整理算法 )

Serial Old 是 Serial 垃圾收集器年老代版本,它同樣是個單線程的收集器,使用標記-整理算法,這個收集器也主要是運行在 Client 默認的 java 虛擬機默認的年老代垃圾收集器。在 Server 模式下,主要有兩個用途:

  • 在 JDK1.5 之前版本中與新生代的 Parallel Scavenge 收集器搭配使用。
  • 作爲年老代中使用 CMS 收集器的後備垃圾收集方案。新生代 Serial 與年老代 Serial Old 搭配垃圾收集過程圖:

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

48、Parallel Old 收集器(多線程標記整理算法)
49、CMS 收集器(多線程標記清除算法)
50、G1 收集器
51、JVM 類加載機制
52、類加載器
53、雙親委派
54、OSGI( 動態模型系統)
55、動態改變構造
56、模塊化編程與熱插拔
57、JVM內存模型

線程獨佔:棧,本地方法棧,程序計數器
線程共享:堆,方法區

58、棧

又稱方法棧,線程私有的,線程執行方法是都會創建一個棧陣,用來存儲局部變量表,操作棧,動態鏈接,方法出口等信息.調用方法時執行入棧,方法返回式執行出棧.

59、本地方法棧

與棧類似,也是用來保存執行方法的信息.執行Java方法是使用棧,執行Native方法時使用本地方法棧.

60、程序計數器

保存着當前線程執行的字節碼位置,每個線程工作時都有獨立的計數器,只爲執行Java方法服務,執行Native方法時,程序計數器爲空.

61、堆

JVM內存管理最大的一塊,對被線程共享,目的是存放對象的實例,幾乎所欲的對象實例都會放在這裏,當堆沒有可用空間時,會拋出OOM異常.根據對象的存活週期不同,JVM把對象進行分代管理,由垃圾回收器進行垃圾的回收管理

62、方法區
63、分代回收
64、堆和棧的區別
65、什麼時候會觸犯FullGC
66、什麼是Java虛擬機?爲什麼Java被稱作是“平臺無關的編程語言”?
67、對象分配規則
68、描述一下JVM加載class文件的原理機制?
69、Java對象創建過程
70、簡述Java的對象結構
71、如何判斷對象可以被回收

判斷對象是否存活一般有兩種方式:

  • 引用計數:每個對象有一個引用計數屬性,新增一個引用時計數加1,引用釋放時計數減1,計數爲0時可以回收。此方法簡單,無法解決對象相互循環引用的問題。
  • 可達性分析(Reachability Analysis):從GC Roots開始向下搜索,搜索所走過的路徑稱爲引用鏈。當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的,不可達對象。

72、JVM的永久代中會發生垃圾回收麼
73、垃圾收集算法
74、調優命令有哪些?
75、調優工具
76、Minor GC與Full GC分別在什麼時候發生?
77、你知道哪些JVM性能調優

設定堆內存大小
-Xmx:堆內存最大限制。
設定新生代大小。 新生代不宜太小,否則會有大量對象涌入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代佔比
-XX:SurvivorRatio:伊甸園空間和倖存者空間的佔比
設定垃圾回收器 年輕代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC


分享一下我的一套學習資料庫,大夥看看有沒有需要的:

  • Java核心知識點:

  • Java千道面試寶典:

內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技術棧

  • 架構學習資料:

  • 學習視頻:

以上這些學習資料都能夠免費分享給小夥伴們,希望能一起努力,共同進步!有需要的,關注我的公衆號【風平浪靜如碼】獲取!(引流不易,誠意滿滿)

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