熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

《深入理解Java虛擬機》筆記

2022-06-13   來源: Java核心技術 

  

  在C裡面我們想執行一段自己編寫的機器指令的方法大概如下

  typedef void(*FUNC)(int);  
   char* str = your code;  
   FUNC f = (FUNC)str;  
   (*f)(); 

  也就是說我們完全可以做一個工具從一個文件中讀入指令然後將這些指令運行起來上面代碼中編好的機器指令當然指的是能在CPU上運行的如果這裡我還實現了一個翻譯機器從自己定義的格式指令翻譯到CPU指令那麼就可以執行根據自定義格式的代碼了那麼上面這段代碼是不是相當於最簡單的一個虛擬機了?下面來看JVM的總體結構

   

  ClassLoader的作用是裝載能被JVM識別的指令(當然不只是從磁盤文件或內存去裝載)那麼我們先了解一下該格式

  

  魔數以及版本就不說了(滿大街的文件格式都是這個東西)接著的便是常量池其中無非是兩種東西

  Exceptions則非常簡單

  

  LineNumberTable保存了字節碼和源碼之間的關系結構如下

    

  LocalVariableTable描述了棧幀中局部變量表的變量和源代碼中定義的變量之間的關系結構如下

    

  SourceFile指明了生成該Class文件的Java源碼文件名(比如在一個Java文件中申明了很多類的時候會生成很多Class文件)結構如下

  

  Deprecated和Synthetic屬性只存在沒有的區別

  這樣默認的類會是有Application ClassLoader去加載類然後如果發現要使用新的類型的時候則會遞歸地使用Application ClassLoader去加載(在前面的加載過程中提到)這樣只有在自己的程序中能使用自己編寫的ClassLoader去加載類並且這個被加載的類是不能被別人使用的


雙親委派模式不是一個強制性的約束而是Java設計者推薦給開發者的類加載實現方式雙親委派模式出現過的破壞

  加載完完成後接下來就要看程序是怎麼運行的棧幀是用於支持虛擬機進行方法調用和執行幀的意思就是一個單位在調用其他方法的時候會向棧中壓入棧幀結構如下

    

  在Class文件編譯完成之後在運行的時候需要多少個局部變量就已經確定(在前面Class文件中也已經看到過了)那麼這裡需要注意這個特性可能會引發GC(具體如何引發就不在這裡細說了)在棧中總是底層的棧去調用高層的棧(並且一定的相鄰的)那麼他們在參數傳遞(返回結果)的時往往是通過將其壓入操作數棧有些虛擬機為了提高這部分的效率使得相鄰棧幀糾纏在一起

    

  那麼我們接下來要去看是方法是如何執行的第一個問題就是執行哪個方法?在面向過程的編程中似乎不存在在個問題但是在Java OR C++中這都是比較蛋疼的一個問題原因就是平時不會這麼用但是你必須去搞明白= =


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26127.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.