亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java經(jīng)典面試題匯總:JVM

 更新時(shí)間:2021年07月21日 10:42:55   作者:讓程序飛  
本篇總結(jié)的是JVM相關(guān)的面試題,后續(xù)會(huì)持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實(shí)習(xí)生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯(cuò)誤還望大家多多包涵,不吝賜教,謝謝

1. 說(shuō)一下 JVM 的主要組成部分?及其作用?

  • 類(lèi)加載器(ClassLoader)運(yùn)
  • 行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)
  • 執(zhí)行引擎(Execution Engine)
  • 本地庫(kù)接口(Native Interface)

組件的作用: 首先通過(guò)類(lèi)加載器(ClassLoader)會(huì)把 Java 代碼轉(zhuǎn)換成字節(jié)碼,運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)再把字節(jié)碼加載到內(nèi)存中, 而字節(jié)碼文件只是 JVM 的一套指令集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行, 因此需要特定的命令解析器執(zhí)行引擎(Execution Engine),將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由 CPU 去執(zhí)行, 而這個(gè)過(guò)程中需要調(diào)用其他語(yǔ)言的本地庫(kù)接口(Native Interface)來(lái)實(shí)現(xiàn)整個(gè)程序的功能。

2. 說(shuō)一下 JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)?

不同虛擬機(jī)的運(yùn)行時(shí)數(shù)據(jù)區(qū)可能略微有所不同,但都會(huì)遵從 Java 虛擬機(jī)規(guī)范, Java 虛擬機(jī)規(guī)范規(guī)定的區(qū)域分為以下 5 個(gè)部分:

  • 程序計(jì)數(shù)器(Program Counter Register):當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解析器的工作是通過(guò)改變這個(gè)計(jì)數(shù)器的值,來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能,都需要依賴(lài)這個(gè)計(jì)數(shù)器來(lái)完成;
  • Java 虛擬機(jī)棧(Java Virtual Machine Stacks):用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息;
  • 本地方法棧(Native Method Stack):與虛擬機(jī)棧的作用是一樣的,只不過(guò)虛擬機(jī)棧是服務(wù) Java 方法的,而本地方法棧是為虛擬機(jī)調(diào)用 Native 方法服務(wù)的;
  • Java 堆(Java Heap):Java 虛擬機(jī)中內(nèi)存最大的一塊,是被所有線程共享的,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存;
  • 方法區(qū)(Methed Area):用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯后的代碼等數(shù)據(jù)。

3. 說(shuō)一下堆棧的區(qū)別?

功能方面:堆是用來(lái)存放對(duì)象的,棧是用來(lái)執(zhí)行程序的。

共享性:堆是線程共享的,棧是線程私有的。

空間大?。憾汛笮∵h(yuǎn)遠(yuǎn)大于棧。

4. 解釋內(nèi)存中的棧(stack)、堆(heap)和靜態(tài)區(qū)(static area)的用法

通常我們定義一個(gè)基本數(shù)據(jù)類(lèi)型的變量,一個(gè)對(duì)象的引用,還有就是函數(shù)調(diào)用的現(xiàn)場(chǎng)保存都使用內(nèi)存中的??臻g;而通過(guò)new關(guān)鍵字和構(gòu)造器創(chuàng)建的對(duì)象放在堆空間;程序中的字面量(literal)如直接書(shū)寫(xiě)的100、”hello”和常量都是放在靜態(tài)區(qū)中。??臻g操作起來(lái)最快但是棧很小,通常大量的對(duì)象都是放在堆空間,理論上整個(gè)內(nèi)存沒(méi)有被其他進(jìn)程使用的空間甚至硬盤(pán)上的虛擬內(nèi)存都可以被當(dāng)成堆空間來(lái)使用。

5. 類(lèi)的生命周期

類(lèi)的生命周期包括這幾個(gè)部分,加載、連接、初始化、使用和卸載,其中前三部是類(lèi)的加載的過(guò)程。

  • 加載,查找并加載類(lèi)的二進(jìn)制數(shù)據(jù),在Java堆中也創(chuàng)建一個(gè)java.lang.Class類(lèi)的對(duì)象
  • 連接,連接又包含三塊內(nèi)容:驗(yàn)證、準(zhǔn)備、初始化。 1)驗(yàn)證,文件格式、元數(shù)據(jù)、字節(jié)碼、符號(hào)引用驗(yàn)證; 2)準(zhǔn)備,為類(lèi)的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值; 3)解析,把類(lèi)中的符號(hào)引用轉(zhuǎn)換為直接引用
  • 初始化,為類(lèi)的靜態(tài)變量賦予正確的初始值
  • 使用,new出對(duì)象程序中使用
  • 卸載,執(zhí)行垃圾回收

