Java執行原理
先記錄參考的文檔,謝謝他們
http://qing.blog.sina.com.cn/2494474521/94aea91933002vg2.html
http://www.importnew.com/1486.html 這個強烈推薦看
看個java文件編譯和執行全程:
虛擬機是一種通過模擬方式來實現物理計算機體系架構的軟件。
Java虛擬機是保障Java程序能跨平臺運行的虛擬計算機。
Java虛擬機規范是對異構硬件、多樣os 的 抽象、是一種 軟件層次的計算機體系架構的約定描述,你可以依照該規范實現自己的java虛擬機。
通常的物理計算機體系架構是經典的馮諾依曼,基于寄存器的計算架構,能執行有限的機器指令碼
jvm有自己的指令系統,jvm是基于堆棧的計算架構
Java堆棧要求Java程序執行中的每個線程都有一個獨立的堆棧,每個當前執行的方法是當前線程堆棧的一個片斷(Frame), 最終還是jvm將自己的指令翻譯為物理計算機的機器指令才能執行的
不直接寫機器指令碼是因為難懂難記難看難維護
□ JVM和其它任何虛擬機一樣,都是完成資源的封裝,從而提高資源的利用率和可管理性。
□ JVM是Java平臺體系的核心基礎設施。Java語言編寫的程序在JVM上被解釋和執行。
□ JVM在JSR-924中進行了規范,在JSR-202中維護更新。JVM規范使JVM的具體實現和建立在JVM之上的應用之間耦合性降低。
□ JVM規范主要從Java字節碼規范、基本的執行過程、JVM指令集和抽象架構四個層面進行描述。
□ JVM實現中的關鍵問題是內存管理和垃圾回收、JVM指令到機器指令翻譯方法、多線程支持
Java虛擬機根據jvm規范將Java源程序編譯為jvm操作指令的Java字節碼,這種指令不是機器碼指令
在裝有jvm的機器上,運行Java程序實際是jvm加載編譯好的java字節碼文件,然后將字節碼文件中的指令翻譯為機器碼執行。
首先大概看一下JVM的抽象架構
可以看出jvm進程占用的物理內存 主要分為 三大塊:
1、類加載器 :從入口處開始按需加載字節碼文件,填充這些數據到運行時數據區
2、運行時數據區:核心區,運行的時候操作所分配的內存區
3、執行引擎 :jvm的cpu,不斷地取指令,JIT編譯翻譯,執行
外圍
1、編譯好的字節碼文件,一般為.class
2、native功能庫
java字節碼.class 文件結構
類加載器 怎么加載類文件的,jvm的類加載采用父類委托制,子加載器能查詢父加載器已緩存類,反之不行。
運行時數據區,公有:對象實例都在 heap里,方法區還包括常量池,
每個線程私有 程序計數器,jvm 棧 本地方法棧
jvm棧中壓入的是棧幀Frame這個frame包含了很多數據:局部變量、操作數棧、常用引用
除了pc計數器區 其他區都有可能產生oom,棧區還有可能stackoverflow
執行引擎,將字節碼即時編譯 優化 為本地代碼, 然后執行
執行命令: java Test 背后到底做了什么