? Java誕生在一群懶惰、急躁而傲慢的程序天才之中。
主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站、程序開發(fā)、微網(wǎng)站、微信小程序等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體,具備承接不同規(guī)模與類型的建設(shè)項目的能力。
? 1990年12月,Sun的工程師Patrick Naughton被當(dāng)時糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,并威脅要離開Sun轉(zhuǎn)投當(dāng)時在Steve Jobs領(lǐng)導(dǎo)之下的NeXT公司。領(lǐng)導(dǎo)層為了留住他,給他一個機會,啟動了一個叫做Stealth(秘密行動)的項目。
? 隨著James Gosling等人的加入,這個項目更名為Green。其目標是使用C++為嵌入式設(shè)備開發(fā)一種新的基礎(chǔ)平臺技術(shù),James Gosling本人負責(zé)開發(fā)一個編輯器。正如人們事后分析的那樣,這位天才的程序員太懶惰,所以沒有把C++學(xué)好,開發(fā)中碰了一頭包。于是他決定開發(fā)一種新的編程語言。他把這種語言命名為C++++--,意思是C++ “加上一些好東西,減去一些壞東西”。顯然這個糟糕的名字不可能長久,于是很快這種頗受同伴喜愛的小語言被命名為Oak。
? 到了1992年9月,Oak語言連同Green OS和一些應(yīng)用程序一起發(fā)布在稱做Start 7的小設(shè)備上,有了第一次精彩的亮相。隨后,Sun開了一家名為FirstPerson的公司,整個團隊被轉(zhuǎn)移到這家公司里研發(fā)機頂盒,以投標時代華納公司的一個項目。這幫天才被技術(shù)狂熱所鼓舞,開發(fā)出了一個高交互性的設(shè)備,結(jié)果沒想到時代華納公司和有線電視服務(wù)商并不愿意用戶擁有那么大的控制權(quán),從而在競標之戰(zhàn)中敗給了SGI。
? Sun無奈地關(guān)閉了FirstPerson,召回了整個團隊,java的出路卻沒有因此而斷送,隨著互聯(lián)網(wǎng)發(fā)展的涌動,java開始離開嵌入式小設(shè)備,往互聯(lián)網(wǎng)傾斜。1994年,Oak被命名為Java,回到了激情澎湃的IT產(chǎn)業(yè),抓住互聯(lián)網(wǎng)的大潮,從此一發(fā)不可收拾。
? 剩下的事情,大家都知道了……
1991 年,James Gosling 博士發(fā)布產(chǎn)品 Oak( 橡樹),這是 Java 語言的前身。
1995 年,Oak 語言改名為 Java。
1996 年,JDK(Java開發(fā)所使用的工具包)1.0 發(fā)布,提供了純解釋執(zhí)行的 Java 虛擬機實現(xiàn):Sun Classic VM。
1997 年,JDK1.1 發(fā)布,代表技術(shù)有:JDBC、JavaBeans、內(nèi)部類、反射。
1998 年,JDK1.2 發(fā)布,Java 技術(shù)體系被拆分為 J2SE、J2EE、J2ME 三大體系。
2002 年,JDK1.4 發(fā)布,Java 真正走向成熟,代表技術(shù)有:正則表達式、NIO等。
2004 年,JDK5.0 發(fā)布,對語法易用性做了很大改進,新增了泛型、枚舉等,代表技術(shù)有:并發(fā)包等。
2006 年,JDK6.0 發(fā)布,將 J2EE/J2SE/J2ME 的命名方式改為 Java SE 6、Java EE 6、Java ME 6。
2009 年,Sun 公司因為經(jīng)營不善被 Oracle 公司收購。
2011 年,JDK7 發(fā)布。
2013 年,JDK8(LTS) 發(fā)布,函數(shù)式編程,lamda表達式。
2017年,JDK9
2018年,JDK 10,11(LTS)正式發(fā)布
2019年,JDK 12,13
2020年,JDK 14,15
2021年,JDK 16,17(LTS)
附:sun與微軟的軼事
java誕生的1995年,正是微軟在軟件產(chǎn)業(yè)地位達到巔峰的時代。但是這個初出茅廬的毛頭小子硬是引起了微軟帝國的關(guān)注。所以96年微軟就向sun申請了java認證。
微軟的加持確實推動了人們對java的信心和興趣。
但是好景不長,從1997年發(fā)布Visual J++的第一個版本開始,微軟就開始在Java中摻入自己的私有擴展。這毫無疑問引起Sun的高度重視。
1997年10月,Sun向美國加州地方法院起訴微軟公司違反兩公司就微軟使用Java技術(shù)所簽定的合同,指控微軟公司在自己的Java產(chǎn)品中做了“不恰當(dāng)?shù)男薷摹?,違反了合同中承諾向用戶提供Java兼容產(chǎn)品的條款。
這一官司一直打到了2001年1月雙方達成和解。
到了2001年7月,微軟公布新版的Windows XP將不再支持Sun的JVM,并且推出了.NET平臺與Java分庭抗禮。
當(dāng)然目前.net用的人少了,這是后話。
openjdk vs oraclejdk:
JDK(Java Development Kit)是 Java語言的軟件開發(fā)工具包,也是整個java開發(fā)的核心,它包含了JRE和開發(fā)工具包
JRE(Java Runtime Environment),Java運行環(huán)境,包含了JVM和Java的核心類庫(Java API)
JVM(Java Virtual Machine),Java虛擬機,它是運行在操作系統(tǒng)之上的,它與硬件沒有直接的交互
所謂“一次編碼,隨處運行“正是基于不同系統(tǒng)下的jvm幫你掩蓋了系統(tǒng)之間接口的差異:
總結(jié)
jdk是開發(fā)人員的工具包,它包含了java的運行環(huán)境和虛擬機,而一次編寫到處運行就是基于jvm
1、Sun Classic VM
? 世界上第一款商用 Java 虛擬機。
1996年隨著Java1.0的發(fā)布而發(fā)布,JDK1.4時完全被淘汰
2、BEA JRockit
專注于服務(wù)端應(yīng)用,號稱是世界上最快的JVM
? 后來被 Oracle收購;Oracle JRockit (原來的 Bea JRockit)
3、IBM公司的 J9VM
全稱:IBM Technology for Java Virtual Machine,簡稱IT4J,內(nèi)部代號:J9
是 IBM 自己開發(fā)的一款 JVM
市場定位于HotSpot接近,服務(wù)器端、桌面應(yīng)用、嵌入式等多用途VM
4、HotSpot VM(現(xiàn)在最常用)
? 它是Sun JDK和OpenJDK中所帶的虛擬機,也是目前使用范圍最廣的Java虛擬機。
5、其他
(TaobaoJVM 、Graal VM、Azul VM、Liquid VM、Apache Harmony、)虛擬機
shawn@macpro:~ > java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
hotspot虛擬機
Client VM是專門為快速啟動和小內(nèi)存(small footprints)而優(yōu)化的,像GUI就很適合
Server VM是專門為高性能應(yīng)用而優(yōu)化的,如服務(wù)器應(yīng)用
版本是基于tag為1.8.0_181
1.源碼編譯:通過Java源碼編譯器將Java代碼編譯成JVM字節(jié)碼(.class文件)
2.類加載:通過ClassLoader及其子類來完成JVM的類加載
3.類執(zhí)行:字節(jié)碼被裝入內(nèi)存,進入JVM虛擬機,被解釋器解釋執(zhí)行
由上面的圖可以看出,JVM虛擬機中主要是由三部分構(gòu)成,分別是類加載子系統(tǒng)、運行時數(shù)據(jù)區(qū)、執(zhí)行引擎。
類加載子系統(tǒng)
Java虛擬機把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的Java類型。
運行時數(shù)據(jù)區(qū)
Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。
這些區(qū)域有各自的用途,以及創(chuàng)建和銷毀的時間,有的區(qū)域隨著虛擬機進程的啟動而一直存在,有些區(qū)域則是依賴用戶線程的啟動和結(jié)束而建立和銷毀。
執(zhí)行引擎
執(zhí)行引擎用于執(zhí)行JVM字節(jié)碼指令,主要有兩種方式,分別是解釋執(zhí)行和編譯執(zhí)行,區(qū)別在于,解釋執(zhí)行是在執(zhí)行時翻譯成虛擬機指令執(zhí)行,而編譯執(zhí)行是在執(zhí)行之前先進行編譯再執(zhí)行。
解釋執(zhí)行啟動快,執(zhí)行效率低。編譯執(zhí)行,啟動慢,執(zhí)行效率高。
垃圾回收器就是自動管理運行數(shù)據(jù)區(qū)的內(nèi)存,將無用的內(nèi)存占用進行清除,釋放內(nèi)存資源。
本地方法庫、本地庫接口
在jdk的底層中,有一些實現(xiàn)是需要調(diào)用本地方法完成的(使用c或c++寫的方法),就是通過本地庫接口調(diào)用完成的。比如:System.currentTimeMillis()方法。
了解jvm后續(xù)的一切動作,先從字節(jié)碼開始。它是一切發(fā)生的源頭。
package com.itheima.jvm.demo;
public class ClassStruct {
private static String name = "JVM";
public static void main(String[] args) {
System.out.println("Hello " + name);
}
}
1)maven定義編譯的版本
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2)編譯
mvn clean compile
1)vscode打開
2)class文件是一個二進制文件,轉(zhuǎn)化后是16進制展示,實際上class文件就是一張表,它由以下數(shù)據(jù)項構(gòu)成,這些數(shù)據(jù)項從頭到尾嚴格按照以下順序排列:
類型 | 名稱 | 數(shù)量 | 描述 |
---|---|---|---|
u4 | magic | 1 | 魔數(shù) |
u2 | minor_version | 1 | 次版本號 |
u2 | major_version | 1 | 主版本號 |
u2 | constant_pool_count | 1 | 常量個數(shù) |
cp_info | constant_pool | constant_pool_count - 1 | 具體常量 |
u2 | access_flags | 1 | 訪問標志 |
u2 | this_class | 1 | 類索引 |
u2 | super_class | 1 | 父類索引 |
u2 | interfaces_count | 1 | 接口索引 |
u2 | interfaces | interfaces_count | 具體接口 |
u2 | fields_count | 1 | 字段個數(shù) |
field_info | fields | fields_count | 具體字段 |
u2 | methods_count | 1 | 方法個數(shù) |
method_info | methods | methods_count | 具體方法 |
u2 | attributes_count | 1 | 屬性個數(shù) |
attribute_info | attributes | attributes_count | 具體屬性 |
3)圖示如下:
1)魔數(shù):
CAFEBABE,咖啡寶寶,固定的。
2)版本號:
34,換成10進制就是52
jdk的版本標記映射關(guān)系:
說明編譯用的是jdk8,我們改成1.6,重新執(zhí)行 mvn clean compile ,再來查看class文件試試:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
擴展
在開發(fā)中,經(jīng)常會遇到類似Unsupported major.minor version 51.0的錯誤,一般情況下都是JDK版本不匹配造成的。
雖然jdk代碼在執(zhí)行時基本上向下兼容,但是!開發(fā)環(huán)境和服務(wù)器環(huán)境jdk最好一致,不要嘗試這個坑。
區(qū)分和理解兩個環(huán)境:編譯環(huán)境,運行環(huán)境
再往下遵從相同的規(guī)律: 計數(shù)器(標注后面有多少個) + 對應(yīng)個數(shù)的結(jié)構(gòu)體
我們以常量池為例:
1)位置
2)結(jié)構(gòu)說明
常量池記錄了jvm內(nèi)的一堆常量信息,這部分由 【2個字節(jié)計數(shù)】 + 【n個cp_info結(jié)構(gòu)】組成
其中cp_info有多種類型:
附:綠色代表指針,橙色代表直接類型
3)案例
下面以String為例,String是一種引用類,它會指向一個utf8類型來存儲真實的信息
jdk提供了一個工具,javap,可以查看常量列表的詳細內(nèi)容:
javap -v ClassStruct.class
1)說明
常量池之后,是緊挨的一系列信息,這些信息大同小異,無非就是值、或者引用
(參考上面2.3.3里的表格和圖例)
2)注意事項
要看懂javap后的格式,明白這些格式,可以輕松看懂class結(jié)構(gòu)
類型 | 標識符 | 案例 | 說明 |
---|---|---|---|
數(shù)組 | [ | [Ljava.lang.String | String數(shù)組 |
對象 | L | Lcom.test.Demo | |
基本類型 | 大寫字母開頭 | B=byte,I=int…… | |
組合類型
類型 | 案例 | 說明 |
---|---|---|
類里的屬性、字段、方法等 | com.test.Demo.name:Ljava.lang.String | 英文點號隔開 |
標識什么類型 | com.test.Demo.getName:()Ljava.lang.String | 英文冒號隔開 |
方法 | (參數(shù)類型)返回值類型 | 英文括弧,后面是返回值類型 |
3)實例分析
本文由
傳智教育博學(xué)谷
教研團隊發(fā)布。如果本文對您有幫助,歡迎
關(guān)注
和點贊
;如果您有任何建議也可留言評論
或私信
,您的支持是我堅持創(chuàng)作的動力。轉(zhuǎn)載請注明出處!
分享文章:JVM虛擬機我來了~~~
本文地址:http://jinyejixie.com/article34/dsdihpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、網(wǎng)站維護、域名注冊、關(guān)鍵詞優(yōu)化、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)