溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java虛擬機(jī)常見面試題

發(fā)布時間:2021-06-28 16:39:13 來源:億速云 閱讀:157 作者:chen 欄目:編程語言

這篇文章主要介紹“Java虛擬機(jī)常見面試題”,在日常操作中,相信很多人在Java虛擬機(jī)常見面試題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java虛擬機(jī)常見面試題”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

前言

我堅信,機(jī)會永遠(yuǎn)屬于有準(zhǔn)備的人,我們與其羨慕他人的成功,不如從此刻起,積累足夠多的知識和面試經(jīng)驗,為將來進(jìn)入更好的公司做好充分的準(zhǔn)備!想讓面試官在短短的幾十分鐘內(nèi)認(rèn)可你的能力?想在最短的時間內(nèi)收獲 Java 技術(shù)棧最核心的知識點(diǎn)?想要更全面更深入的了解 Java 技術(shù)?這篇文章給你想要的所有答案。

小編分享的這份Java后端開發(fā)面試總結(jié)包含了JavaOOP、Java集合容器、Java異常、并發(fā)編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數(shù)據(jù)庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分布式&數(shù)據(jù)結(jié)構(gòu)與算法等26個專題技術(shù)點(diǎn),都是小編在各個大廠總結(jié)出來的面試真題,已經(jīng)有很多粉絲靠這份PDF拿下眾多大廠的offer,今天在這里總結(jié)分享給到大家!【已完結(jié)】

完整版Java面試題地址:2021最新面試題合集集錦。

序號專題內(nèi)容鏈接
1中間件Java中間件面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5012470
2微服務(wù)Java微服務(wù)面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5014045
3并發(fā)編程Java并發(fā)編程面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5017511
4Java基礎(chǔ)Java基礎(chǔ)知識面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5020008
5Spring BootSpring Boot面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5021192
6RedisRedis面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5022120
7Spring MVCSpring MVC面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5022126
8Spring CloudSpring Cloud面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5023319
9MySQL優(yōu)化MySQL優(yōu)化面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5023320
10JVMJVM性能調(diào)優(yōu)面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5023321
11LinuxLinux面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5025281
12MybatisMybatis面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5025282
13網(wǎng)絡(luò)編程TCP,UDP,Socket,Http網(wǎng)絡(luò)編程面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5025284
14設(shè)計模式設(shè)計模式面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5033946
15大數(shù)據(jù)大數(shù)據(jù)面試題100道(2021最新版)https://my.oschina.net/u/4678580/blog/5037399
16TomcatTomcat面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5034995
17多線程多線程面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5036124
18NginxNginx_BIO_NIO_AIO面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5037626
19memcachememcache面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5033471
20java異常java異常面試題(2021最新版)https://my.oschina.net/u/4678580/blog/5038814
21Java虛擬機(jī)Java虛擬機(jī)面試題(2021最新版)持續(xù)更新中!
22Java集合Java集合面試題(2021最新版)持續(xù)更新中!
23Git常用命令Git常用命令(2021最新版)持續(xù)更新中!
24ElasticsearchElasticsearch面試題(2021最新版)持續(xù)更新中!
25DubboDubbo面試題(2021最新版)持續(xù)更新中!

一、Java內(nèi)存模型

1. 我們開發(fā)人員編寫的Java代碼是怎么讓電腦認(rèn)識的

Java虛擬機(jī)常見面試題

2. 為什么說java是跨平臺語言

  • 這個夸平臺是中間語言(JVM)實現(xiàn)的夸平臺

  • Java有JVM從軟件層面屏蔽了底層硬件、指令層面的細(xì)節(jié)讓他兼容各種系統(tǒng)

