【2021最新版】JVM面試題總結(87道題含答案解析)

文章目錄

最近面試的小夥伴不少,對此我整理了一份Java面試題手冊:基礎知識、JavaOOP、Java集合/泛型面試題、Java異常面試題、Java中的IO與NIO面試題、Java反射、Java序列化、Java註解、多線程&併發、JVM、Mysql、Redis、Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、Dubbo、MyBatis、ZooKeeper、數據結構、算法、Elasticsearch、Kafka、微服務、Linux等等。能夠分享給你們學習。【持續更新中】java

完整版Java面試題地址:【2021最新版】Java面試真題彙總程序員

序號 內容 地址連接
1 【2021最新版】JavaOOP面試題總結 http://www.noobyard.com/article/p-rncfmibs-oe.html
2 【2021最新版】Java基礎面試題總結 http://www.noobyard.com/article/p-ykqnztan-oe.html
3 【2021最新版】多線程&併發面試題總結 http://www.noobyard.com/article/p-nhidektg-oe.html
4 【2021最新版】Mysql面試題總結 未更新
5 【2021最新版】Redis面試題總結 未更新
6 【2021最新版】Memcached面試題總結 未更新
7 【2021最新版】MongoDB面試題總結 未更新
8 【2021最新版】Spring面試題總結 未更新
9 【2021最新版】Spring Boot面試題總結 未更新
10 【2021最新版】Spring Cloud面試題總結 未更新
11 【2021最新版】RabbitMQ面試題總結 未更新
12 【2021最新版】Dubbo面試題總結 未更新
13 【2021最新版】MyBatis面試題總結 未更新
14 【2021最新版】ZooKeeper面試題總結 未更新
15 【2021最新版】數據結構面試題總結 未更新
16 【2021最新版】算法面試題總結 未更新
17 【2021最新版】Elasticsearch面試題總結 未更新
18 【2021最新版】Kafka面試題總結 未更新
19 【2021最新版】微服務面試題總結 未更新
20 【2021最新版】Linux面試題總結 未更新

一、Java中會存在內存泄漏嗎,請簡單描述。

答:web

會,本身實現堆載的數據結構時有可能會出現內存泄露,可參看effective java。面試

二、64位JVM中,int的長度是多數?

三、Serial與Parallel GC之間的不一樣之處?

四、32位和64位的JVM,int類型變量的長度是多數?

答:算法

32位和64位的JVM中,int類型變量的長度是相同的,都是32位或者4個字節。sql

五、Java中WeakReference與SoftReference的區別?

六、JVM選項-XX:+UseCompressedOops有什麼做用?爲何要使用?

七、怎樣經過Java程序來判斷JVM是32位仍是64位?

八、32位JVM和64位JVM的最大堆內存分別是多數?

九、JRE、JDK、JVM及JIT之間有什麼不一樣?

十、解釋Java堆空間及GC?

十一、JVM內存區域

答:

JVM內存區域主要分爲線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區域【JAVA堆、方法區】、直接內存。編程

線程私有數據區域生命週期與線程相同, 依賴用戶線程的啓動/結束 而 建立/銷燬(在Hotspot VM內, 每一個線程都與操做系統的本地線程直接映射, 所以這部份內存區域的存/否跟隨本地線程的生/死對應)。服務器

線程共享區域隨虛擬機的啓動/關閉而建立/銷燬。數據結構

直接內存並非JVM運行時數據區的一部分, 但也會被頻繁的使用:在JDK1.4引入的NIO提供了基於Channel與Buffer的IO方式, 它可使用Native函數庫直接分配堆外內存, 而後使用DirectByteBuffer對象做爲這塊內存的引用進行操做(詳見:Java I/O擴展), 這樣就避免了在Java堆和Native堆中來回複製數據, 所以在一些場景中能夠顯著提升性能。多線程

十二、程序計數器(線程私有)

答:

一塊較小的內存空間, 是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱爲「線程私有」 的內存。

正在執行java方法的話,計數器記錄的是虛擬機字節碼指令的地址(當前指令的地址) 。若是仍是Native方法,則爲空。
這個內存區域是惟一一個在虛擬機中沒有規定任何OutOfMemoryError狀況的區域。

1三、虛擬機棧(線程私有)

答:

是描述java方法執行的內存模型,每一個方法在執行的同時都會建立一個棧幀(Stack Frame)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息。 每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。
棧幀( Frame)是用來存儲數據和部分過程結果的數據結構,同時也被用來處理動態連接(Dynamic Linking)、 方法返回值和異常分派(Dispatch Exception)。 棧幀隨着方法調用而建立,隨着方法結束而銷燬——不管方法是正常完成仍是異常完成(拋出了在方法內未被捕獲的異常)都算做方法結束。

1四、本地方法區(線程私有)

答:

不能,雖然你能夠調用System.gc() 或者Runtime.gc(),可是沒有辦法保證GC的執行。

1五、你能保證GC執行嗎?

1六、怎麼獲取Java程序使用的內存?堆使用的百分比?

答:

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

1七、Java中堆和棧有什麼區別?

1八、描述一下JVM加載class文件的原理機制

1九、GC是什麼?爲何要有GC?

答:

