Jvm知識學習(二)-Jvm運行機制

一,JVM啓動流程


二,JVM基本結構

PC寄存器 :
每個線程擁有一個PC寄存器
在線程創建時 創建
指向下一條指令的地址
執行本地方法時,PC的值爲undefined

方法區:
保存裝載的類信息
類型的常量池
字段,方法信息
方法字節碼
通常和永久區(Perm)關聯在一起

Java堆 :
和程序開發密切相關
應用系統對象都保存在Java堆中
所有線程共享Java堆
對分代GC來說,堆也是分代的
GC的主要工作區間

Java棧 :
線程私有
棧由一系列幀組成(因此Java棧也叫做幀棧)
幀保存一個方法的局部變量、操作數棧、常量池指針
每一次方法調用創建一個幀,並壓棧






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


棧、堆、方法區交互



三,內存模型

可見性 :
一個線程修改了變量,其他線程可以立即知道
保證可見性的方法
volatile
synchronized (unlock之前,寫變量值回主存)
final(一旦初始化完成,其他線程就可見)
有序性:
在本線程內,操作都是有序的
在線程外觀察,操作都是無序的。(指令重排 或 主內存同步延時)
指令重排
線程內串行語義
寫後讀 a = 1;b = a; 寫一個變量之後,再讀這個位置。
寫後寫 a = 1;a = 2; 寫一個變量之後,再寫這個變量。
讀後寫 a = b;b = 1; 讀一個變量之後,再寫這個變量。
以上語句不可重排
編譯器不考慮多線程間的語義
可重排: a=1;b=2;
指令重排的基本原則 :
程序順序原則:一個線程內保證語義的串行性
volatile規則:volatile變量的寫,先發生於讀
鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
傳遞性:A先於B,B先於C 那麼A必然先於C
線程的start方法先於它的每一個動作
線程的所有操作先於線程的終結(Thread.join())
線程的中斷(interrupt())先於被中斷線程的代碼
對象的構造函數執行結束先於finalize()方法

四,編譯和解釋運行的概念
解釋運行 :
解釋執行以解釋方式運行字節碼
解釋執行的意思是:讀一句執行一句

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

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