3. Jdk和Jre和JVM的區(qū)別

  • Jdk包括了Jre和Jvm,Jre包括了Jvm

  • Jdk是我們編寫代碼使用的開發(fā)工具包

  • Jre 是Java的運(yùn)行時環(huán)境,他大部分都是 C 和 C++ 語言編寫的,他是我們在編譯java時所需要的基礎(chǔ)的類庫

  • Jvm俗稱Java虛擬機(jī),他是java運(yùn)行環(huán)境的一部分,它虛構(gòu)出來的一臺計算機(jī),在通過在實際的計算機(jī)上仿真模擬各種計算機(jī)功能來實現(xiàn)Java應(yīng)用程序

  • 看Java官方的圖片,Jdk中包括了Jre,Jre中包括了JVM

Java虛擬機(jī)常見面試題

4. 說一下 JVM由那些部分組成,運(yùn)行流程是什么?

Java虛擬機(jī)常見面試題

5. 說一下 JVM 運(yùn)行時數(shù)據(jù)區(qū)

Java 虛擬機(jī)在執(zhí)行 Java 程序的過程中會把它所管理的內(nèi)存區(qū)域劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用途,以及創(chuàng)建和銷毀的時間,有些區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則是依賴線程的啟動和結(jié)束而建立和銷毀。Java 虛擬機(jī)所管理的內(nèi)存被劃分為如下幾個區(qū)域:

Java虛擬機(jī)常見面試題

  • 程序計數(shù)器(Program Counter Register):當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解析器的工作是通過改變這個計數(shù)器的值,來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能,都需要依賴這個計數(shù)器來完成;為什么要線程計數(shù)器?因為線程是不具備記憶功能

  • Java 虛擬機(jī)棧(Java Virtual Machine Stacks):每個方法在執(zhí)行的同時都會在Java 虛擬機(jī)棧中創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息;棧幀就是Java虛擬機(jī)棧中的下一個單位

  • 本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過虛擬機(jī)棧是服務(wù) Java方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;

  • Native 關(guān)鍵字修飾的方法是看不到的,Native 方法的源碼大部分都是 C和C++ 的代碼

  • Java 堆(Java Heap):Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,幾乎所有的對象實例都在這里分配內(nèi)存;

  • 方法區(qū)(Methed Area):用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯后的代碼等數(shù)據(jù)。

6. 詳細(xì)的介紹下程序計數(shù)器?(重點(diǎn)理解)

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

7. 詳細(xì)介紹下Java虛擬機(jī)棧?(重點(diǎn)理解)

  1. Java虛擬機(jī)是線程私有的,它的生命周期和線程相同。

  2. 虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型: 每個方法在執(zhí)行的同時 都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。

解釋:虛擬機(jī)棧中是有單位的,單位就是棧幀,一個方法一個棧幀。一個棧幀中他又要存儲,局部變量,操作數(shù)棧,動態(tài)鏈接,出口等。

Java虛擬機(jī)常見面試題

8. 你能給我詳細(xì)的介紹Java堆嗎?(重點(diǎn)理解)

  • java堆(Java Heap)是java虛擬機(jī)所管理的內(nèi)存中最大的一塊,是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實例。

  • 在Java虛擬機(jī)規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配。

  • java堆是垃圾收集器管理的主要區(qū)域,因此也被成為“GC堆”。

  • 從內(nèi)存回收角度來看java堆可分為:新生代和老生代。

  • 從內(nèi)存分配的角度看,線程共享的Java堆中可能劃分出多個線程私有的分配緩沖區(qū)。

  • 無論怎么劃分,都與存放內(nèi)容無關(guān),無論哪個區(qū)域,存儲的都是對象實例,進(jìn)一步的劃分都是為了更好的回收內(nèi)存,或者更快的分配內(nèi)存。

  • 根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,java堆可以處于物理上不連續(xù)的內(nèi)存空間中。當(dāng)前主流的虛擬機(jī)都是可擴(kuò)展的(通過 -Xmx 和 -Xms 控制)。如果堆中沒有內(nèi)存可以完成實例分配,并且堆也無法再擴(kuò)展時,將會拋出OutOfMemoryError異常。

