Python知識(shí)分享網(wǎng) - 專(zhuān)業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Java JVM 面試題總結(jié) PDF 下載
匿名網(wǎng)友發(fā)布于:2024-02-15 11:15:22
(侵權(quán)舉報(bào))
(假如點(diǎn)擊沒(méi)反應(yīng),多刷新兩次就OK!)

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

 

 

資料內(nèi)容:

 

JVM 的主要作用是什么?
 

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

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

 

java -XX:+PrintFlagsFinal -version


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

 

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