image.png
1. jvm運(yùn)行數(shù)據(jù)區(qū)
- 1 PC寄存器
1.1 每個(gè)線程都有一個(gè)pc寄存器
1.2 在線程創(chuàng)建時(shí)創(chuàng)建
1.3 指向下一條指令
1.4 指向本地方法時(shí) pc的值為undefined
- 2 方法區(qū)
2.1 保存裝載類的形象
2.1.1 類型的常量池
2.1.2 字段栓拜、方法信息
2.1.3 方法字節(jié)碼
- 3 java堆
3.1 應(yīng)用系統(tǒng)的所有對(duì)象保存在java堆中【但是不是所有對(duì)象都會(huì)分配到j(luò)ava堆中】
3.2 所有線程共享java堆
3.3 對(duì)于分代GC熔吗,堆也是分代的
3.4 應(yīng)用系統(tǒng)的所有對(duì)象保存在java堆中
- 4 java棧
4.1 線程私有
4.2 棧由一系列幀組成
4.3 幀保存一個(gè)方法的局部變量档冬、操作數(shù)棧、常量池指針
4.4 每次調(diào)用方法創(chuàng)建一個(gè)幀,并壓棧
-
5 棧調(diào)用過程演示
image.png - 6 棧上分配對(duì)象
//添加jvm 參數(shù)-server -Xmx10m -Xms10M -XX:+DoEscapeAnalysis 開啟對(duì)象逃逸
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毫秒
//可以看出來對(duì)象逃逸對(duì)性能的優(yōu)化是非常巨大的
}
/**
* 如果開啟-XX:+DoEscapeAnalysis 局部變量是分配到棧上
* 該變量隨著方法的結(jié)束而銷毀這樣就大大的減少了GC的壓
* 力沾瓦,因?yàn)镚C會(huì)回收堆上的對(duì)象
*/
static void createObject() {
byte[] b = new byte[2];
b[0] = 1;
}
}