9. 能不能解釋一下本地方法棧?

  1. 本地方法棧很好理解,他很棧很像,只不過方法上帶了 native 關(guān)鍵字的棧字

  2. 它是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)的服務(wù)方法

  3. native關(guān)鍵字的方法是看不到的,必須要去oracle官網(wǎng)去下載才可以看的到,而且native關(guān)鍵字修飾的大部分源碼都是C和C++的代碼。

  4. 同理可得,本地方法棧中就是C和C++的代碼

10. 能不能解釋一下方法區(qū)(重點(diǎn)理解)

  1. 方法區(qū)是所有線程共享的內(nèi)存區(qū)域,它用于存儲已被Java虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。

  2. 它有個別命叫Non-Heap(非堆)。當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,拋出OutOfMemoryError異常。

11. 什么是JVM字節(jié)碼執(zhí)行引擎

  • 虛擬機(jī)核心的組件就是執(zhí)行引擎,它負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,一般戶先進(jìn)行編譯成機(jī)器碼后執(zhí)行。

  • “虛擬機(jī)”是一個相對于“物理機(jī)”的概念,虛擬機(jī)的字節(jié)碼是不能直接在物理機(jī)上運(yùn)行的,需要JVM字節(jié)碼執(zhí)行引擎- 編譯成機(jī)器碼后才可在物理機(jī)上執(zhí)行。

12. 你聽過直接內(nèi)存嗎?

  • 直接內(nèi)存(Direct Memory)并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)中定義的內(nèi)存區(qū)域。但是這部分內(nèi)存也被頻繁地使用,而且也可能導(dǎo)致 OutOfMemoryError 異常出現(xiàn),所以我們放到這里一起講解。

  • 我的理解就是直接內(nèi)存是基于物理內(nèi)存和Java虛擬機(jī)內(nèi)存的中間內(nèi)存

13. 知道垃圾收集系統(tǒng)嗎?

  • 程序在運(yùn)行過程中,會產(chǎn)生大量的內(nèi)存垃圾(一些沒有引用指向的內(nèi)存對象都屬于內(nèi)存垃圾,因為這些對象已經(jīng)無法訪問,程序用不了它們了,對程序而言它們已經(jīng)死亡),為了確保程序運(yùn)行時的性能,java虛擬機(jī)在程序運(yùn)行的過程中不斷地進(jìn)行自動的垃圾回收(GC)。

  • 垃圾收集系統(tǒng)是Java的核心,也是不可少的,Java有一套自己進(jìn)行垃圾清理的機(jī)制,開發(fā)人員無需手工清理

  • 有一部分原因就是因為Java垃圾回收系統(tǒng)的強(qiáng)大導(dǎo)致Java領(lǐng)先市場

14. 堆棧的區(qū)別是什么?

Java虛擬機(jī)常見面試題

15. 深拷貝和淺拷貝

  • 淺拷貝(shallowCopy)只是增加了一個指針指向已存在的內(nèi)存地址,

  • 深拷貝(deepCopy)是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存,

  • 淺復(fù)制:僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址發(fā)生改變,那么淺復(fù)制出來的對象也會相應(yīng)的改變。

  • 深復(fù)制:在計算機(jī)中開辟一塊新的內(nèi)存地址用于存放復(fù)制的對象。

16. Java會存在內(nèi)存泄漏嗎?請說明為什么?

  • 內(nèi)存泄漏是指不再被使用的對象或者變量一直被占據(jù)在內(nèi)存中。理論上來說,Java是有GC垃圾回收機(jī)制的,也就是說,不再被使用的對象,會被GC自動回收掉,自動從內(nèi)存中清除。

  • 但是,即使這樣,Java也還是存在著內(nèi)存泄漏的情況,java導(dǎo)致內(nèi)存泄露的原因很明確:長生命周期的對象持有短生命周期對象的引用就很可能發(fā)生內(nèi)存泄露, 盡管短生命周期對象已經(jīng)不再需要,但是因為長生命周期對象持有它的引用而導(dǎo)致不能被回收 ,這就是java中內(nèi)存泄露的發(fā)生場景。

二、垃圾回收機(jī)制及算法

