最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

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

空間大?。憾汛笮∵h遠大于棧。

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

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

5. 類的生命周期

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

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

6. Java對象創(chuàng)建過程

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

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

一般有兩種方法來判斷:

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

8. 什么是類加載器?

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

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

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

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

雙親委派模型:如果一個類加載器收到了類加載的請求,它首先不會自己去加載這個類,而是把這個請求委派給父類加載器去完成, 每一層的類加載器都是如此,這樣所有的加載請求都會被傳送到頂層的啟動類加載器中,只有當父加載無法完成加載請求 (它的搜索范圍中沒找到所需的類)時,子加載器才會嘗試去加載類。

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

類裝載分為以下 5 個步驟:

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

11. Java 中都有哪些引用類型?

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

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

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

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

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

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

分代回收器有兩個分區(qū):老生代和新生代,新生代默認的空間占比總空間的 1/3,老生代的默認占比是 2/3。 新生代使用的是復制算法,新生代里有 3 個分區(qū):Eden、To Survivor、From Survivor,它們的默認占比是 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,當年齡到達 15(默認配置是 15)時,升級為老生代。大對象也會直接進入老生代。 老生代當空間占用到達某個值之后就會觸發(fā)全局垃圾收回,一般使用標記整理的執(zhí)行算法。以上這些循環(huán)往復就構成了整個分代垃圾回收的整體執(zhí)行流程。

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

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

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

16. 你有沒有遇到過OutOfMemory問題?常見的原因有哪些?

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

17. StackOverflow異常有沒有遇到過?⼀般你猜測會在什么情況下被觸發(fā)?

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

18. 調優(yōu)命令

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

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

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

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Java Session驗證碼案例代碼實例解析

    Java Session驗證碼案例代碼實例解析

    這篇文章主要介紹了Java Session驗證碼案例代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • spring-retry組件的使用教程

    spring-retry組件的使用教程

    Spring Retry的主要目的是為了提高系統(tǒng)的可靠性和容錯性,當方法調用失敗時,Spring Retry可以在不影響系統(tǒng)性能的情況下,自動進行重試,從而減少故障對系統(tǒng)的影響,這篇文章主要介紹了spring-retry組件的使用,需要的朋友可以參考下
    2023-06-06
  • 如何在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫

    如何在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫

    這篇文章主要介紹了在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中BeanMap的使用方法

    Java中BeanMap的使用方法

    這篇文章主要介紹了Java中BeanMap的使用方法,BeanMap來源于spring 框架,可以將一般的類轉為 Map 結構存儲,基于Map的JavaBean視圖,默認的鍵集是所有屬性名稱的聯(lián)合,需要的朋友可以參考下
    2024-01-01
  • idea+ springboot熱部署的配置方法

    idea+ springboot熱部署的配置方法

    這篇文章主要介紹了idea+ springboot熱部署的配置方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 深入理解Java中的volatile關鍵字(總結篇)

    深入理解Java中的volatile關鍵字(總結篇)

    volatile這個關鍵字,不僅僅在Java語言中有,在很多語言中都有的,而且其用法和語義也都是不盡相同的。這篇文章主要介紹了Java中的volatile關鍵字,需要的朋友可以參考下
    2018-10-10
  • Springboot?整合maven插口調用maven?release?plugin實現(xiàn)一鍵打包功能

    Springboot?整合maven插口調用maven?release?plugin實現(xiàn)一鍵打包功能

    這篇文章主要介紹了Springboot?整合maven插口調用maven?release?plugin實現(xiàn)一鍵打包功能,整合maven-invoker使程序去執(zhí)行mvn命令,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • 關于Spring統(tǒng)一異常處理及說明

    關于Spring統(tǒng)一異常處理及說明

    這篇文章主要介紹了關于Spring統(tǒng)一異常處理及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java番外雜談之每天掃的二維碼你了解它內含的信息嗎

    Java番外雜談之每天掃的二維碼你了解它內含的信息嗎

    二維碼已經(jīng)成為我們日常生活中必不可少的組成部分了,登錄需要掃一掃二維碼、買東西付錢需要掃一掃二維碼、開會簽到也需要掃一掃二維碼,那么如此使用的二維碼技術,背后的原理是怎樣的呢?本文將結合二維碼的發(fā)展歷程以及典型應用場景,分析二維碼背后的技術原理
    2022-02-02
  • SpringBoot整合MOTT動態(tài)讀取數(shù)據(jù)庫連接信息并連接MQTT服務端

    SpringBoot整合MOTT動態(tài)讀取數(shù)據(jù)庫連接信息并連接MQTT服務端

    MQTT是一種輕量級的消息傳輸協(xié)議(Message Queuing Telemetry Transport),旨在實現(xiàn)設備之間的低帶寬和高延遲的通信,本文給大家介紹了SpringBoot整合MOTT動態(tài)讀取數(shù)據(jù)庫連接信息并連接MQTT服務端,需要的朋友可以參考下
    2024-04-04

最新評論

文登市| 泗洪县| 娱乐| 莲花县| 洛阳市| 偃师市| 汤原县| 涞水县| 太原市| 新绛县| 福泉市| 常熟市| 灌云县| 炉霍县| 桦南县| 巴中市| 扎赉特旗| 南昌市| 文化| 黑龙江省| 大足县| 墨江| 平潭县| 嘉禾县| 渭源县| 丰台区| 金山区| 同心县| 广平县| 韶山市| 柳江县| 宝坻区| 都安| 龙岩市| 南城县| 曲阜市| 东安县| 天门市| 邢台市| 保定市| 花莲县|