6. Java對(duì)象創(chuàng)建過(guò)程

深入理解Java對(duì)象的創(chuàng)建過(guò)程

7. 怎么判斷對(duì)象是否可以被回收?

一般有兩種方法來(lái)判斷:

  • 引用計(jì)數(shù)器:為每個(gè)對(duì)象創(chuàng)建一個(gè)引用計(jì)數(shù),有對(duì)象引用時(shí)計(jì)數(shù)器 +1,引用被釋放時(shí)計(jì)數(shù) -1,當(dāng)計(jì)數(shù)器為 0 時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問(wèn)題;
  • 可達(dá)性分析:從 GC Roots 開(kāi)始向下搜索,搜索所走過(guò)的路徑稱(chēng)為引用鏈。當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連時(shí),則證明此對(duì)象是可以被回收的。

8. 什么是類(lèi)加載器?

對(duì)于任意一個(gè)類(lèi),都需要由加載它的類(lèi)加載器和這個(gè)類(lèi)本身一同確立在 JVM 中的唯一性,每一個(gè)類(lèi)加載器, 都有一個(gè)獨(dú)立的類(lèi)名稱(chēng)空間。類(lèi)加載器就是根據(jù)指定全限定名稱(chēng)將 class 文件加載到 JVM 內(nèi)存,然后再轉(zhuǎn)化為 class 對(duì)象。

類(lèi)加載器分類(lèi): 啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader),是虛擬機(jī)自身的一部分,用來(lái)加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數(shù)所指定的路徑中并且被虛擬機(jī)識(shí)別的類(lèi)庫(kù);

其他類(lèi)加載器: 擴(kuò)展類(lèi)加載器(Extension ClassLoader):負(fù)責(zé)加載\lib\ext目錄或Java. ext. dirs系統(tǒng)變量指定的路徑中的所有類(lèi)庫(kù); 應(yīng)用程序類(lèi)加載器(Application ClassLoader)。負(fù)責(zé)加載用戶類(lèi)路徑(classpath)上的指定類(lèi)庫(kù),我們可以直接使用這個(gè)類(lèi)加載器。 一般情況,如果我們沒(méi)有自定義類(lèi)加載器默認(rèn)就是用這個(gè)加載器。

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

雙親委派模型:如果一個(gè)類(lèi)加載器收到了類(lèi)加載的請(qǐng)求,它首先不會(huì)自己去加載這個(gè)類(lèi),而是把這個(gè)請(qǐng)求委派給父類(lèi)加載器去完成, 每一層的類(lèi)加載器都是如此,這樣所有的加載請(qǐng)求都會(huì)被傳送到頂層的啟動(dòng)類(lèi)加載器中,只有當(dāng)父加載無(wú)法完成加載請(qǐng)求 (它的搜索范圍中沒(méi)找到所需的類(lèi))時(shí),子加載器才會(huì)嘗試去加載類(lèi)。

10. 說(shuō)一下類(lèi)裝載的執(zhí)行過(guò)程?

類(lèi)裝載分為以下 5 個(gè)步驟:

  • 加載:根據(jù)查找路徑找到相應(yīng)的 class 文件然后導(dǎo)入;
  • 檢查:檢查加載的 class 文件的正確性;
  • 準(zhǔn)備:給類(lèi)中的靜態(tài)變量分配內(nèi)存空間;
  • 解析:虛擬機(jī)將常量池中的符號(hào)引用替換成直接引用的過(guò)程。符號(hào)引用就理解為一個(gè)標(biāo)示,而在直接引用直接指向內(nèi)存中的地址;
  • 初始化:對(duì)靜態(tài)變量和靜態(tài)代碼塊執(zhí)行初始化工作。