17. 簡述Java垃圾回收機(jī)制

  • 在java中,程序員是不需要顯示的去釋放一個對象的內(nèi)存的,而是由虛擬機(jī)自行執(zhí)行。在JVM中,有一個垃圾回收線程,它是低優(yōu)先級的,在正常情況下是不會執(zhí)行的,只有在虛擬機(jī)空閑或者當(dāng)前堆內(nèi)存不足時,才會觸發(fā)執(zhí)行,掃面那些沒有被任何引用的對象,并將它們添加到要回收的集合中,進(jìn)行回收。

18. GC是什么?為什么要GC

  • GC 是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java 提供的 GC 功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的,Java 語言沒有提供釋放已分配內(nèi)存的顯示操作方法。

19. 垃圾回收的優(yōu)點(diǎn)和缺點(diǎn)

  • 優(yōu)點(diǎn):JVM的垃圾回收器都不需要我們手動處理無引用的對象了,這個就是最大的優(yōu)點(diǎn)

  • 缺點(diǎn):程序員不能實時的對某個對象或所有對象調(diào)用垃圾回收器進(jìn)行垃圾回收。

20. 垃圾回收器的原理是什么?有什么辦法手動進(jìn)行垃圾回收?

  • 對于GC來說,當(dāng)程序員創(chuàng)建對象時,GC就開始監(jiān)控這個對象的地址、大小以及使用情況。

  • 通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)GC確定一些對象為"不可達(dá)"時,GC就有責(zé)任回收這些內(nèi)存空間。

  • 可以。程序員可以手動執(zhí)行System.gc(),通知GC運(yùn)行,但是Java語言規(guī)范并不保證GC一定會執(zhí)行。

21. JVM 中都有哪些引用類型?

  • 強(qiáng)引用:發(fā)生 gc 的時候不會被回收。

  • 軟引用:有用但不是必須的對象,在發(fā)生內(nèi)存溢出之前會被回收。

  • 弱引用:有用但不是必須的對象,在下一次GC時會被回收。

  • 虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用 PhantomReference 實現(xiàn)虛引用,虛引用的用途是在 gc 時返回一個通知。

22. 怎么判斷對象是否可以被回收?

Java虛擬機(jī)常見面試題

23. Full GC是什么

  • 清理整個堆空間—包括年輕代和老年代和永久代

  • 因為Full GC是清理整個堆空間所以Full GC執(zhí)行速度非常慢,在Java開發(fā)中最好保證少觸發(fā)Full GC

24. 對象什么時候可以被垃圾器回收

  • 當(dāng)對象對當(dāng)前使用這個對象的應(yīng)用程序變得不可觸及的時候,這個對象就可以被回收了。

  • 垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。

25. JVM 垃圾回收算法有哪些?

  • 標(biāo)記-清除算法:標(biāo)記無用對象,然后進(jìn)行清除回收。缺點(diǎn):效率不高,無法清除垃圾碎片。

  • 復(fù)制算法:按照容量劃分二個大小相等的內(nèi)存區(qū)域,當(dāng)一塊用完的時候?qū)⒒钪膶ο髲?fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點(diǎn):內(nèi)存使用率不高,只有原來的一半。

  • 標(biāo)記-整理算法:標(biāo)記無用對象,讓所有存活的對象都向一端移動,然后直接清除掉端邊界以外的內(nèi)存。

  • 分代算法:根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊,一般是新生代和老年代,新生代基本采用復(fù)制算法,老年代采用標(biāo)記整理算法。

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

26. JVM中的永久代中會發(fā)生垃圾回收嗎

垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到元數(shù)據(jù)區(qū) (注:Java8中已經(jīng)移除了永久代,新加了一個叫做元數(shù)據(jù)區(qū)的native內(nèi)存區(qū))

三、垃圾收集器以及新生代、老年代、永久代

27. 講一下新生代、老年代、永久代的區(qū)別

Java虛擬機(jī)常見面試題

