本章知識點
1.JVM的概念
2.JVM發(fā)展歷史?
3.JVM種類
4.Java語言規(guī)范
5.JVM規(guī)范
初識JVM - JVM概念
JVM是Java Virtual Machine的簡稱,意為Java虛擬機
虛擬機:指通過軟件模擬的具有完整硬件系統(tǒng)功能的,運行在一個完全隔離環(huán)境中的完整的計算機系統(tǒng)。
有哪些虛擬機:VMWare、Visual Box、JVM。
VMWare或者Virtual Box都是使用軟件模擬物理CPU的指令集。
JVM使用軟件模擬Java字節(jié)碼的指令集。
JNI(Java Native Interface):java與其他語言(C/C++)通信的API。
初識JVM? -? Java和JVM的歷史
1996年SUN JDK 1.0 Classic VM:純解釋運行,使用外掛進行JIT(Just In Time),java的口號write once run anywhere。
1997年 JDK 1.1: 發(fā)布AWT,內(nèi)部類,JDBC,RMI,反射。
1998年 JDK 1.2 Solaris Exact VM:JIT解釋器混合;Accurate Memory Management(精確內(nèi)存管理),數(shù)據(jù)類型敏感;提升GC(Gabage?Collection)性能。JDK 1.2 開始稱為Java 2 J2SE J2EE J2ME,加入swing,collection
2000年 JDK 1.3 HotSpot :作為默認虛擬機發(fā)布,加入JavaSound。
2002年 JDK 1.4: Classic VM退出歷史舞臺加入Asset正則表達式,NIO,IPV6日志,加密類庫。
2004年發(fā)布 JDK 1.5 即JDK5、J2SE 5、Java 5:加入泛型,注解,裝箱,枚舉,可變長的參數(shù),F(xiàn)oreach循環(huán),java.util.concurrent并發(fā)包。
2006年 JDK1.6 JDK6:腳本語言支持,JDBC4.0,Java編譯器API
2011年 JDK 7 發(fā)布:延誤項目推出到JDK 8 ,動態(tài)語言增強,64位系統(tǒng)中的壓縮指針,NIO2.0,在java.util.concurrent中加入fork/join是對并發(fā)包的一個補充。
2014年 JDK 8 發(fā)布:Lambda表達式,語法增強,Java類型注解。
2016年 JDK 9 :模塊化。??
初識JVM - Java和JVM的歷史 - 大事件
使用最為廣泛的JVM為HotSpot。
HotSpot為Longview Technologies開發(fā) 被SUN收購。
2006年 Java開源 并建立OpenJDK,對java源碼進行管理:HotSpot 成為Sun JDK和OpenJDK中所帶的虛擬機,名字從之前的J2變?yōu)镴ava SE。
2008 年 Oracle收購BEA:得到JRockit VM。
2010年Oracle 收購 Sun:得到Hotspot。
Oracle宣布在JDK8時整合JRockit和Hotspot,優(yōu)勢互補:在Hotspot基礎(chǔ)上,移植JRockit優(yōu)秀特性。
KVM:由SUN發(fā)布,在IOS Android出來之前,廣泛用于手機系統(tǒng)。
CDC/CLDC HotSpot:用于手機、電子書、PDA等設(shè)備上建立統(tǒng)一的Java編程接口;J2ME的重要組成部分。
JRockit:BEA。
IBM J9 VM:在IBM內(nèi)部使用。
Apache Harmony:兼容于JDK 1.5和JDK 1.6的Java程序運行平臺;與Oracle關(guān)系惡劣 退出JCP ,Java社區(qū)的分裂;OpenJDK出現(xiàn)后,受到挑戰(zhàn) 2011年 退役;沒有大規(guī)模商用經(jīng)歷;對Android的發(fā)展有積極作用。
初識JVM - 規(guī)范
Java語言規(guī)范:語法、變量、類型、方法。
JVM規(guī)范:Class文件類型,運行時數(shù)據(jù),幀棧,虛擬機的啟動,虛擬機的指令集。
初識JVM - Java語言規(guī)范
語法定義:
? ??IfThenStatement:if?(?Expression?)?Statement;
? ??ArgumentList:Argument、ArgumentList。
詞法結(jié)構(gòu):
? ??\u + 4個16進制數(shù)字:表示UTF-16;
? ??行終結(jié)符:CR, or LF, or CR LF;
????空白符:空格 tab \t 換頁 \f 行終結(jié)符;
? ??注釋、標示符、關(guān)鍵字;
? ??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;
? ??操作:+=??-=??*=??/=??&=??|=??^=??%=??<<=??>>=??>>>=。
類型和變量:
? ??元類型:byte short int long float char boolean double
? ??泛型。
Java內(nèi)存模型,類加載鏈接的過程,public static final abstract的定義,異常,數(shù)組的使用......
初識JVM - JVM規(guī)范
Java語言規(guī)范定義了什么是Java語言。
Java語言和JVM相對獨立:Groovy、Clojure、Scala。
JVM:主要定義二進制class文件和JVM指令集等。
Class文件格式。
數(shù)字的內(nèi)部表示和存儲:Byte ?-128 to 127......
returnAddress?數(shù)據(jù)類型定義:指向操作碼的指針,不對應(yīng)Java數(shù)據(jù)類型,不能在運行時修改,F(xiàn)inally實現(xiàn)需要。
定義PC。
堆、棧。
方法區(qū)。
整數(shù)的表達:
? ??原碼:第一位為符號位(0為正數(shù),1為負數(shù));
? ??反碼:符號位不動,原碼取反;
? ??負數(shù)補碼:符號位不動,反碼加1;
? ??正數(shù)補碼:和原碼相同。
VM指令集:
????類型轉(zhuǎn)化(l2i);
? ??出棧入棧操作:aload astore;
? ??運算:iadd isub;
? ??流程控制:ifeq ifne;
? ??函數(shù)調(diào)用:invokevirtual invokeinterface invokespecial invokestatic。
JVM需要對Java Library 提供以下支持:反射 java.lang.reflect,ClassLoader,初始化class和interface,安全相關(guān) java.security,多線程,弱引用。
JVM的編譯:源碼到JVM指令的對應(yīng)格式,Javap,JVM反匯編的格式。
JDK(Java Development Kit)
? ? ? ? Jdk是java程序設(shè)計語言,java虛擬機,java API類庫的統(tǒng)稱,jdk是支持java程序運行,開發(fā)的最小環(huán)境。
JRE(Java Runtime Environment)
????????我們把java api類庫中的java se的子集和java虛擬機稱為jre,jre是支持java程序運行的標準環(huán)境。
JDK和JRE所覆蓋的范圍

java技術(shù)體系分為四個平臺
Java card:支持一些java小程序(applets)運行在小內(nèi)存設(shè)備(智能卡)上面的平臺。
Java ME(micro edition):支持java程序運行在移動終端(手機,PDA)上的平臺,對java api有所精簡,并加入了針對移動終端的支持,之前稱為J2ME,從jdk1.6之后修改。
Java SE(standar edition):支持面向桌面級的應(yīng)用(如windows下的應(yīng)用程序)的平臺,提供Java核心API,之前稱為J2SE。
Java EE(enterprise edition):支持使用多層應(yīng)用構(gòu)架的java平臺,除了提供java se api外,還對其做了大量的擴充,也支持部署,之前稱為J2EE。
Coin項目
????????自2009年1月起,Coin便是Java7(和Java8)中一個開源的子項目,創(chuàng)建coin項目是為了反映java語言中的微小變動,項目的名字是個雙關(guān)語——像硬幣一樣小的變化(small change comes as coins),而“套用一句老話”(to coin a phrase)指的是給Java語言添一個新的表述方式。