11. Java 中都有哪些引用類(lèi)型?

  • 強(qiáng)引用:發(fā)生 gc 的時(shí)候不會(huì)被回收。
  • 軟引用:有用但不是必須的對(duì)象,在發(fā)生內(nèi)存溢出之前會(huì)被回收。
  • 弱引用:有用但不是必須的對(duì)象,在下一次GC時(shí)會(huì)被回收。
  • 虛引用(幽靈引用/幻影引用):無(wú)法通過(guò)虛引用獲得對(duì)象,用 PhantomReference 實(shí)現(xiàn)虛引用,虛引用的用途是在 gc 時(shí)返回一個(gè)通知。

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

  • 標(biāo)記-清除算法:標(biāo)記無(wú)用對(duì)象,然后進(jìn)行清除回收。缺點(diǎn):效率不高,無(wú)法清除垃圾碎片。
  • 標(biāo)記-整理算法:標(biāo)記無(wú)用對(duì)象,讓所有存活的對(duì)象都向一端移動(dòng),然后直接清除掉端邊界以外的內(nèi)存。
  • 復(fù)制算法:按照容量劃分二個(gè)大小相等的內(nèi)存區(qū)域,當(dāng)一塊用完的時(shí)候?qū)⒒钪膶?duì)象復(fù)制到另一塊上,然后再把已使用的內(nèi)存空間一次清理掉。缺點(diǎn):內(nèi)存使用率不高,只有原來(lái)的一半。
  • 分代算法:根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊,一般是新生代和老年代,新生代基本采用復(fù)制算法,老年代采用標(biāo)記整理算法。

13. JVM 有哪些垃圾回收器?

  • Serial收集器,串行收集器是最古老,最穩(wěn)定以及效率高的收集器,可能會(huì)產(chǎn)生較長(zhǎng)的停頓,只使用一個(gè)線程去回收。
  • ParNew收集器,ParNew收集器其實(shí)就是Serial收集器的多線程版本。
  • Parallel收集器,Parallel Scavenge收集器類(lèi)似ParNew收集器,Parallel收集器更關(guān)注系統(tǒng)的吞吐量。
  • Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法
  • CMS收集器,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。G
  • 1收集器,G1 (Garbage-First)是一款面向服務(wù)器的垃圾收集器,主要針對(duì)配備多顆處理器及大容量?jī)?nèi)存的機(jī)器. 以極高概率滿足GC停頓時(shí)間要求的同時(shí),還具備高吞吐量性能特征

14. 簡(jiǎn)述分代垃圾回收器是怎么工作的?

分代回收器有兩個(gè)分區(qū):老生代和新生代,新生代默認(rèn)的空間占比總空間的 1/3,老生代的默認(rèn)占比是 2/3。 新生代使用的是復(fù)制算法,新生代里有 3 個(gè)分區(qū):Eden、To Survivor、From Survivor,它們的默認(rèn)占比是 8:1:1,

它的執(zhí)行流程如下: 把 Eden + From Survivor 存活的對(duì)象放入 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 移動(dòng)時(shí)都存活的對(duì)象,年齡就 +1,當(dāng)年齡到達(dá) 15(默認(rèn)配置是 15)時(shí),升級(jí)為老生代。大對(duì)象也會(huì)直接進(jìn)入老生代。 老生代當(dāng)空間占用到達(dá)某個(gè)值之后就會(huì)觸發(fā)全局垃圾收回,一般使用標(biāo)記整理的執(zhí)行算法。以上這些循環(huán)往復(fù)就構(gòu)成了整個(gè)分代垃圾回收的整體執(zhí)行流程。

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

JDK 自帶了很多監(jiān)控工具,都位于 JDK 的 bin 目錄下,其中最常用的是 jconsole 和 jvisualvm 這兩款視圖監(jiān)控工具,第三方有:MAT(Memory Analyzer Tool)、GChisto。

  • jconsole:用于對(duì) JVM 中的內(nèi)存、線程和類(lèi)等進(jìn)行監(jiān)控;
  • jvisualvm:JDK 自帶的全能分析工具,可以分析:內(nèi)存快照、線程快照、程序死鎖、監(jiān)控內(nèi)存的變化、gc 變化等。
  • MAT,Memory Analyzer Tool,一個(gè)基于Eclipse的內(nèi)存分析工具,是一個(gè)快速、功能豐富的Java heap分析工具,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗
  • GChisto,一款專(zhuān)業(yè)分析gc日志的工具

16. 你有沒(méi)有遇到過(guò)OutOfMemory問(wèn)題?常見(jiàn)的原因有哪些?

  • 內(nèi)存加載的數(shù)據(jù)量太大:一次性從數(shù)據(jù)庫(kù)取太多數(shù)據(jù);  
  • 集合類(lèi)中有對(duì)對(duì)象的引用,使用后未清空,GC不能進(jìn)行回收;
  • 代碼中存在循環(huán)產(chǎn)生過(guò)多的重復(fù)對(duì)象;
  • 啟動(dòng)參數(shù)堆內(nèi)存值小。

17. StackOverflow異常有沒(méi)有遇到過(guò)?⼀般你猜測(cè)會(huì)在什么情況下被觸發(fā)?

棧內(nèi)存溢出,一般由棧內(nèi)存的局部變量過(guò)爆了,導(dǎo)致內(nèi)存溢出。出現(xiàn)在遞歸方法,參數(shù)個(gè)數(shù)過(guò)多,遞歸過(guò)深,遞歸沒(méi)有出口。