28. Minor GC、Major GC、Full GC是什么

  1. Minor GC是新生代GC,指的是發(fā)生在新生代的垃圾收集動作。由于java對象大都是朝生夕死的,所以Minor GC非常頻繁,一般回收速度也比較快。(一般采用復(fù)制算法回收垃圾)

  2. Major GC是老年代GC,指的是發(fā)生在老年代的GC,通常執(zhí)行Major GC會連著Minor GC一起執(zhí)行。Major GC的速度要比Minor GC慢的多。(可采用標(biāo)記清楚法和標(biāo)記整理法)

  3. Full GC是清理整個堆空間,包括年輕代和老年代

29. Minor GC、Major GC、Full GC區(qū)別及觸發(fā)條件

Java虛擬機(jī)常見面試題

30. 為什么新生代要分Eden和兩個 Survivor 區(qū)域?

  • 如果沒有Survivor,Eden區(qū)每進(jìn)行一次Minor GC,存活的對象就會被送到老年代。老年代很快被填滿,觸發(fā)Major GC.老年代的內(nèi)存空間遠(yuǎn)大于新生代,進(jìn)行一次Full GC消耗的時間比Minor GC長得多,所以需要分為Eden和Survivor。

  • Survivor的存在意義,就是減少被送到老年代的對象,進(jìn)而減少Full GC的發(fā)生,Survivor的預(yù)篩選保證,只有經(jīng)歷15次Minor GC還能在新生代中存活的對象,才會被送到老年代。

  • 設(shè)置兩個Survivor區(qū)最大的好處就是解決了碎片化,剛剛新建的對象在Eden中,經(jīng)歷一次MinorGC,Eden中的存活對象就會被移動到第一塊survivor space S0,Eden被清空;等Eden區(qū)再滿了,就再觸發(fā)一次Minor GC,Eden和S0中的存活對象又會被復(fù)制送入第二塊survivor spaceS1(這個過程非常重要,因為這種復(fù)制算法保證了S1中來自S0和Eden兩部分的存活對象占用連續(xù)的內(nèi)存空間,避免了碎片化的發(fā)生)

31. Java堆老年代( Old ) 和新生代 ( Young ) 的默認(rèn)比例?

  • 默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) –XX:NewRatio來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。老年代 ( Old ) = 2/3 的堆空間大小。

  • 其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個 Survivor 區(qū)域,Edem 和倆個Survivor 區(qū)域比例是 = 8 : 1 : 1 ( 可以通過參數(shù) –XX:SurvivorRatio 來設(shè)定 ),

  • 但是JVM 每次只會使用 Eden 和其中的一塊 Survivor 區(qū)域來為對象服務(wù),所以無論什么時候,總是有一塊 Survivor 區(qū)域是空閑著的。

32.為什么要這樣分代:

Java虛擬機(jī)常見面試題

33. 什么是垃圾回收器他和垃圾算法有什么區(qū)別

  • 垃圾收集器是垃圾回收算法(標(biāo)記清楚法、標(biāo)記整理法、復(fù)制算法、分代算法)的具體實現(xiàn),不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能會有很在差別。

