JVM 的運行機制

JVM 啓動流程:

一、經過java 命令 啓動JVMjava

二、裝置配置(根據當前路徑及系統版本尋找jvm.cfg)算法

三、根據配置找jvm.dll多線程

四、使用jvm.dll初始化JVMjvm

五、找到main,並執行函數

JVM 的內部結構

PC寄存器:

一、每一個線程都有一個PC寄存器性能

二、在線程建立的時建立spa

三、指向下一條指令的地址線程

四、執行本地方法,PC寄存器的值是未定義的指針

方法區:

一、保存類的信息對象

二、一般與永久區關聯在一塊兒

java堆:

一、全部的對象  都存在堆

二、因此線程都是共享java堆

三、堆的結構與gc算法是有關係的

四、gc的主要工做區

java棧:

一、線程私有

二、棧由一些列幀組成

三、幀保存一個方法的局部變量、操做數棧、常量池指針

四、每一次方法調用,都會建立一個新的 幀,並壓入棧中

 

java棧  棧上分配

一、小對象(通常幾十個bytes),在沒有逃逸的狀況下,能夠直接分配在棧上
二、直接分配在棧上,能夠自動回收,減輕GC壓力
三、大對象或者逃逸對象沒法棧上分配

怎麼可讓遞歸函數 調用的次數多一些,應該怎麼作?

 首先了解到線程在調用每一個方法的時候,都會建立相應的棧,在退出方法的時候移出棧楨,而且棧是私用的,也須要佔用空間,因此讓一個程序的函數調用層次變的更深
    減小棧貞的空間很必要。或者增大線程的線的大小。
    經過volatile增長調用層次深度。線程會對一個沒有volatile的變量進行臨時存儲,這就致使線程棧的空間增大,若是對一個變量增長volatile修飾,能夠適當增長深度;
除此以外能夠減少局部變量表,好比 少用double,long,減小參數個數,局部變量在使用的時候,注意做用域

 

jVM  內存模型

一、每一個線程都有本身的工做內存   ,與主存獨立

volatile  不能代替鎖,通常狀況比鎖效率好

 

JVM的可見性保證

一、volatile 的使用

二、synchronized 使用

三、final(初始化以後,其餘線程就能夠看到)

 

JVM的有序性

一、本線程中,操做是有序的

二、多線程是無序的,操做是無序的(指令重拍或主存同步延遲)

三、加上synchronized ,能夠保證重拍

 

JVM 指令重排的規則

程序順序原則:一個線程內保證語義的串行性
volatile規則:volatile變量的寫,先發生於讀
鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
傳遞性:A先於B,B先於C 那麼A必然先於C
線程的start方法先於它的每個動做
線程的全部操做先於線程的終結(Thread.join())
線程的中斷(interrupt())先於被中斷線程的代碼
對象的構造函數執行結束先於finalize()方法

JVM字節碼兩種運行方式

編譯運行  效率高於 解釋運行

一、解釋運行

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

二、編譯運行(JIT)

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

相關文章
相關標籤/搜索