詳解Java虛擬機(jī)(JVM)運(yùn)行時(shí)
JVM(Java虛擬機(jī))是一個(gè)抽象的計(jì)算模型。就如同一臺(tái)真實(shí)的機(jī)器,它有自己的指令集和執(zhí)行引擎,可以在運(yùn)行時(shí)操控內(nèi)存區(qū)域。目的是為構(gòu)建在其上運(yùn)行的應(yīng)用程序提供一個(gè)運(yùn)行環(huán)境。JVM可以解讀指令代碼并與底層進(jìn)行交互:包括操作系統(tǒng)平臺(tái)和執(zhí)行指令并管理資源的硬件體系結(jié)構(gòu)。本文主要介紹Java虛擬機(jī)(JVM)運(yùn)行時(shí)詳解。
我們知道的JVM內(nèi)存區(qū)域有:堆和棧,這是一種泛的分法,也是按運(yùn)行時(shí)區(qū)域的一種分法,堆是所有線程共享的一塊區(qū)域,而棧是線程隔離的,每個(gè)線程互不共享。
線程不共享區(qū)域
每個(gè)線程的數(shù)據(jù)區(qū)域包括程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧,它們都是在新線程創(chuàng)建時(shí)才創(chuàng)建的。
程序計(jì)數(shù)器(Program Counter Rerister)
程序計(jì)數(shù)器區(qū)域一塊內(nèi)存較小的區(qū)域,它用于存儲(chǔ)線程的每個(gè)執(zhí)行指令,每個(gè)線程都有自己的程序計(jì)數(shù)器,此區(qū)域不會(huì)有內(nèi)存溢出的情況。
虛擬機(jī)棧(VM Stack)
虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型,每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過(guò)程就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程。
本地方法棧(Native Method Stack)
本地方法棧用于支持本地方法(native標(biāo)識(shí)的方法,即非Java語(yǔ)言實(shí)現(xiàn)的方法)。
虛擬機(jī)棧和本地方法棧,當(dāng)線程請(qǐng)求分配的棧容量超過(guò)JVM允許的最大容量時(shí)拋出StackOverflowError異常。
線程不共享區(qū)域如下圖綠色背景所示。
線程共享區(qū)域
線程共享區(qū)域包含:堆和方法區(qū)。
堆(Heap)
堆是最常處理的區(qū)域,它存儲(chǔ)在JVM啟動(dòng)時(shí)創(chuàng)建的數(shù)組和對(duì)象,JVM垃圾收集也主要是在堆上面工作。
如果實(shí)際所需的堆超過(guò)了自動(dòng)內(nèi)存管理系統(tǒng)能提供的最大容量時(shí)拋出OutOfMemoryError異常。
方法區(qū)(Method Area)
方法區(qū)是可供各條線程共享的運(yùn)行時(shí)內(nèi)存區(qū)域。存儲(chǔ)了每一個(gè)類的結(jié)構(gòu)信息,例如運(yùn)行時(shí)常量池(Runtime Constant Pool)、字段和方法數(shù)據(jù)、構(gòu)造函數(shù)和普通方法的字節(jié)碼內(nèi)容、還包括一些在類、實(shí)例、接口初始化時(shí)用到的特殊方法。
當(dāng)創(chuàng)建類和接口時(shí),如果構(gòu)造運(yùn)行時(shí)常量池所需的內(nèi)存空間超過(guò)了方法區(qū)所能提供的最大內(nèi)存空間后就會(huì)拋出OutOfMemoryError
運(yùn)行時(shí)常量池(Runtime Constant Pool)
運(yùn)行時(shí)常量池是方法區(qū)的一部分,每一個(gè)運(yùn)行時(shí)常量池都分配在JVM的方法區(qū)中,在類和接口被加載到JVM后,對(duì)應(yīng)的運(yùn)行時(shí)常量池就被創(chuàng)建。運(yùn)行時(shí)常量池是每一個(gè)類或接口的常量池(Constant_Pool)的運(yùn)行時(shí)表現(xiàn)形式,它包括了若干種常量:編譯器可知的數(shù)值字面量到必須運(yùn)行期解析后才能獲得的方法或字段的引用。
如果方法區(qū)的內(nèi)存空間不能滿足內(nèi)存分配請(qǐng)求,那Java虛擬機(jī)將拋出一個(gè)OutOfMemoryError異常。
棧包含F(xiàn)rames,當(dāng)調(diào)用方法時(shí),F(xiàn)rame被推送到堆棧。一個(gè)Frame包含局部變量數(shù)組、操作數(shù)棧、常量池引用。
總結(jié)
以上所述是小編給大家介紹的Java虛擬機(jī)(JVM)運(yùn)行時(shí),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
詳解SSM框架下結(jié)合log4j、slf4j打印日志
本篇文章主要介紹了詳解SSM框架下結(jié)合log4j、slf4j打印日志,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Java實(shí)戰(zhàn)在線選課系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線選課系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無(wú)法啟動(dòng)的問(wèn)題
這篇文章主要介紹了解決啟用 Spring-Cloud-OpenFeign 配置可刷新項(xiàng)目無(wú)法啟動(dòng)的問(wèn)題,本文重點(diǎn)給大家介紹Spring-Cloud-OpenFeign的原理及問(wèn)題解決方法,需要的朋友可以參考下2021-10-10JAVA參數(shù)傳遞方式實(shí)例淺析【按值傳遞與引用傳遞區(qū)別】
這篇文章主要介紹了JAVA參數(shù)傳遞方式,結(jié)合實(shí)例形式分析了java按值傳遞與引用傳遞區(qū)別及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05java操作mongodb基礎(chǔ)(查詢 排序 輸出list)
java操作mongodb基礎(chǔ)學(xué)習(xí)查詢,排序,limit,輸出為list實(shí)例,大家參考使用吧2013-12-12Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線高中考試系統(tǒng)的實(shí)現(xiàn)
這是一個(gè)使用了java+SSM+Jsp+Mysql+Maven開(kāi)發(fā)的在線高中考試系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有考試系統(tǒng)該有的所有功能,感興趣的朋友快來(lái)看看吧2022-02-02Mybatis使用update更新值為null時(shí)不生效問(wèn)題解決
這篇文章主要介紹了Mybatis使用update更新值為null時(shí)不生效問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06