34. 說一下 JVM 有哪些垃圾回收器?

  • 如果說垃圾收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實現(xiàn)。下圖展示了7種作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Scavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,還有用于回收整個Java堆的G1收集器。不同收集器之間的連線表示它們可以搭配使用。

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

  • Serial收集器(復(fù)制算法): 新生代單線程收集器,標(biāo)記和清理都是單線程,優(yōu)點(diǎn)是簡單高效;

  • ParNew收集器 (復(fù)制算法): 新生代收并行集器,實際上是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn);

  • Parallel Scavenge收集器 (復(fù)制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用戶線程時間/(用戶線程時間+GC線程時間),高吞吐量可以高效率的利用CPU時間,盡快完成程序的運(yùn)算任務(wù),適合后臺應(yīng)用等對交互相應(yīng)要求不高的場景;

  • Serial Old收集器 (標(biāo)記-整理算法): 老年代單線程收集器,Serial收集器的老年代版本;

  • Parallel Old收集器 (標(biāo)記-整理算法): 老年代并行收集器,吞吐量優(yōu)先,Parallel Scavenge收集器的老年代版本;

  • CMS(Concurrent Mark Sweep)收集器(標(biāo)記-清除算法): 老年代并行收集器,以獲取最短回收停頓時間為目標(biāo)的收集器,具有高并發(fā)、低停頓的特點(diǎn),追求最短GC回收停頓時間。

  • G1(Garbage First)收集器 ( 標(biāo)記整理 + 復(fù)制算法來回收垃圾 ): Java堆并行收集器,G1收集器是JDK1.7提供的一個新收集器,G1收集器基于“標(biāo)記-整理”算法實現(xiàn),也就是說不會產(chǎn)生內(nèi)存碎片。此外,G1收集器不同于之前的收集器的一個重要特點(diǎn)是:G1回收的范圍是整個Java堆(包括新生代,老年代),而前六種收集器回收的范圍僅限于新生代或老年代。

35. 收集器可以這么分配?(了解就好了)

Serial / Serial Old
Serial / CMS
ParNew / Serial Old
ParNew / CMS
Parallel Scavenge / Serial Old
Parallel Scavenge / Parallel Old
G1

36. 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么區(qū)別?

  • 新生代回收器:Serial、ParNew、Parallel Scavenge

  • 老年代回收器:Serial Old、Parallel Old、CMS

  • 整堆回收器:G1

  • 新生代垃圾回收器一般采用的是復(fù)制算法,復(fù)制算法的優(yōu)點(diǎn)是效率高,缺點(diǎn)是內(nèi)存利用率低;老年代回收器一般采用的是標(biāo)記-整理的算法進(jìn)行垃圾回收。

37. 簡述分代垃圾回收器是怎么工作的?

  • 分代回收器有兩個分區(qū):老生代和新生代,新生代默認(rèn)的空間占比總空間的 1/3,老生代的默認(rèn)占比是 2/3。

  • 新生代使用的是復(fù)制算法,新生代里有 3 個分區(qū):Eden、To Survivor、From Survivor,它們的默認(rèn)占比是 8:1:1,它的執(zhí)行流程如下:

  • 把 Eden + From Survivor 存活的對象放入 To Survivor 區(qū);

  • 清空 Eden 和 From Survivor 分區(qū);

  • From Survivor 和 To Survivor 分區(qū)交換,F(xiàn)rom Survivor 變 To Survivor,To Survivor 變

  • From Survivor。

  • 每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)配置是 15)時,升級為老生代。大對象也會直接進(jìn)入老生代。

  • 老生代當(dāng)空間占用到達(dá)某個值之后就會觸發(fā)全局垃圾收回,一般使用標(biāo)記整理的執(zhí)行算法。以上這些循環(huán)往復(fù)就構(gòu)成了整個分代垃圾回收的整體執(zhí)行流程。

四、內(nèi)存分配策略

38. 簡述java內(nèi)存分配與回收策率以及Minor GC和Major GC

Java虛擬機(jī)常見面試題

五、虛擬機(jī)類加載機(jī)制

42. 簡述java類加載機(jī)制?

  • 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗,解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型。

43.類加載的機(jī)制及過程

  • 程序主動使用某個類時,如果該類還未被加載到內(nèi)存中,則JVM會通過加載、連接、初始化3個步驟來對該類進(jìn)行初始化。如果沒有意外,JVM將會連續(xù)完成3個步驟,所以有時也把這個3個步驟統(tǒng)稱為類加載或類初始化。

Java虛擬機(jī)常見面試題

Java虛擬機(jī)常見面試題

44. 描述一下JVM加載Class文件的原理機(jī)制

Java虛擬機(jī)常見面試題

45. 什么是類加載器,類加載器有哪些?

Java虛擬機(jī)常見面試題

46. 說一下類裝載的執(zhí)行過程?

Java虛擬機(jī)常見面試題

47. 什么是雙親委派模型?

Java虛擬機(jī)常見面試題

六、JVM調(diào)優(yōu)

