千鋒武漢Java培訓老師匯總Java面試常見的JVM的10道問題,下面一起來看看吧!希望幫助大家順利通過面試!

1、Java的內存劃分?
程序計數器(PC,Program Counter Register)。在 JVM 規范中,每個線程都有它自己的程序計數器,并且任何時間一個線程都只有一個方法在執行,也就是所謂的當前方法。程序計數器會存儲當前線程正在執行的 Java 方法的 JVM 指令地址;或者,如果是在執行本地方法,則是未指定值(undefined)。(唯一不會拋出OutOfMemoryError)
第二,Java 虛擬機棧(Java Virtual Machine Stack),早期也叫 Java 棧。每個線程在創建時都會創建一個虛擬機棧,其內部保存一個個的棧幀(Stack Frame),對應著一次次的 Java 方法調用。
前面談程序計數器時,提到了當前方法;同理,在一個時間點,對應的只會有一個活動的棧幀,通常叫作當前幀,方法所在的類叫作當前類。如果在該方法中調用了其他方法,對應的新的棧幀會被創建出來,成為新的當前幀,一直到它返回結果或者執行結束。JVM 直接對 Java 棧的操作只有兩個,就是對棧幀的壓棧和出棧。
棧幀中存儲著局部變量表、操作數(operand)棧、動態鏈接、方法正常退出或者異常退出的定義等。
第三,堆(Heap),它是 Java 內存管理的核心區域,用來放置 Java 對象實例,幾乎所有創建的 Java 對象實例都是被直接分配在堆上。堆被所有的線程共享,在虛擬機啟動時,我們指定的“Xmx”之類參數就是用來指定最大堆空間等指標。
( 編譯器通過逃逸分析,確定對象是在棧上分配還是在堆上分配)
理所當然,堆也是垃圾收集器重點照顧的區域,所以堆內空間還會被不同的垃圾收集器進行進一步的細分,最有名的就是新生代、老年代的劃分。
第四,方法區(Method Area)。這也是所有線程共享的一塊內存區域,用于存儲所謂的元(Meta)數據,例如類結構信息,以及對應的運行時常量池、字段、方法代碼等。
由于早期的 Hotspot JVM 實現,很多人習慣于將方法區稱為永久代(Permanent Generation)。Oracle JDK 8 中將永久代移除,同時增加了元數據區(Metaspace)。
第五,運行時常量池(Run-Time Constant Pool),這是方法區的一部分。如果仔細分析過反編譯的類文件結構,你能看到版本號、字段、方法、超類、接口等各種信息,還有一項信息就是常量池。Java 的常量池可以存放各種常量信息,不管是
第六,本地方法棧(Native Method Stack)。它和 Java 虛擬機棧是非常相似的,支持對本地方法的調用,也是每個線程都會創建一個。在 Oracle Hotspot JVM 中,本地方法棧和 Java 虛擬機棧是在同一塊兒區域,這完全取決于技術實現的決定,并未在規范中強制。
2、什么是Java虛擬機?為什么Java被稱作是無關平臺的編程語言?
Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。 Java被設計成允許應用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變為可能,因為它知道底層硬件平臺的指令長度和其他特性。
3、如何判斷一個對象應該被回收?
1)在Java中采取了 可達性分析法
通過一系列的“GC Roots”對象作為起點進行搜索,如果在“GC Roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的,不過要注意的是被判定為不可達的對象不一定就會成為可回收對象。被判定為不可達的對象要成為可回收對象必須至少經歷兩次標記過程,如果在這兩次標記過程中仍然沒有逃脫成為可回收對象的可能性,則基本上就真的成為可回收對象了。
2)虛擬機棧中引用的對象、方法區類靜態屬性引用的對象、方法區常量池引用的對象、本地方法棧JNI引用的對象。
4、GC 觸發的條件?
1)程序調用System.gc時可以觸發;(2)系統自身來決定GC觸發的時機。
5、可以作為GCRoots的對象有哪些?
虛擬機棧中引用的對象
方法區中類靜態屬性引用的對象
方法區中常量引用的對象
本地方法棧中引用的對象
6、JVM中一次完整的GC流程是怎樣的,對象如何晉升到老年代?
Java堆 = 老年代 + 新生代
新生代 = Eden + S0 + S1
當 Eden 區的空間滿了, Java虛擬機會觸發一次 Minor GC,以收集新生代的垃圾,存活下來的對象,則會轉移到 Survivor區。
大對象(需要大量連續內存空間的Java對象,如那種很長的字符串)直接進入老年態;
如果對象在Eden出生,并經過第一次Minor GC后仍然存活,并且被Survivor容納的話,年齡設為1,每熬過一次Minor GC,年齡+1,若年齡超過一定限制(15),則被晉升到老年態。即長期存活的對象進入老年態。
老年代滿了而無法容納更多的對象,Minor GC 之后通常就會進行Full GC,Full GC 清理整個內存堆 – 包括年輕代和年老代。
Major GC 發生在老年代的GC,清理老年區,經常會伴隨至少一次Minor GC,比Minor GC慢10倍以上。
7、雙親委派模型?
雙親委派模型工作過程是:
如果一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成。每個類加載器都是如此,只有當父加載器在自己的搜索范圍內找不到指定的類時(即ClassNotFoundException),
8、為什么需要雙親委派模型?
防止內存中出現多份同樣的字節碼。
9、怎么打破雙親委派模型?
打破雙親委派機制則不僅要繼承ClassLoader類,還要重寫loadClass和findClass方法。
10、導致Full GC一般有哪些情況?
1)新生代設置過小
?一是新生代GC次數非常頻繁,增大系統消耗;二是導致大對象直接進入舊生代,占據了舊生代剩余空間,誘發Full GC。
2)新生代設置過大
一是新生代設置過大會導致舊生代過小(堆總量一定),從而誘發Full GC;二是新生代GC耗時大幅度增加。
3)Survivor設置過小
導致對象從eden直接到達舊生代。
4)Survivor設置過大
導致eden過小,增加了GC頻率。
一般說來新生代占整個
GC策略的設置方式
1)吞吐量優先 可由-XX:GCTimeRatio=n來設置;
2)暫停時間優先 可由-XX:MaxGCPauseRatio=n來設置。

以上就是千鋒武漢Java培訓老師匯總的Java面試中常見的JVM的10道問題,希望對大家面試有所幫助。想了解更多高級Java工程師面試題,你可以關注“千鋒武漢”微信公眾號,定期發布技術熱點和行業趨勢分析,助力你快速入職。你也可以參加千鋒武漢Java培訓班,快速系統的學習進階,做企業需要的高職高能Java人才!
2021-10-22 千鋒武漢發布了 《《我的世界》千鋒1024程序員節品牌片重磅發布》的文章
2021-10-22 千鋒武漢發布了 《千鋒1024程序員節重磅激勵,多重豪禮強力助學》的文章
2021-10-22 千鋒武漢發布了 《千鋒聯動全國百所院校 開展1024程序員節狂“享”活動!》的文章
2021-10-20 千鋒武漢發布了 《千鋒為中國航發商發提供Python課程培訓,助力商發公司高效決策》的文章
2021-10-15 千鋒武漢發布了 《千鋒教育1024程序員狂歡節即將火爆來襲 “厚禮”一觸即發》的文章