GC是垃圾收集的意思 ,內存處理是編程人員容易出現問題的地方 ,忘記或者錯誤的內存回收會致使程序 或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否 超過做用域從而達到自動回收內存的目的 ,Java語言沒有提供釋放已分配內存的顯示操做方法 。Java程序員不用擔憂內存管理, 由於垃圾收集器會自動進行管理 。要請求垃圾收集 ,能夠調用下面的方法之一 :System.gc() 或Runtime.getRuntime().gc() ,但JVM能夠屏蔽掉顯示的垃圾回收調用 。

垃圾回收能夠有效的防止內存泄露,有效的使用可使用的內存。垃圾回收器一般是做爲一個單獨的低優先級的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收。在Java誕生初期,垃圾回收是Java最大的亮點之一,由於服務器端的編程須要有效的防止存泄露問題,然而時過境遷,現在Java的垃圾回收機制已經成爲被詬病的東。移動智能終端用戶一般以爲iOS的系統比Android系統有更好的用戶體驗,其中一個深層次的緣由就在於Android系統中垃圾回收的不可預知性。

20、堆(Heap-線程共享)-運行時數據區

2一、方法區/永久代(線程共享)

2二、JVM運行時內存

答:

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

2三、新生代

2四、老年代

2五、永久代

2六、JAVA8與元數據

2七、引用計數法

2八、可達性分析

2九、標記清除算法(Mark-Sweep)

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

如圖

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

30、複製算法(copying)

答:

爲了解決 Mark-Sweep 算法內存碎片化的缺陷而被提出的算法。按內存容量將內存劃分爲等大小的兩塊。每次只使用其中一塊,當這一塊內存滿後將尚存活的對象複製到另外一塊上去,把已使用的內存清掉。

如圖:

這種算法雖然實現簡單,內存效率高,不易產生碎片,可是最大的問題是可用內存被壓縮到了本來的一半。且存活對象增多的話, Copying算法的效率會大大下降。

3一、標記整理算法(Mark-Compact)

答:
結合了以上兩個算法,爲了不缺陷而提出。標記階段和 Mark-Sweep 算法相同, 標記後不是清理對象,而是將存活對象移向內存的一端。而後清除端邊界外的對象。

如圖

3二、分代收集算法

3三、新生代與複製算法

答:

目前大部分JVM 的 GC對於新生代都採起Copying算法,由於新生代中每次垃圾回收都要回收大部分對象,即要複製的操做比較少,但一般並非按照1: 1來劃分新生代。通常將新生代劃分爲一塊較大的Eden空間和兩個較小的Survivor空間(From Space, To Space),每次使用Eden空間和其中的一塊Survivor空間,當進行回收時,將該兩塊空間中還存活的對象複製到另外一塊Survivor空間中。

3四、老年代與標記複製算法

3五、JAVA強引用

3六、JAVA軟引用

3七、JAVA弱引用

3八、JAVA虛引用

3九、分代收集算法

40、在新生代-複製算法

4一、在老年代-標記整理算法

4二、分區收集算法

4三、GC垃圾收集器

答:

Java堆內存被劃分爲新生代和年老代兩部分,新生代主要使用複製和標記-清除垃圾回收算法;年老代主要使用標記-整理垃圾回收算法,所以java虛擬中針對新生代和年老代分別提供了多種不一樣的垃圾收集器, JDK1.6中Sun HotSpot虛擬機的垃圾收集器以下:

4四、Serial垃圾收集器(單線程、 複製算法)

4五、ParNew垃圾收集器(Serial+多線程)

4六、Parallel Scavenge收集器(多線程複製算法、高效)

5七、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搭配垃圾收集過程圖:

5八、Parallel Old收集器(多線程標記整理算法)

5九、CMS收集器(多線程標記清除算法)

60、G1收集器

6一、JVM類加載機制

6二、類加載器

答:

虛擬機設計團隊把加載動做放到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實現自定義的類加載器。

6三、雙親委派

6四、OSGI(動態模型系統)

6五、動態改變構造

6六、模塊化編程與熱插拔

6七、JVM內存模型

6八、棧

6九、本地方法棧

70、程序計數器

7一、堆

7二、方法區

7三、分代回收

答:

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

年輕代->標記-複製

老年代->標記-清除

7四、堆和棧的區別

7五、何時會觸發FullGC

7六、什麼是Java虛擬機?爲何Java被稱做是「平臺無關的編程語言」?

7七、對象分配規則

7八、描述一下JVM加載class文件的原理機制?

7九、Java對象建立過程

80、簡述Java的對象結構

8一、如何判斷對象能夠被回收

8二、JVM的永久代中會發生垃圾回收麼

8三、垃圾收集算法

8四、調優命令有哪些?

8五、調優工具

8六、Minor GC與Full GC分別在何時發生?

8七、你知道哪些JVM性能調優

答:

設定堆內存大小-Xmx:堆內存最大限制。

設定新生代大小。 新生代不宜過小,不然會有大量對象涌入老年代

-XX:NewSize:新生代大小

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

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

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

總結

該面試題答案解析完整文檔獲取方式:JVM面試題總結

篇幅有限,其餘內容就不在這裏一 一展現了,整理不易,歡迎你們一塊兒交流,喜歡小編分享的文章記得關注我點贊喲,感謝支持!重要的事情說三遍,轉發+轉發+轉發,必定要記得轉發哦!!!