一、經過java 命令 啓動JVMjava
二、裝置配置(根據當前路徑及系統版本尋找jvm.cfg)算法
三、根據配置找jvm.dll多線程
四、使用jvm.dll初始化JVMjvm
五、找到main,並執行函數
一、每一個線程都有一個PC寄存器性能
二、在線程建立的時建立spa
三、指向下一條指令的地址線程
四、執行本地方法,PC寄存器的值是未定義的指針
一、保存類的信息對象
二、一般與永久區關聯在一塊兒
一、全部的對象 都存在堆
二、因此線程都是共享java堆
三、堆的結構與gc算法是有關係的
四、gc的主要工做區
一、線程私有
二、棧由一些列幀組成
三、幀保存一個方法的局部變量、操做數棧、常量池指針
四、每一次方法調用,都會建立一個新的 幀,並壓入棧中
一、小對象(通常幾十個bytes),在沒有逃逸的狀況下,能夠直接分配在棧上
二、直接分配在棧上,能夠自動回收,減輕GC壓力
三、大對象或者逃逸對象沒法棧上分配
怎麼可讓遞歸函數 調用的次數多一些,應該怎麼作?
首先了解到線程在調用每一個方法的時候,都會建立相應的棧,在退出方法的時候移出棧楨,而且棧是私用的,也須要佔用空間,因此讓一個程序的函數調用層次變的更深
減小棧貞的空間很必要。或者增大線程的線的大小。
經過volatile增長調用層次深度。線程會對一個沒有volatile的變量進行臨時存儲,這就致使線程棧的空間增大,若是對一個變量增長volatile修飾,能夠適當增長深度;
除此以外能夠減少局部變量表,好比 少用double,long,減小參數個數,局部變量在使用的時候,注意做用域
一、每一個線程都有本身的工做內存 ,與主存獨立
volatile 不能代替鎖,通常狀況比鎖效率好
一、volatile 的使用
二、synchronized 使用
三、final(初始化以後,其餘線程就能夠看到)
一、本線程中,操做是有序的
二、多線程是無序的,操做是無序的(指令重拍或主存同步延遲)
三、加上synchronized ,能夠保證重拍
程序順序原則:一個線程內保證語義的串行性
volatile規則:volatile變量的寫,先發生於讀
鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
傳遞性:A先於B,B先於C 那麼A必然先於C
線程的start方法先於它的每個動做
線程的全部操做先於線程的終結(Thread.join())
線程的中斷(interrupt())先於被中斷線程的代碼
對象的構造函數執行結束先於finalize()方法
編譯運行 效率高於 解釋運行
一、解釋運行
解釋執行以解釋方式運行字節碼;解釋執行的意思是:讀一句執行一句
二、編譯運行(JIT)
將字節碼編譯成機器碼;直接執行機器碼;運行時編譯;編譯後性能有數量級的提高