Python知識分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Java JVM 面試題總結(jié) PDF 下載
發(fā)布于:2024-02-15 11:15:22
(假如點擊沒反應(yīng),多刷新兩次就OK!)

Java JVM 面試題總結(jié) PDF 下載  圖1

 

 

資料內(nèi)容:

 

JVM 的主要作用是什么?
 

JVM 就是 Java Virtual Machine(Java虛擬機)的縮寫,JVM 屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使
Java 程序只需生成在 Java 虛擬機上運行的目標(biāo)代碼 (字節(jié)碼),就可以在不同的平臺上運行。

 

請你描述一下 Java 的內(nèi)存區(qū)域?
 

JVM 在執(zhí)行 Java 程序的過程中會把它管理的內(nèi)存分為若干個不同的區(qū)域,這些組成部分有些是線程私有
的,有些則是線程共享的,Java 內(nèi)存區(qū)域也叫做運行時數(shù)據(jù)區(qū),它的具體劃分如下:

 

虛擬機棧 : Java 虛擬機棧是線程私有的數(shù)據(jù)區(qū),Java 虛擬機棧的生命周期與線程相同,虛擬機棧也
是局部變量的存儲位置。方法在執(zhí)行過程中,會在虛擬機棧中創(chuàng)建一個 棧幀(stack frame) 。每
個方法執(zhí)行的過程就對應(yīng)了一個入棧和出棧的過程。

 

本地方法棧 : 本地方法棧也是線程私有的數(shù)據(jù)區(qū),本地方法棧存儲的區(qū)域主要是 Java 中使用
native 關(guān)鍵字修飾的方法所存儲的區(qū)域。

 

程序計數(shù)器 :程序計數(shù)器也是線程私有的數(shù)據(jù)區(qū),這部分區(qū)域用于存儲線程的指令地址,用于判斷
線程的分支、循環(huán)、跳轉(zhuǎn)、異常、線程切換和恢復(fù)等功能,這些都通過程序計數(shù)器來完成。

 

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

 

堆 :堆是線程共享的數(shù)據(jù)區(qū),堆是 JVM 中最大的一塊存儲區(qū)域,所有的對象實例都會分配在堆
上。JDK 1.7后,字符串常量池從永久代中剝離出來,存放在堆中。
堆空間的內(nèi)存分配(默認(rèn)情況下):

 

老年代 : 三分之二的堆空間
 

年輕代 : 三分之一的堆空間
     eden 區(qū): 8/10 的年輕代空間
     survivor 0 : 1/10 的年輕代空間
     survivor 1 : 1/10 的年輕代空間
命令行上執(zhí)行如下命令,會查看默認(rèn)的 JVM 參數(shù)。

 

java -XX:+PrintFlagsFinal -version


輸出的內(nèi)容非常多,但是只有兩行能夠反映出上面的內(nèi)存分配結(jié)果

 

運行時常量池 :運行時常量池又被稱為 Runtime Constant Pool ,這塊區(qū)域是方法區(qū)的一部分,
它的名字非常有意思,通常被稱為 非堆 。它并不要求常量一定只有在編譯期才能產(chǎn)生,也就是并
非編譯期間將常量放在常量池中,運行期間也可以將新的常量放入常量池中,String 的 intern 方法
就是一個典型的例子。