成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

JVM虛擬機我來了~~~

虛擬機

1.1 發(fā)展歷程

1.1.1 java往事

? 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ā)不可收拾。

? 剩下的事情,大家都知道了……

1.1.2 版本迭代

  • 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 三大體系。

    • 2000 年,JDK1.3 發(fā)布,默認的 Java 虛擬機由 Sun Classic VM 改為 HotSopt。
  • 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用的人少了,這是后話。

1.1.3 兩種jdk

openjdk vs oraclejdk:

  1. Oracle JDK將更多地關(guān)注穩(wěn)定性,它重視更多的企業(yè)級用戶,而OpenJDK經(jīng)常發(fā)布以支持其他特性,不太穩(wěn)定。
  2. Oracle JDK支持長期發(fā)布的更改(LTS),而Open JDK僅支持計劃和完成下一個發(fā)行版。
  3. Oracle JDK根據(jù)二進制代碼許可協(xié)議獲得許可,而OpenJDK根據(jù)GPL v2許可獲得許可。
  4. 2019年1月之后發(fā)布的Oracle Java SE 8的公開更新將無法用于商業(yè),但是,OpenJDK是完全開源的,可以自由使用。
  5. Oracle JDK的構(gòu)建過程基于OpenJDK,因此OpenJDK與Oracle JDK之間沒有技術(shù)差異。
  6. 頂級公司正在使用Oracle JDK,Open JDK不太受歡迎。
  7. Oracle JDK具有良好的GC選項和更好的渲染器,而OpenJDK具有更少的GC選項
  8. 在響應(yīng)性和JVM性能方面,Oracle JDK提供了更好的性能。
  9. Oracle JDK在運行JDK時不會產(chǎn)生任何問題,而OpenJDK有時會產(chǎn)生一些問題。
  10. Oracle JDK將從其10.0.X版本將收費,用戶必須付費或必須依賴OpenJDK才能使用其免費版本。
  11. Oracle JDK完全由Oracle公司開發(fā),而Open JDK項目由IBM,Apple,SAP AG,Redhat等頂級公司加入和合作。

1.2 JVM體系

  • 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.3 各種虛擬機

1.3.1 清單

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、)虛擬機

1.3.2 查看

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.4 jvm整體架構(gòu)

1.4.1 java運行過程

1.源碼編譯:通過Java源碼編譯器將Java代碼編譯成JVM字節(jié)碼(.class文件)

2.類加載:通過ClassLoader及其子類來完成JVM的類加載

3.類執(zhí)行:字節(jié)碼被裝入內(nèi)存,進入JVM虛擬機,被解釋器解釋執(zhí)行

1.4.2 jvm模型

由上面的圖可以看出,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()方法。

2、類文件結(jié)構(gòu)

了解jvm后續(xù)的一切動作,先從字節(jié)碼開始。它是一切發(fā)生的源頭。

2.1 測試案例

2.1.1 源代碼

package com.itheima.jvm.demo;

public class ClassStruct {

    private static String name = "JVM";

    public static void main(String[] args) {
        System.out.println("Hello " + name);
    }

}

2.1.2 編譯

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

2.2 字節(jié)碼結(jié)構(gòu)

2.2.1 二進制概覽

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)圖示如下:

2.2.2 魔數(shù)與版本

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)境

2.2.3 常量池

再往下遵從相同的規(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有多種類型:

  • 直接類型,存的就是當(dāng)前值,這種像Integer,Long等長度都是確定的
  • 引用類型,存的是指向其他位置的指針


附:綠色代表指針,橙色代表直接類型

3)案例

下面以String為例,String是一種引用類,它會指向一個utf8類型來存儲真實的信息

jdk提供了一個工具,javap,可以查看常量列表的詳細內(nèi)容:

javap -v ClassStruct.class

2.2.4 其他信息

1)說明

常量池之后,是緊挨的一系列信息,這些信息大同小異,無非就是值、或者引用

(參考上面2.3.3里的表格和圖例)

  • 訪問標記:public abstract 等信息
  • 類索引,class類型,最終指向一個utf8,標記當(dāng)前類的名字
  • 父類,同上
  • 接口,2字節(jié)記錄數(shù)量,后面記錄多個接口類型
  • 接下來是字段、方法、屬性,都是2字節(jié)記錄后面多少個,后面緊跟對應(yīng)的結(jié)構(gòu)體類型

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)

h5響應(yīng)式網(wǎng)站建設(shè)
平谷区| 张家川| 姚安县| 惠安县| 颍上县| 荔波县| 祁东县| 太和县| 绥芬河市| 新野县| 河源市| 徐州市| 江都市| 镶黄旗| 陇西县| 宁津县| 博湖县| 上蔡县| 扎兰屯市| 玉田县| 柳江县| 衡水市| 恩平市| 军事| 涡阳县| 航空| 涿州市| 闽侯县| 绍兴市| 丽水市| 金坛市| 包头市| 庆元县| 积石山| 班玛县| 九寨沟县| 桃园县| 思茅市| 临沭县| 达拉特旗| 新源县|