2_JVM_運行機制

1.jvm 啓動流程   



2.jvm基本結構  





pc寄存器:

-每個線程擁有一個pc寄存器

-在線程創建時創建

-指向下一條指令的地址

-執行本地方法時,Pc的值爲undefined (未定義的)


方法區:

1.保存裝載的類信息 

-類型的常量

-字段,方法信息

-方法字節碼 

(jdk6:String等常量反正方法區   jdk7:已經將String等常量移到了)

2.通常和永久區關聯在一起


java堆:

-和程序開發密切相關

-應用系統對象都保存在java堆中

-對分代的GC來說,堆也是分代的

-GC的主要工作區間

複製算法



java棧:

-線程私有

-棧由一系列幀組成(因此java棧也叫作幀棧)

-幀保存一個方法的局部變量,操作數據,常量池指針

-每一次方法調用創建一個幀,並壓棧

局部變量表包含參數和局部變量

– 函數調用組成幀棧

public static inttest(int a,int b, int c){

returntest(a,b,c);

}





Java沒有寄存器,所有參數傳遞使用操作數棧

– 棧上分配:
小對象(一般幾十個bytes),在沒有逃逸的情況下,可以直接分配在棧上
直接分配在棧上,可以自動回收,減輕GC壓力
大對象或者逃逸對象無法棧上分配

-棧、堆、方法區交互

public class Personnel {
private String name;


public Personnel(String name) {
this.name = name;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}

public void sysoName()
{
System.out.println(name);
}


}



public class TestMain {


public static void main(String[] args) {
Personnel a = new Personnel("testa");
Personnel b = new Personnel("testb");


a.sysoName();
b.sysoName();
}
}



3.內存模型

-每一個線程有一個工作內存和主存獨立

-工作內存存放主存中變量的值的拷貝

當數據從主內存複製到工作存儲時,必須出現兩個動作:第一,由主內存執行的讀(read)操作;第二,由工作內存執行的相應的load操作;當數據從工作內存拷貝到主內存時,也出現兩個操作:第一個,由工作內存執行的存儲(store)操作;第二,由主內存執行的相應的寫(write)操作

每一個操作都是原子的,即執行期間不會被中斷

對於普通變量,一個線程中更新的值,不能馬上反應在其他變量中

如果需要在其他線程中立即可見,需要使用 volatile 關鍵字






基本結構-
可見性:一個線程修改了變量,其他線程可以立即知道
保證可見性的方法
-volatile
-synchronized(解鎖之前,寫變量值回主存)
-final 一旦初始化完成 其他線程可見


4編譯和解釋運行的概念

解釋運行:
-解釋執行以解釋方式運行字節碼
-意思是:讀一句執行一句

編譯運行:
-將字節碼編碼成機器碼
-直接執行機器碼
-運行時編碼
-編譯後性能有數量級的提升







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