18. 調(diào)優(yōu)命令

  • Sun JDK監(jiān)控和故障處理命令有jps jstat jmap jhat jstack jinfo
  • jps,JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程。
  • jstat,JVM statistics Monitoring是用于監(jiān)視虛擬機(jī)運(yùn)行時(shí)狀態(tài)信息的命令,它可以顯示出虛擬機(jī)進(jìn)程中的類(lèi)裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù)。
  • jmap,JVM Memory Map命令用于生成heap dump文件
  • jhat,JVM Heap Analysis Tool命令是與jmap搭配使用,用來(lái)分析jmap生成的dump,jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器,生成dump的分析結(jié)果后,可以在瀏覽器中查看
  • jstack,用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照。
  • jinfo,JVM Configuration info 這個(gè)命令作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)運(yùn)行參數(shù)。

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

  • -Xms2g:初始化推大小為 2g;
  • -Xmx2g:堆最大內(nèi)存為 2g;
  • -XX:NewRatio=4:設(shè)置年輕的和老年代的內(nèi)存比例為 1:4;
  • -XX:SurvivorRatio=8:設(shè)置新生代 Eden 和 Survivor 比例為 8:2;
  • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合;
  • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合;
  • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合;
  • -XX:+PrintGC:開(kāi)啟打印 gc 信息;
  • -XX:+PrintGCDetails:打印 gc 詳細(xì)信息。

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java執(zhí)行bat命令碰到的阻塞問(wèn)題的解決方法

    java執(zhí)行bat命令碰到的阻塞問(wèn)題的解決方法

    這篇文章主要介紹了java執(zhí)行bat命令碰到的阻塞問(wèn)題的解決方法,有需要的朋友可以參考一下
    2014-01-01
  • Java+MySQL前后端連接新手小白教程

    Java+MySQL前后端連接新手小白教程

    Java作為一種廣泛使用的編程語(yǔ)言之一,在開(kāi)發(fā)Web應(yīng)用程序時(shí)經(jīng)常需要連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,下面這篇文章主要給大家介紹了關(guān)于Java+MySQL前后端連接的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 微信小程序+后端(java)實(shí)現(xiàn)開(kāi)發(fā)

    微信小程序+后端(java)實(shí)現(xiàn)開(kāi)發(fā)

    這篇文章主要介紹了微信小程序+后端(java)實(shí)現(xiàn)開(kāi)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 淺談maven的jar包和war包區(qū)別 以及打包方法

    淺談maven的jar包和war包區(qū)別 以及打包方法

    下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • SpringBoot?常用讀取配置文件的三種方法詳解

    SpringBoot?常用讀取配置文件的三種方法詳解

    這篇文章主要介紹了SpringBoot?常用讀取配置文件的3種方法,通過(guò)本文學(xué)習(xí)可以解決Spring Boot有哪些常用的讀取配置文件方式,一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如list,map如何配置,帶著這些問(wèn)題一起通過(guò)本文學(xué)習(xí)吧
    2022-09-09
  • IDEA中實(shí)體類(lèi)(POJO)與JSON快速互轉(zhuǎn)問(wèn)題

    IDEA中實(shí)體類(lèi)(POJO)與JSON快速互轉(zhuǎn)問(wèn)題

    這篇文章主要介紹了IDEA中實(shí)體類(lèi)(POJO)與JSON快速互轉(zhuǎn),本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解

    SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解,定時(shí)任務(wù)是企業(yè)級(jí)開(kāi)發(fā)中最常見(jiàn)的功能之一,如定時(shí)統(tǒng)計(jì)訂單數(shù)、數(shù)據(jù)庫(kù)備份、定時(shí)發(fā)送短信和郵件、定時(shí)統(tǒng)計(jì)博客訪客等,簡(jiǎn)單的定時(shí)任務(wù)可以直接通過(guò)Spring中的@Scheduled注解來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • 使用Java獲取linux和window序列號(hào)

    使用Java獲取linux和window序列號(hào)

    這篇文章主要為大家詳細(xì)介紹了如何使用Java獲取Windows和Linux系統(tǒng)上的CPU序列號(hào)、磁盤(pán)、mac地址等信息,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • SpringBoot JdbcTemplate批量操作的示例代碼

    SpringBoot JdbcTemplate批量操作的示例代碼

    本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • 解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題

    解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題

    今天小編就為大家分享一篇解決java使用axios.js的post請(qǐng)求后臺(tái)時(shí)無(wú)法接收到入?yún)⒌膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論