《深入Java虛擬機學習筆記》- 第一、二章 Java體系結構和平臺無關性

1.     第一章 Java體系結構

Java編程環境:

 

Java虛擬機基本結構:

 

 

Java有兩種類型的類裝載器:啓動類裝載器和用戶定義的類裝載器。啓動類裝載器是虛擬機實現的一部分,通常用C/C++語言來編寫(Java虛擬機就是用C/C++語言編寫的)。啓動類裝載器主要是裝載JAVA API核心類庫。用戶定義的類裝載器則是用JAVA語言編寫的,因此,我們可以定義自己的類裝載器,在程序運行期間,根據我們的需要來裝載類。

 

Java語言的優勢:

Java沒有直接操縱內存的方法,避免了內存誤操作引起的崩潰。一種類型的引用無法直接轉換爲另外一種類型的引用,除非在運行時刻,一種類型的引用實際上是指向了另外一種類型的實例(比如假設B繼承A,在運行時刻,A引用指向了一個B的實例,這種情況下,可以把A引用轉換爲B類型的引用)。

 

垃圾收集:在JAVA中,可以用new關鍵字創建一個對象,但沒有delete關鍵字顯式釋放對象的方法。JAVA虛擬機會自動判斷一個對象是否還有別人在引用它,如果已經不存在其它對象對它的引用,則會自動釋放這個對象所佔的內存。

 

數組邊界檢查:在JAVA中,你如果創建一個長度爲10的數組,那麼你只能放置10個對象,如果放置更多的對象,將會拋出異常,而不是導致程序崩潰。

 

對對象引用的檢查:如果你嘗試執行一個空的對象引用的方法,將會拋出空指針異常,而不是導致程序崩潰。

 

Java語言的劣勢:

 

性能:比不上本地代碼,但也可以通過某種手段在一定程度上增強性能,比如編譯爲本地代碼(預編譯)、Java虛擬機本身的性能也在逐步提高。當然,因爲JAVA程序的複雜性(比如分佈式系統或在各種不同的虛擬機上運行相同的程序等),所以,這種程序性能的增強也是有代價的。

 

內存管理和線程調度上的缺陷:無法確定垃圾收集何時開始和持續多長時間。

 

最小公分母問題:爲了支持跨平臺,必需在某些特性上進行取捨。

 

反編譯問題:Javaclass文件,包含指令字節碼和變量名稱、方法描述等各種信息,這導致JAVAclass文件很容易被反編譯。解決辦法就是混淆器。用混淆器來混淆代碼,將變量名稱、方法描述等信息變成完全無意義的符號,這樣對反編譯者來說,在反編譯之後,要對代碼進行分析將會付出更加大的代價。

 

2.     第二章 平臺無關

 

Write Once,Run Anywhere

 

上圖就描述了所謂平臺無關的概念。

 

影響平臺無關的主要因素:

第一,     平臺的部署:你必須保證在目標機器上已經部署了相關的JAVA平臺

第二,     JAVA版本,雖然JAVA號稱向上兼容(即用舊版本的JDK開發的程序,可以運行在新版本的JAVA虛擬機上面),但事情不是絕對的!另外,你當然更不能期望用新版本的JDK開發的軟件能夠運行在舊版本的JDK上面了,因爲新版本的JDK一定會比舊版本的JDK增加和改變了很多特性,如果你用到了這些特性,那麼你的程序就無法在舊版本的JDK上面運行。

本地方法(JNI),如果你用到了JNI,也無法對你的程序進行移植

發佈了34 篇原創文章 · 獲贊 30 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章