JVM 即 Java Virtual Machine,中文名為 Java虛擬機(jī),一般情況下,對(duì)于C/C++ 程序,編譯成二進(jìn)制文件后,就可以直接執(zhí)行了,但Java 需要使用 javac 編譯成 .class 文件,還需要使用 Java 命令去主動(dòng)執(zhí)行它
。JVM 就是識(shí)別 .class 后綴的文件,并且能夠解析它的指令,最終調(diào)用操作系統(tǒng)上的函數(shù)
java程序需要在jre這個(gè)特定的環(huán)境上運(yùn)行
,而jre包含jvm,但jvm并不是java語(yǔ)言編寫(xiě)的,它是由C/C++開(kāi)發(fā)的。
運(yùn)行時(shí)數(shù)據(jù)區(qū):類加載完成后進(jìn)入運(yùn)行時(shí)數(shù)據(jù)區(qū)[RuntimeData area],運(yùn)行時(shí)異常是不可捕獲的,這是在類加載器后的產(chǎn)物.
運(yùn)行時(shí)數(shù)據(jù)區(qū)里面就有(方法區(qū)(Method Area),java棧(stack),本地方法棧(native Method Stack),堆(heap) ,程序計(jì)數(shù)器(pc))
為什么這里的棧,本地方法棧,程序計(jì)數(shù)器是不會(huì)有垃圾回收的?
原因如下:
Java運(yùn)行時(shí)內(nèi)存區(qū)有Java堆,方法區(qū),程序計(jì)數(shù)器,虛擬機(jī)棧,本地方法棧這五個(gè)地方,其中程序計(jì)數(shù)器,虛擬機(jī)棧和本地方法棧這三個(gè)地方隨線程而生,隨線程而滅,所以不需要考慮垃圾回收,而Java堆和方法區(qū)會(huì)伴隨著整個(gè)JVM的生命周期,所以有必要及時(shí)清理掉沒(méi)有的垃圾。
java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)包含的名詞解釋: 方法區(qū):方法區(qū)存儲(chǔ)虛擬機(jī)加載的類信息,常量,靜態(tài)變量
,即時(shí)編譯器編譯后的代碼等數(shù)據(jù);是jvm規(guī)范中的一部分,并不是實(shí)際的實(shí)現(xiàn)
, 當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError(OOM)異常。
僅有一個(gè)堆,Java堆用于存放new出來(lái)的對(duì)象的內(nèi)容,是垃圾收集器管理的主要區(qū)域
,如果在堆中沒(méi)有內(nèi)存完成實(shí)例分配,并且堆也無(wú)法再擴(kuò)展時(shí),將會(huì)拋出 OutOfMemoryError 異常。
存放的東西:八大基本類型 + new出來(lái)的對(duì)象引用地址 + 實(shí)例方法的引用地址,每一條java虛擬機(jī)線程都有自己私有的java虛擬機(jī)棧,這個(gè)棧和線程同時(shí)創(chuàng)建,用于存儲(chǔ)棧幀
Java虛擬機(jī)棧是Java方法執(zhí)行的內(nèi)存模型,每一個(gè)方法從調(diào)用直至執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程
棧幀(Stack Frame):存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息,隨著方法的調(diào)用而創(chuàng)建,隨著方法的結(jié)束而銷毀。
在Java虛擬機(jī)規(guī)范中,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常狀況:
1:如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError 異常
2:如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展(當(dāng)前大部分的Java虛擬機(jī)都可動(dòng)態(tài)擴(kuò)展,只不過(guò)Java虛擬機(jī)規(guī)范中也允許固定長(zhǎng)度的虛擬機(jī)棧),當(dāng)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存時(shí)會(huì)拋出OutOfMemoryError異常。
本地方法棧:本地方法棧和虛擬機(jī)棧非常相似,不同的是虛擬機(jī)棧服務(wù)的是[Java方法],而本地方法棧服務(wù)的是[Native方法]
1:java虛擬機(jī)可以支持多個(gè)線程同時(shí)運(yùn)行,每個(gè)java虛擬機(jī)線程都有自己的程序計(jì)數(shù)器(PC寄存器)
2:在任一時(shí)刻,一個(gè)java虛擬機(jī)的線程,只會(huì)執(zhí)行一個(gè)方法的代碼,程序計(jì)數(shù)器記錄[當(dāng)前線程所執(zhí)行的Java字節(jié)碼的地址]
3:當(dāng)執(zhí)行的是Native方法時(shí),程序計(jì)數(shù)器為空,程序計(jì)數(shù)器是JVM規(guī)范中唯一一個(gè)沒(méi)有規(guī)定會(huì)導(dǎo)致OutOfMemory的區(qū)域。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