JVM学习(一)什么是JVM
一、初識(shí)JVM(虛擬機(jī))
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。
引入Java語言虛擬機(jī)后,Java語言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。
二、Java為什么是“平臺(tái)無關(guān)的編程語言”?
- Java虛擬機(jī)是一個(gè)可以執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn)程。
- Java源文件被編譯成能被Java虛擬機(jī)執(zhí)行的字節(jié)碼文件(.class文件)。
- Java被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫或者是重新編譯。
- Java虛擬機(jī)讓這個(gè)變?yōu)榭赡?,因?yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性。
三、Java內(nèi)存結(jié)構(gòu)
- 線程共享:方法區(qū)、堆
- 線程私有:java棧、本地方法棧、程序計(jì)數(shù)器
Java堆(Heap)
是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。線程共享,此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例。
方法區(qū)(Method Area)
線程共享,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
程序計(jì)數(shù)器(Program Counter Register)
線程私有,是一塊較小的內(nèi)存空間,它的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
JVM棧(JVM Stacks)
線程私有,生命周期與線程相同。
虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。
本地方法棧(Native Method Stacks)
線程私有,與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。
PS: Native Method就是一個(gè)java調(diào)用非java代碼的接口
四、JVM的對(duì)象分配規(guī)則
- 對(duì)象優(yōu)先分配在Eden區(qū)【使用空間】,如果Eden區(qū)沒有足夠的空間時(shí),虛擬機(jī)執(zhí)行一次Minor GC【垃圾回收】。
- 大對(duì)象直接進(jìn)入老年代(大對(duì)象是指需要大量連續(xù)內(nèi)存空間的對(duì)象)。這樣做的目的是避免在Eden區(qū)和兩個(gè)Survivor區(qū)之間發(fā)生大量的內(nèi)存拷貝(新生代采用復(fù)制算法收集內(nèi)存)。
- 長(zhǎng)期存活的對(duì)象進(jìn)入老年代。虛擬機(jī)為每個(gè)對(duì)象定義了一個(gè)年齡計(jì)數(shù)器,如果對(duì)象經(jīng)過了1次Minor GC(年輕代收集)那么對(duì)象會(huì)進(jìn)入Survivor區(qū),之后每經(jīng)過一次Minor GC那么對(duì)象的年齡加1,知道達(dá)到閥值對(duì)象進(jìn)入老年區(qū)。
- 動(dòng)態(tài)判斷對(duì)象的年齡。如果Survivor區(qū)中相同年齡的所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象可以直接進(jìn)入老年代。
- 空間分配擔(dān)保。每次進(jìn)行Minor GC時(shí),JVM會(huì)計(jì)算Survivor區(qū)移至老年區(qū)的對(duì)象的平均大小,如果這個(gè)值大于老年區(qū)的剩余值大小則進(jìn)行一次Full GC,如果小于檢查HandlePromotionFailure設(shè)置,如果true則只進(jìn)行Monitor GC,如果false則進(jìn)行Full GC。
術(shù)語說明
- Young Generation(新生代):分為:Eden區(qū)和Survivor區(qū),Survivor區(qū)有分為大小相等的From Space和To Space。
- Old Generation(老年代): Tenured區(qū),當(dāng) Tenured區(qū)空間不夠時(shí), JVM 會(huì)在Tenured區(qū)進(jìn)行 major collection。
- Minor GC:新生代GC,指發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)閖ava對(duì)象大多都具備朝生夕死的特性,所以Minor GC非常頻繁,一般回收速度也比較快。
- Major GC:發(fā)生老年代的GC,對(duì)整個(gè)堆進(jìn)行GC。出現(xiàn)Major GC,經(jīng)常會(huì)伴隨至少一次Minor GC(非絕對(duì))。MajorGC的速度一般比minor GC慢10倍以上。
- Full GC:整個(gè)虛擬機(jī),包括永久區(qū)、新生區(qū)和老年區(qū)的回收。
總結(jié)
以上是生活随笔為你收集整理的JVM学习(一)什么是JVM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #60
- 下一篇: StatementHandler-Myb