程序在執(zhí)行之前先要把 java代碼 轉(zhuǎn)換成 字節(jié)碼文件 (.class文件), JVM 首先需要把字節(jié)碼通過一定的方式 類加載器 (ClassLoader) 把文件加載到內(nèi)存中 運(yùn)行時(shí)數(shù)據(jù)區(qū) (Runtime Data Area) , 而字節(jié)碼文件是 JVM 的一套指令集規(guī)范, 并不能直接交給底層操作系統(tǒng)去執(zhí)行, 因此需要特定的命令解析器 執(zhí)行引擎 (Execution Engine) 將字節(jié)碼翻譯成底層系統(tǒng)指令再交由CPU去執(zhí)行, 而這個(gè)過程中需要調(diào)用其他語言的接口 本地庫接口 來實(shí)現(xiàn)整個(gè)程序的功能.
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),商洛網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:商洛等地區(qū)。商洛做網(wǎng)站價(jià)格咨詢:028-86922220總的來看, JVM主要通過以下四部分來運(yùn)行Java程序:
通俗來講 JVM 劃分的區(qū)域就是:
而在棧中還能分兩部分:
這里經(jīng)常會(huì)有一個(gè)小的試題出現(xiàn): 看代碼.
package Test;
public class Demo {
private int n = 10;
private static int m = 20;
public static void main(String[] args) {
Demo demo = new Demo();
}
}
問: 在當(dāng)前代碼中, n 在內(nèi)存中的哪個(gè)區(qū)域? m 在內(nèi)存中的哪個(gè)區(qū)域? demo 在內(nèi)存中的那個(gè)區(qū)域?
答: n是成員變量, 就是在堆上.? m是靜態(tài)變量, 在類對(duì)象里, 就是在方法區(qū)中. demo是局部變量, 就是在棧上.?
另一段代碼:
package Test;
class A {
private int x = 10;
}
public class Demo {
private int n = 10;
private static int m = 20;
private static A a = new A();
public static void main(String[] args) {
Demo demo = new Demo();
}
}
在看這段代碼, 在這段代碼中, 問: x 在內(nèi)存中的哪個(gè)區(qū)域? a在內(nèi)存中的哪個(gè)區(qū)域?
答: 首先 a 是靜態(tài)的, 那么它仍然在方法區(qū)中, 但是它 new 的 A(), 還是在堆里, 所以 x 也是在堆里.?
內(nèi)存劃分JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)域也叫內(nèi)存布局, 它由一下五個(gè)部分組成:
從上圖我們可以看出, 棧 是每一個(gè)線程都有的, 然后在圖中是沒有方法區(qū)的, 多了一個(gè)元數(shù)據(jù)區(qū), 大家看到了嗎, 方法區(qū)是 JDK1.7 之前的版本, 到了 1.8 之后, 把之前的方法區(qū)給去掉了, 弄出來這個(gè)元數(shù)據(jù)區(qū), 他們兩個(gè)的區(qū)別就是: 元數(shù)據(jù)區(qū)的內(nèi)存不是在 JVM 中的, 之前方法區(qū)是在 JVM 申請(qǐng)到的這一大塊內(nèi)存里, 劃分的區(qū)域. 元數(shù)據(jù)區(qū)呢是用的本地內(nèi)存.?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