jvm基本結(jié)構(gòu)

image.png

1. jvm運行數(shù)據(jù)區(qū)

  • 1 PC寄存器
1.1 每個線程都有一個pc寄存器
1.2 在線程創(chuàng)建時創(chuàng)建
1.3 指向下一條指令
1.4 指向本地方法時 pc的值為undefined
  • 2 方法區(qū)
 2.1 保存裝載類的形象
       2.1.1 類型的常量池
       2.1.2 字段、方法信息
       2.1.3 方法字節(jié)碼
  • 3 java堆
 3.1 應(yīng)用系統(tǒng)的所有對象保存在java堆中【但是不是所有對象都會分配到j(luò)ava堆中】
 3.2 所有線程共享java堆
 3.3 對于分代GC,堆也是分代的
 3.4 應(yīng)用系統(tǒng)的所有對象保存在java堆中
  • 4 java棧
 4.1 線程私有
 4.2 棧由一系列幀組成
 4.3 幀保存一個方法的局部變量、操作數(shù)棧、常量池指針
 4.4 每次調(diào)用方法創(chuàng)建一個幀,并壓棧
  • 5 棧調(diào)用過程演示


    image.png
  • 6 棧上分配對象
//添加jvm 參數(shù)-server -Xmx10m -Xms10M -XX:+DoEscapeAnalysis 開啟對象逃逸
public class T {
    public static void main(String[] args) {
        Long l = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            createObject();
        }
        System.out.println(System.currentTimeMillis() - l);
        //開啟 -XX:+DoEscapeAnalysis 17毫秒
        //關(guān)閉 -XX:-DoEscapeAnalysis 10689毫秒
        //可以看出來對象逃逸對性能的優(yōu)化是非常巨大的
    }
    /**
     * 如果開啟-XX:+DoEscapeAnalysis 局部變量是分配到棧上
     * 該變量隨著方法的結(jié)束而銷毀這樣就大大的減少了GC的壓
     * 力,因為GC會回收堆上的對象
     */
    static void createObject() {
        byte[] b = new byte[2];
        b[0] = 1;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一直對JVM的基本結(jié)構(gòu)很困惑,今天抽空整理下。 Java Virtual Machine的簡稱即Java虛擬機 虛...
    窩牛狂奔閱讀 757評論 0 2
  • 1. jvm運行數(shù)據(jù)區(qū) 1 PC寄存器 1.1 每個線程都有一個pc寄存器 1.2 在線程創(chuàng)建時創(chuàng)建 1.3 指向...
    IT小鮑閱讀 273評論 0 0
  • JVM基本結(jié)構(gòu) PC寄存器 線程私有 字節(jié)碼指令的行號指示器,指向下調(diào)要執(zhí)行的指令地址 不會發(fā)生OOM 堆 和程序...
    忘凈空閱讀 825評論 0 0
  • JVM內(nèi)存模型Java虛擬機(Java Virtual Machine=JVM)的內(nèi)存空間分為五個部分,分別是: ...
    光劍書架上的書閱讀 2,620評論 2 26
  • 當看到"非凡足記"200期活動通知的時候,不知不覺的才發(fā)現(xiàn)已經(jīng)過去了四年。"非凡足記"是良子集團旗下的一個戶外品牌...
    大新子6閱讀 1,077評論 3 6