一:特定程序員
跨平臺性、安全性、可移植性。編程
二:體系機構bootstrap
Java 體系結構包括四個獨立但相關的技術:緩存
- Java程序設計語言
- Java Class文件格式
- Java 應用編程接口(API)
- Java 虛擬機
用Java編程語言編寫源代碼,把它編譯成Class文件,而後再在Java虛擬機中運行 class 文件。當編寫程序時,經過調用類中的方法來訪問系統資源(好比I/O)。當程序運行的時候,它經過調用 class 文件中實現了 Java API的方法來知足程序的 Java API調用。安全
一、執行引擎編程語言
不一樣的 Java 虛擬機,執行引擎可能實現的很是不一樣,目前有如下幾類:性能
- 最簡單的執行引擎就是一次性解釋字節碼;
- 即時編譯器:第一次被執行的字節碼會被編譯成本地機器代碼,編譯出的本地機器代碼會被緩存,當方法之後被調用的時候能夠重用;
- 自適應優化器:虛擬機開始的時候解釋字節碼,可是會監視運行中程序的活動,而且記錄下使用最頻繁的代碼段。程序運行的時候,虛擬機只把那些活動最頻繁的代碼編譯成本地代碼,其它的代碼因爲使用的並不很頻繁,繼續保留爲字節碼-----由虛擬機解釋它們。
- 最後一種虛擬機由硬件芯片構成,它用本地方法執行Java字節碼,這種執行引擎其實是內嵌在芯片裏的。
二、Native (JNI)方法優化
當 Java 虛擬機是又主機操做系統上的軟件實現的時候,Java 程序經過調用本地方法和主機交互。本地方法特定:spa
- 其是由其餘語言(好比:C,C++,或者彙編語言)編寫的,編譯成和處理器相關的機器代碼;
- 本地方法保存在動態連接庫中,格式是各個平臺專有的,和平臺相關;
- 運行中的Java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,並調用這個方法。
三、類加載器操作系統
一個Java應用程序可使用兩種類裝載器:「啓動」(bootstrap)類裝載器和用戶定義的類裝載器。
- 啓動類裝載器(這是系統中惟一的)是Java 虛擬機實現的一部分;啓動類裝載器一般使用某種默認方式從本地磁盤中裝載類;
- 用戶定義的類裝載器可以使用Java編寫,可以被編譯爲 class 文件,可以被虛擬機裝載,還可以象其它對象同樣實例化。它們實際上只是運行中的Java應用程序可執行代碼的一部分;
- 類僅可見被同個類裝載器裝載的類。類中使用的其餘類也需被加載該類的類裝載器進行裝載。經過這種方法,Java 的體系結構容許在一個Java應用程序中創建多個命名空間。運行時的Java程序中的每個類裝載器都有它本身的命名空間;
- 不一樣類裝載器裝載的類被存放在不一樣的命名空間,從而它們不能互相訪問。經過這種方法,就可以使用Java類裝載器的體系結構來控制任何從不一樣源文件中裝載的代碼之間的相互影響,特別是可以阻止惡意代碼獲取訪問和破壞善意代碼的權限;
四、Java API
- Java API 是運行庫集合,提供了一套訪問主機系統資源的標準方法;
- Java 編寫程序時,基於標準定義的Java API進行調用訪問系統資源;
- Java 虛擬機和Java API class 文件是任何Java平臺都要實現的必要部分。運行Java程序時,虛擬機裝載程序的class文件所使用的Java API class文件;
- 全部被裝載的class文件(包括從應用程序中和從 Java API中提取的)和全部已經裝載的動態庫(包含本地方法)共同組成了在Java 虛擬機上運行的整個程序;
五、Java 語言
(1) 優缺點:
優勢:提供開發者效率;
缺點:
性能相對於C++不太好
- 執行速度較慢,犧牲了 性能;
- 內存管理 --- 垃圾收集器 給程序運行時的性能加入了一些不肯定性,沒法確認垃圾收集器何時開始收集垃圾,沒法確認垃圾收集器是否開始收集垃圾,也沒法確認垃圾收集到底持續多長時間;
- 線程調度:Java虛擬機規範討論線程調度的地方很是籠統,致使程序員沒法瞭解應該如何調度線程,沒法控制線程的調度;
Java 實現了平臺無關性,也要付出代價,即最小公分母問題。儘管在各個操做系統之間有許多共性,但每一個操做系統一般都有一些本身的特性。想要給程序提供訪問任何操做系統的系統服務功能的API,就不得不決定究竟支持哪種特性。Java API是支持的大部分操做系統都支持的特性,對於少部分不支持這種特性的操做系統上由API模擬來實現它。
當把Java class文件與Java編程語言之間的緊密聯繫和Java天生的動態鏈接特性聯繫到一塊兒的時候,還要付出代價。由於Java程序是動態鏈接的,從一個類到另外一個類的引用是符合化的,能夠被編譯出來,成果會被別人竊取;而靜態編譯成可執行的二進制文件時,其靜態鏈接庫的優化程度很是高,它與初始源碼的符合程度越小,此時想反編譯獲取可讀代碼花費時間比較長。針對動態編譯要防止成果被竊取,可以使用混淆器,混淆器經過更改類、字段、方法和局部變量名字的方法來修改類,可是它並不更改程序的工做流程。
(2) 預編譯的概念???
- 把 Java 程序編譯成單獨的可執行程序的方法可以改善性能,但這一般是以犧牲 Java 的動態擴展能力爲代價的;
- 預編譯是進行靜態而不是動態的鏈接,它產生出徹底鏈接的、單獨的本地可執行文件,可是這種可執行文件一般失去了運行時動態建立和鏈接新類型的能力
PS:參考 《深刻理解Java虛擬機第二版》一書