48. JVM 調(diào)優(yōu)的參數(shù)可以在那設(shè)置參數(shù)值

Java虛擬機(jī)常見面試題

49. 說一下 JVM 調(diào)優(yōu)的工具?

Java虛擬機(jī)常見面試題

50. 常用的 JVM 調(diào)優(yōu)的參數(shù)都有哪些?

#常用的設(shè)置

  • -Xms:初始堆大小,JVM 啟動的時候,給定堆空間大小。

  • -Xmx:最大堆大小,JVM 運(yùn)行過程中,如果初始堆空間不足的時候,最大可以擴(kuò)展到多少。

  • -Xmn:設(shè)置堆中年輕代大小。整個堆大小=年輕代大小+年老代大小+持久代大小。

  • -XX:NewSize=n 設(shè)置年輕代初始化大小大小

  • -XX:MaxNewSize=n 設(shè)置年輕代最大值

  • -XX:NewRatio=n 設(shè)置年輕代和年老代的比值。如: -XX:NewRatio=3,表示年輕代與年老代比值為 1:3,年輕代占整個年輕代+年老代和的 1/4

  • -XX:SurvivorRatio=n 年輕代中 Eden 區(qū)與兩個 Survivor 區(qū)的比值。注意 Survivor 區(qū)有兩個。8表示兩個Survivor :eden=2:8 ,即一個Survivor占年輕代的1/10,默認(rèn)就為8

  • -Xss:設(shè)置每個線程的堆棧大小。JDK5后每個線程 Java 棧大小為 1M,以前每個線程堆棧大小為 256K。

  • -XX:ThreadStackSize=n 線程堆棧大小

  • -XX:PermSize=n 設(shè)置持久代初始值

  • -XX:MaxPermSize=n 設(shè)置持久代大小

  • -XX:MaxTenuringThreshold=n 設(shè)置年輕帶垃圾對象最大年齡。如果設(shè)置為 0 的話,則年輕代對象不經(jīng)過 Survivor 區(qū),直接進(jìn)入年老代。

  • #下面是一些不常用的

  • -XX:LargePageSizeInBytes=n 設(shè)置堆內(nèi)存的內(nèi)存頁大小

  • -XX:+UseFastAccessorMethods 優(yōu)化原始類型的getter方法性能

  • -XX:+DisableExplicitGC 禁止在運(yùn)行期顯式地調(diào)用System.gc(),默認(rèn)啟用

  • -XX:+AggressiveOpts 是否啟用JVM開發(fā)團(tuán)隊最新的調(diào)優(yōu)成果。例如編譯優(yōu)化,偏向鎖,并行年老代收集等,jdk6紙之后默認(rèn)啟動

  • -XX:+UseBiasedLocking 是否啟用偏向鎖,JDK6默認(rèn)啟用

  • -Xnoclassgc 是否禁用垃圾回收

  • -XX:+UseThreadPriorities 使用本地線程的優(yōu)先級,默認(rèn)啟用

51. JVM的GC收集器設(shè)置

  • -xx:+Use xxx GC

  • xxx 代表垃圾收集器名稱

  • -XX:+UseSerialGC:設(shè)置串行收集器,年輕帶收集器

  • -XX:+UseParNewGC:設(shè)置年輕代為并行收集。可與 CMS 收集同時使用。JDK5.0 以上,JVM 會根據(jù)系統(tǒng)

  • 配置自行設(shè)置,所以無需再設(shè)置此值。

  • -XX:+UseParallelGC:設(shè)置并行收集器,目標(biāo)是目標(biāo)是達(dá)到可控制的吞吐量

  • -XX:+UseParallelOldGC:設(shè)置并行年老代收集器,JDK6.0 支持對年老代并行收集。

  • -XX:+UseConcMarkSweepGC:設(shè)置年老代并發(fā)收集器

  • -XX:+UseG1GC:設(shè)置 G1 收集器,JDK1.9默認(rèn)垃圾收集器

到此,關(guān)于“Java虛擬機(jī)常見面試題”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI