JVM簡介

1、JVM概念
        JVM是Java Virtual Machine的簡稱。意爲Java虛擬機。
 虛擬機
                                         指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統
 有哪些虛擬機
VMWare
Visual Box
JVM
 VMWare或者Visual Box都是使用軟件模擬物理CPU的指令集
 JVM使用軟件模擬Java 字節碼的指令集


2、JVM的發展史
 1996年 SUN JDK 1.0 Classic VM
                                        -- 純解釋運行,使用外掛進行JIT
 1997年 JDK1.1 發佈
                                        -- AWT、內部類、JDBC、RMI、反射
 1998年 JDK1.2 Solaris Exact VM(JDK1.2開始 稱爲Java 2; J2SE J2EE J2ME 的出現;加入Swing Collections)
                                        -- JIT 解釋器混合
                                        -- Accurate Memory Management 精確內存管理,數據類型敏感
                                        -- 提升的GC性能
        2000年 JDK 1.3 Hotspot 作爲默認虛擬機發布(加入JavaSound)
        2002年 JDK 1.4 Classic VM退出歷史舞臺
  2004年發佈 JDK1.5 即 JDK5 、J2SE 5 、Java 5
--泛型
--註解
--裝箱
--枚舉
--可變長的參數
--Foreach循環
  JDK1.6 JDK6
--腳本語言支持
--JDBC 4.0
--Java編譯器 API


 2011年 JDK7發佈
                                                --延誤項目推出到JDK8
                                                --G1
                                                --動態語言增強
                                                --64位系統中的壓縮指針
                                                --NIO 2.0
 2014年 JDK8發佈
                                                --Lambda表達式
                                                --語法增強  Java類型註解
        2016年JDK9
                                                --模塊化
JVM的歷史 – 大事記
        使用最爲廣泛的JVM爲HotSpot
        HotSpot 爲Longview Technologies開發 被SUN收購
        2006年 Java開源 並建立OpenJDK
                                                --HotSpot  成爲Sun JDK和OpenJDK中所帶的虛擬機
        2008 年 Oracle收購BEA
                                                --得到JRockit VM
        2010年Oracle 收購 Sun       
                                                --得到Hotspot
        Oracle宣佈在JDK8時整合JRockit和Hotspot,優勢互補
                                                --在Hotspot基礎上,移植JRockit優秀特性


3、各式JVM
        KVM
                                                -- SUN發佈
                                                -- IOS Android前,廣泛用於手機系統
        CDC/CLDC HotSpot
                                                -- 手機、電子書、PDA等設備上建立統一的Java編程接口
                                                -- J2ME的重要組成部分
        JRockit
                                                -- BEA
        IBM J9 VM
                                                -- IBM內部
        Apache Harmony
                                                -- 兼容於JDK 1.5和JDK 1.6的Java程序運行平臺
                                             -- 與Oracle關係惡劣 退出JCP ,Java社區的分裂
                                                -- OpenJDK出現後,受到挑戰 2011年 退役
                                                -- 沒有大規模商用經歷
                                                -- 對Android的發展有積極作用


4、Java規範
  Java語言規範
-- 語法
-- 變量
-- 類型
-- 文法
  JVM規範
-- Class文件類型
-- 運行時數據
-- 幀棧
-- 虛擬機的啓動
-- 虛擬機的指令集
  語法定義
                                         -- IfThenStatement:  
                                                                                if ( Expression ) Statement                                                        // if(true){do sth;}
                                            -- ArgumentList:
                                        Argument
                                        ArgumentList , Argument                                                                        // add(a,b,c,d);


 詞法結構
                                             -- \u + 4個16進制數字 表示UTF-16
                                             -- 行終結符: CR, or LF, or CR LF.
                                                -- 空白符
                                                · 空格 tab \t 換頁 \f  行終結符
                                                -- 註釋
                                                -- 標識符
                                                -- 關鍵字
