深刻JVM內核之 ———— JVM運行機制

JVM啓動流程

JVM基本結構

注:其中指令計數器以及其餘隱含寄存器就至關於 PC寄存器

PC寄存器

每一個線程擁有一個PC寄存器,在線程建立的時候建立,pc寄存器老是指向下一條指令的地址,這樣程序就知道下一步該幹什麼。在執行本地方法的時候,PC的值就是 undefined
複製代碼

方法區

保存裝載的類信息多線程

  • 類型的常量池函數

  • 字段,方法信息性能

  • 方法字節碼 一般和永久區(Perm)關聯在一塊兒spa

    注:JDK6時,String等常量信息置於方法區,JDK7的時候,已經移動到了堆
     方法區中保存的類信息有可能會改變,好比熱加載。可是與應用層面的信息相比來講是穩定的,因此方法區能夠成爲永久區,永久區並不表明就永久不變。
    複製代碼

Java堆

  • 和程序開發關係密切
  • 應用系統中對象都保存在Java堆中
  • 全部線程共享Java堆
  • 對分代GC來講,堆也是分代的
  • GC的主要工做區間

Java棧

  • 線程私有
  • 棧由一系列幀組成(所以Java棧也叫作幀棧)
  • 幀保存一個方法的局部變量、操做數棧、常量池指針

Java棧 – 局部變量 包含參數和局部變量 線程

Java棧 – 操做數棧3d

Java中沒有寄存器,全部參數傳遞使用操做數棧
複製代碼

Java棧 – 棧上分配指針

注 Java棧-棧上分配
 
 小對象(通常幾十個bytes),在沒有逃逸的狀況下,能夠直接分配在棧上,逃逸狀況是另外一個線程中也是用到該對象
 
 直接分配在棧上,能夠自動回收,減輕GC的壓力
 
 大對象或者逃逸的對象沒法棧上分配
複製代碼

Java棧 -棧、堆、方法區交互code

內存模型

可見性:一個線程修改了變量,其餘線程能夠當即知道cdn

保證可見性的方法對象

  • 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)

  • 將字節碼編譯成機器碼
  • 直接執行機器碼
  • 運行時編譯
  • 編譯後性能有數量級的提高
相關文章
相關標籤/搜索