開啓併發編程
1. Java文件是怎麼被JVM運行的
一個 .java 源代碼通過編譯器 編譯之後變成一個**.class**字節碼文件,jvm啓動加載字節碼文件,會在內存中大致劃分兩大區域 :
- 線程共享區域:是所有的線程都能訪問的這塊內存數據,隨虛擬機或者GC(垃圾回收器)創建和銷燬
- 線程獨佔區域:每個線程獨立的空間,隨線程聲明週期而創建銷燬
線程共享的區域分爲:方法區、堆內存
線程獨佔區域分爲:虛擬機棧、本地方法棧、程序計數器
這裏在細說下:
- 方法區
存放類信息、常量信息、常量池信息、包括字符串字面量和數字常量等 - 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名稱:
這裏只是掩飾怎麼查看就不截全部圖片了
2.3 IDEA 查看class文件
作爲一個優秀的java開發工具,idea提供了一個更簡單的查看方式:
- 打開Settings->Tools->External Tools -> +
- 如圖
- 運行 如圖:
3.說明
關於彙編語言指令碼、和javap中對應指令碼,以及javap中指令碼含義這裏就不細說了。
最後提供詳細說明的鏈接地址