目錄java
1,Java體系結構c++
2.jvm執行引擎api
概述jvm
其實,學java不算新手了,可是卻感受不少基本的知識,咱們一開始也許是記住而不深究,我以爲有一些概念,仍是須要了解.性能
咱們所說的java程序,須要jvm,java api,java class的輔助才能運行.咱們從下面的圖片能夠看到,JDK,JRE,java api和JVM以其餘們之間的關係:優化
也就是說,JDK>JRE>Java api>JVM.操作系統
1)Java Language
2)Java class文件格式
3)Java應用程序接口(API)
4)JVM
當編寫一個java程序並運行的時候,同時用到這4個技術:使用'Java Language'編寫源代碼->將它編譯成'java class'文件->在'jvm'中運行該'class'文件.在編寫程序時,經過調用類(這些類實現了java api)中的方法來訪問系統資源(例如I/O).如圖1-1:
JVM的任務是裝載 'class'文件,並運行其中的字節碼.如圖1-2,jvm中包含一個類裝載器(class loader),它能夠從程序和api中裝載class文件.java api中只有程序運行時須要的那些類纔會被裝載.
有4種執行引擎,分別爲:
1)一次性解釋字節碼.
2)即時編譯器(Just-in-time compiler),這種執行引擎比第一種的更快,可是也更消耗內存.在這種狀況下,第一次被執行的字節碼會被編譯成本地機器碼,編譯出的本地機器碼會被緩存,當方法之後被調用的時候能夠重用.
3)自適應優化器.在這種方法中,jvm開始的時候解釋字節碼,可是會監視運行中程序的活動,並記錄使用最爲頻繁的代碼段.程序運行的時候,jvm只把那些活動最爲頻繁的代碼編譯爲本地機器碼.而其餘代碼,因爲使用不頻繁,繼續保留爲字節碼-由jvm繼續解釋它們.一個自適應優化器可使得 jvm在 80%~90%的時間裏執行被優化過的代碼,而只須要編譯10%~20%對性能有影響的代碼.
4)由硬件芯片構成,它由本地方法執行java字節碼.這種執行引擎其實是內嵌在芯片裏的.
3,ClassLoader的體系結構
用戶定義的ClassLoader使得在運行時擴展java應用程序成爲可能.當被裝載的類引用了另一個類的時候,jvm將使用裝載第一個類的ClassLoader去裝載被引用的類.如,jvm使用某一特定的ClassLoader裝載Volcano這個類,而Volcano類使用一個叫Lava類(如調用Lava類的一個方法),那麼jvm將使用裝載Volcano這個類的ClassLoader去裝載Lava.這樣,被該ClassLoader返回的Lava類就動態地與Volcano類創建聯繫.因爲jvm使用這種方式進行類的裝載,因此被裝載的類默認狀況下只能看到被同一個ClassLoader裝載的別的類.
經過容許使用不一樣的用戶自定義的類裝載器裝載不一樣來源的class文件,他們把不一樣來源的class文件放置在不一樣的命名空間中,它就可以限制或阻止不一樣來源的代碼之間的相互訪問.
java class文件主要在平臺無關性和網絡移動性方面使java更適應於網絡.
1)平臺無關性)它爲java程序提供獨立於底層主機平臺的二進制形式的服務.一般狀況下,一個平臺上的二進制可執行文件不能在其餘平臺上工做(如用c/c++編寫的程序).而java class文件是能夠運行在任何支持jvm的硬件平臺和操做系統上的二進制文件.
當編譯和連接一個c++程序的時候,所得的可執行二進制文件,只能在特定平臺的和操做系統上運行,是由於這個二進制文件包含了目標處理器的機器語言.
除了特定的處理器的機器語言以外,傳統的二進制可執行文件的另一個依賴性是具體平臺的屬性是整數的字節順序.例如,在支持x86系列處理器的二進制可執行文件中,字節順序是地位以前;而對於PowerPC處理器,則是高位在前.java class文件中字節順序是高位在前(而與平臺無關).
2)網絡移動性)class文件設計緊湊,全部能夠快速在網絡上傳送.其次,java是動態連接和動態擴展,class文件能夠在須要的時候才下載.