高併發學習之01JVM運行核心邏輯

1. Java文件是怎麼被JVM運行的

一個 .java 源代碼通過編譯器 編譯之後變成一個**.class**字節碼文件,jvm啓動加載字節碼文件,會在內存中大致劃分兩大區域 :

  1. 線程共享區域:是所有的線程都能訪問的這塊內存數據,隨虛擬機或者GC(垃圾回收器)創建和銷燬
  2. 線程獨佔區域:每個線程獨立的空間,隨線程聲明週期而創建銷燬

線程共享的區域分爲:方法區、堆內存
線程獨佔區域分爲:虛擬機棧、本地方法棧、程序計數器
這裏在細說下:

  • 方法區
    存放類信息、常量信息、常量池信息、包括字符串字面量和數字常量等
  • Java 堆
    在Java虛擬機啓動時候建立Java堆,幾乎所有的對象實例都存放到Java堆中。堆內存還細分爲新生代、老年代、永久代。GC主要的工作就是管理堆內存。
  • 虛擬機棧
    每個虛擬機線程都會在這個空間有個私有的棧,線程棧是由多個棧楨組成。
    一個線程Java棧在線程創建的時候被創建,Java棧中保存局部變量、方法參數。同時Java的方法調用返回值等。
    棧最大內存是1M,超出拋異常StackOverflowError
  • 本地方法棧
    本地方法棧和Java棧非常相似,最大不同爲本地方法棧用於本地方法調用,Java虛擬機允許Java直接調用本地方法
  • 程序計數器
    記錄當前線程執行字節碼的位置,存儲的是字節碼指令地址,如果執行Native方法則計數器值爲空。每個線程在這個空間中也有個獨立的空間,佔用內存很小。CPU同一時間只會執行一條線程的中指令。JVM會輪流切換並分配CPU執行,計數器就是爲了記錄CPU切換會當前線程時提示上次執行的位置。

2. JAVAP 查看class文件

2.1 什麼是class文件

上面說了一對JVM加載class文件進行的操作,似乎class文件裏面包含了很多東西。其實class文件就是包含了JAVA程序執行的字節碼。它的文件開頭有一個0xcafebabe(16進制)特殊標識。class文件的查看需要我們藉助JDK提供的工具查看。
在說明下,在我們平常開發中使用IDE編輯後class文件是經過IDE解析class之後整理出來給我們看到的格式,並不是class原本的面貌(class就是一個二進制流,中間無任何分隔符)。

2.2 Javap命令直接 查看class文件

首先我們編寫一個簡單的Java文件

public class DemoOne {

    public static void main(String[] args){
        int a = 1;
        int b = 1;
        System.out.println(a + b);
    }
}

這裏只是簡單定義了兩個參數a、b 然後輸出兩者之後,代碼簡單,運行下main方法,經過編譯器編譯之後,產生**.class**文件。找到class 文件目錄,通過命令行輸入命令 javap -v class名稱:javap查看class文件
這裏只是掩飾怎麼查看就不截全部圖片了

2.3 IDEA 查看class文件

作爲一個優秀的java開發工具,idea提供了一個更簡單的查看方式:

  • 打開Settings->Tools->External Tools -> +
  • 如圖設置工具
  • 運行 如圖:運行

3.說明

關於彙編語言指令碼、和javap中對應指令碼,以及javap中指令碼含義這裏就不細說了。
最後提供詳細說明的鏈接地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章