工做過一段時間才發現不用"管他是怎麼實現的"這些話都是狗p,如下是看 Java虛擬機規範(Java SE 7) 筆記和思考,我的也以爲先看規範在學習深刻理解等系列會更容易,節約篇幅具體定義不抄了javascript
jvm:只與特定的二進制文件格式(class)有關聯,java硬件無關性與操做系統無關的關鍵部分java
實現:HotSpot,jrockit,ibmJvm等c++
簡單的說,實現jvm只須要正確讀取class文件的指令,並正確執行這些指令所蘊含的操做便可編程
就三條,標準的基礎教材,但相關的東西不少數組
1.硬件相關性是什麼?數據結構
首先看一下機器碼與字節碼:jvm
字節碼:字節碼一般指的是已經通過編譯,但與特定機器碼無關,須要直譯器轉譯後才能成爲機器碼的中間代碼。字節碼一般不像源碼同樣可讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。字節碼主要爲了實現特定軟件運行和軟件環境、硬件環境無關。字節碼的實現方式是經過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯爲能夠直接執行的指令。字節碼的典型應用爲Java語言。編程語言
原生機器碼:機器語言是一種指令集的體系。這種指令集,稱機器碼,是電腦的CPU可直接解讀的數據。機器碼有時也被稱爲原生碼,這個名詞比較強調某種編程語言或庫,它與運行平臺相關的部份。函數
說白了電子計算機經過電子信號的有無(0/1)進行操做,其中在cpu有一個區域能夠用不一樣的信號控制其餘的信號即指令集(參考《編程奧妙》)學習
不過這麼解釋好像又有問題
2.原生機器碼又怎麼進行運行?
我暫時理解爲徹底由Cpu和操做系統實現,不一樣的cpu處理機制不同,操做系統依賴這些機制且,且須要對機器碼規範進行實現,至於機器碼規範我沒找到,這是我杜撰出來的,等我看完cpu原理在解釋
總之看了簡介以後就能夠一眼看出java的優點(這種圖處處都是)
編譯型:程序 --> 機器語言 直接編譯爲機器語言
解釋性:程序 --> 字節碼 --->機器語言 根據具體系統在編譯爲機器語言
增長一箇中間層達到平臺無關的目的, 操做平臺上的機器語言又是一套規範
這些都是編程語言,可咱們在開發的時候還有腳本語言,那麼
3.腳本語言又是什麼?
腳本語言: 規則+解釋器,通常都是以文本形式存在,相似於一種命令,用以迴應他人意圖
說白了就是 腳本語言(文本)-->解析器 而解析器能夠由程序語言編寫(javascript:v8/c++ ,rhino/java...)
種類:原始類型和引用類型
做用:變量賦值、參數傳遞、方法返回和運算操做
區別:原始類型的值不須要經過特殊標記或別的額外識別手段來在運行期肯定它們的實際數據類型,也無需刻意將它們與引用類型的值區分開來,虛擬機的字節碼指令自己就能夠肯定它的指令操做數的類型是什麼,因此能夠利用這種特性便可直接肯定操做數的數值類型(每條指令具備專屬操做類型)
其餘:編譯器應當在編譯期間盡最大努力完成可能的類型檢查,使得虛擬機在運行期間無需進行這些操做。
種類:數值(整數,浮點),布爾,returnAddress
boolean:編譯後爲int/type
returnAddress:finally相關,忘記它
1.float表示範圍爲何比int大?
參照 IEEE 754 規範 (說實話,剛工做的時候我歷來沒想過這個問題)
其中
2.整數內容的提高?
xx
種類:類類型(Class Types)、數組類型(Array Types)和接口類型(Interface Types)
均由相關類型動態建立
數組類型:數組類型還包含一個單一維度(即長度不禁其類型決定)的組件類型(Component Type),一個數組的組件類型也能夠是數組。但從任意一個數組開始,若是發現其組件類型也是數組類型的話,繼續重複取這個數組的組件類型,這樣操做不斷執行,最終必定能夠遇到組件類型不是數組的狀況,這時就把這種類型成爲數組類型的元素類型(Element Type)。數組的元素類型必須是原始類型、類類型或者接口類型之中的一種。(多維數組的解釋)
PC寄存器:程序計數器
Java虛擬機棧:棧幀能夠在堆中分配,Java虛擬機棧所使用的內存不須要保證是連續的(曾今叫java棧)
堆:可供各條線程共享的運行時內存區域,也是供全部類實例和數組對象分配內存的區域,被垃圾收集器強制管理(傳說中的垃圾堆- -)
方法區:可供各條線程共享的運行時內存區域。方法區與傳統語言中的編譯代碼儲存區或者操做系統進程的正文段的做用很是相似,它存儲了每個類的結構信息,例如運行時常量池、字段和方法數據、構造函數和普通方法的字節碼內容、還包括一些在類、實例、接口初始化時用到的特殊方法。方法區是堆的邏輯組成部分,但gc不強制處理
什麼是堆和棧?
看書多了就以爲堆跟棧老是重名,是命名的緣由仍是翻譯有問題有機會的看看
首先數據結構中有堆跟棧,其中
堆:知足必定性質的徹底二叉樹(二叉樹中任一非葉子結點關鍵字的值均小於(大於)它的孩子結點的關鍵字)
棧(堆棧):是限制僅在表的一端進行插入和刪除運算的線性表。有順序棧、鏈式棧(先進後出)
隊:只容許在一端進行插入,而在另外一端進行刪除的運算受限的線性表(先進先出)
棧和隊列是兩種特殊的線性表,它們的邏輯結構和線性表相同,只是其運算規則較線性表有更多的限制,故又稱它們爲運算受限的線性表。
結構只是理論,實際上咱們也不怎麼用,在java中的實現類沒找到- -
而在操做系統中
堆棧是對內存操做的一種機制,能夠度娘下 操做系統對內存的管理
因此能夠看到jvm既然成爲虛擬機,就必定會有對內存的管理機制,將這個名字繼承下來就是Java虛擬機棧和堆