有人說最好的學習是輸出。
Java體系結構包括四個獨立但相關的技術
- Java程式設計語言
- Java class檔案格式
- Java應用程式設計接口(API)
- Java虛拟機
當編寫并運作一個Java程式時,就同時體驗了這四種技術。用Java程式設計語言編寫源代碼,把他編譯成Java class檔案,然後再在Java虛拟機中運作class檔案。當編寫程式時,通過調用類(這些類實作了Java API)中的方法來通路資源(比如I/O)。
Java虛拟機和Java API一起組成了一個“平台”,所有Java程式都在這上面編譯。Java虛拟機和Java API的組合除了被稱為Java運作時系統外,還被稱為Java平台。
Java虛拟機
Java虛拟機的主要任務是裝載class檔案并且執行其中的位元組碼。Java虛拟機包含一個類裝載器(class loader),它可以從程式和API中裝載class檔案。Java API中隻有程式執行時需要的那些類才會被裝載。
位元組碼由執行引擎來執行。
Java API
Java中有兩種方法:Java方法和本地方法。Java方法是由Java語言編寫,編譯成位元組碼,存儲在class檔案中。本地方法是由其他語言(c,c++或者彙編)編寫的,編譯成和處理器相關的機器代碼。本地方法儲存在動态連結庫中,格式是各個平台特有的。
運作中的Java程式調用本地方法時,虛拟機裝載包含這個本地方法的動态庫
如果希望使用指定主機上的資源,他們又無法從Java API通路,那麼可以編寫一個平台相關的Java程式來調用本地方法接口(JNI)-----Java調用本地方法其實是通過JNI方式調用本地方法,這樣使得本地方法可以在特定主機系統的任何一個Java平台上實作。
然而Java平台供應商并不一定必須支援JNI。除了JNI之外,他們還可以提供自己的本地方法接口。
如果希望保證程式的平台無關性,那麼隻能通過Java API來通路底層系統資源。
Java class檔案
Java class檔案是可以運作在任何支援Java虛拟機的硬體平台和作業系統上的二進制檔案
Java class檔案中位元組順序是高位在前,這與使用何種平台産生這個檔案和在何種平台上使用這個檔案都沒有關系。
Java程式設計語言
使用Java語言編寫程式,能夠充分利用如下的許多軟體技術:
- 面向對象
- 多線程
- 結構化錯誤處理
- 垃圾收集
- 動态連接配接
- 動态擴充
Java體系結構的代價
- Java程式的執行速度
- 記憶體管理
- 線程排程
- Java動态連結特性
Java程式的執行速度
解釋器:每次解釋一條位元組碼,簡單,性能不高
即時編譯器:
第一次被執行的位元組碼會被編譯成本地機器代碼。編譯出的本地機器代碼會被緩存,當方法以後被調用的時候可以重用
自适應優化器:
(虛拟機開始的時候解釋位元組碼,但是會監視運作中程式的活動,并且記錄下使用最頻繁的代碼段。程式運作的時候,虛拟機隻把哪些活動最頻繁的代碼編譯成本地機器代碼,不頻繁的代碼繼續保留為位元組碼-----由虛拟機繼續解釋它們)
記憶體管理
垃圾收集器可以使得許多程式更加健壯,但是垃圾收集器也給程式運作時的性能加入了一些不确定性,你無法确認垃圾收集器什麼時候開始收集,無法确認垃圾收集器是否開始收集垃圾,也無法确認垃圾收集器到底要持續多久。
線程排程
Java虛拟機規範讨論線程排程的地方非常籠統,程式員無法了解應該如何排程線程,無法控制線程的排程。
動态連結特性
因為Java程式是動态連接配接的,從一個類到另一個類的應用是符号化的。在Java class檔案中,指向另一個類的引用通過字元串清除的表明了所指向的這個類的名字。如果引用是指向一個字段的話,這個字段的名字和描述符(字段的類别)會被詳細說明。如果引用指向一個成員方法的話,那麼這個成員方法的名稱和描述符(方法的傳回類型,方法參數的數量和類型)也會被詳細說明。而且,Java class檔案除了對其他類的字段和成員方法的符号引用,他們還包含對自己的字段和成員方法的符号引用。Java class檔案還包含可選的調試資訊,這些測試資訊包含局部變量的名稱和類型。
一個class檔案的符号資訊,以及自己嗎指令集和Java語言之間的密切關系,這些方面都使得把Java class檔案逆向編譯為Java源碼檔案相當容易。
以上内容大部分來源于《Inside the Java Virtual Machine ,Seconde Edition》