Identifier:    IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars: JavaLetter    IdentifierChars JavaLetterOrDigit
JavaLetter:    any Unicode character that is a Java letter (see below)
JavaLetterOrDigit:    any Unicode character that is a Java letter-or-digit (see below)
// 
public static void 打印(){
                                        System.out.println("中文方法哦");
}
public  static void main(String[] args) {
                                        打印();
}
詞法結構
                                -- Int
                                                                        · 0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF
                                -- Long
                                                                        · 0l 0777L 0x100000000L 2_147_483_648L 0xC0B0L
                                -- Float
                                                                            · 1e1f 2.f .3f 0f 3.14f 6.022137e+23f
                                -- Double
                                                                            · 1e1 2. .3 0.0 3.14 1e-9d 1e137
                                -- 操作
                                                                            · +=  -=  *=  /=  &=  |=  ^=  %=  <<=  >>=  >>>=
哪些是合法的數字呢?
      -- private int a=0xDada_Cafe;
      -- private float b=0x1.fffffeP+127f;
      -- private float c=1996;
      -- private float d=1996.3;
      -- private int f=9999e2;
      -- private double g=33e2;
      -- private float h=0x1.fffep-12f;
      -- private float i=1.fffep-12f;
      -- private long p=0b1_1_1_0_1;
      -- private long q=0b1_1_1_0_2;
類型和變量
                                -- 元類型
                                                                         · byte short int long float char
                                -- 變量初始值
                                                                            · boolean false
                                                                            · char \u0000
                                -- 泛型


Java內存模型
類加載鏈接的過程
public static final abstract的定義
異常
數組的使用
…….
Java語言規範定義了什麼是Java語言
Java語言和JVM相對獨立
                                -- Groovy
                                -- Clojure
                                -- Scala
JVM主要定義二進制class文件和JVM指令集等
Class 文件格式
數字的內部表示和存儲
                                -- Byte  -128 to 127 (-27 to 27 - 1)
returnAddress 數據類型定義
                                -- 指向操作碼的指針。不對應Java數據類型,不能在運行時修改。Finally實現需要
定義PC


方法區
整數的表達
-- 原碼:第一位爲符號位(0爲正數,1爲負數)
-- 反碼:符號位不動,原碼取反
-- 負數補碼:符號位不動,反碼加1
-- 正數補碼:和原碼相同
-- 打印整數的二進制表示
int a=-6;
for(int i=0;i<32;i++){
        int t=(a & 0x80000000>>>i)>>>(31-i);
        System.out.print(t);
}


爲什麼要用補碼?
                                -- 計算0的表示:


Float的表示與定義
-- 支持 IEEE 754
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
                                                                                                                                                                                                                                                                                                           
e全0 尾數附加位爲0  否則尾數附加位爲1
s*m*2^(e-127)
一些特殊的方法
-- <clinit>
-- <init>
VM指令集
-- 類型轉化
                                        · l2i 
-- 出棧入棧操作
                                    · aload  astore
-- 運算
                                    · iadd  isub
-- 流程控制
                                    · ifeq ifne
-- 函數調用
                                · invokevirtual invokeinterface  invokespecial  invokestatic
JVM需要對Java Library 提供以下支持:
-- 反射 java.lang.reflect
-- ClassLoader
-- 初始化class和interface
-- 安全相關 java.security
-- 多線程
-- 弱引用
JVM的編譯
-- 源碼到JVM指令的對應格式
-- Javap
-- JVM反彙編的格式
· <index> <opcode> [ <operand1> [ <operand2>... ]] [<comment>]
void spin() {
  int i;
  for (i = 0; i < 100; i++) { ;
     // Loop body is empty
   }

0            iconst_0                         // Push int constant 0
1             istore_1                          // Store into local variable 1 (i=0)
2            goto 8                           // First time through don't increment
5            iinc 1 1                            // Increment local variable 1 by 1 (i++)
8            iload_1                           // Push local variable 1 (i)
9            bipush 100                 // Push int constant 100
11           if_icmplt 5               // Compare and loop if less than (i < 100)
14          return               // Return void when done



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章