欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JVM虛擬機(jī)我來(lái)了~~~

虛擬機(jī)

1.1 發(fā)展歷程

1.1.1 java往事

? Java誕生在一群懶惰、急躁而傲慢的程序天才之中。

主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站、程序開(kāi)發(fā)、微網(wǎng)站、微信小程序等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等多方位專(zhuān)業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類(lèi)型的建設(shè)項(xiàng)目的能力。

? 1990年12月,Sun的工程師Patrick Naughton被當(dāng)時(shí)糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,并威脅要離開(kāi)Sun轉(zhuǎn)投當(dāng)時(shí)在Steve Jobs領(lǐng)導(dǎo)之下的NeXT公司。領(lǐng)導(dǎo)層為了留住他,給他一個(gè)機(jī)會(huì),啟動(dòng)了一個(gè)叫做Stealth(秘密行動(dòng))的項(xiàng)目。

? 隨著James Gosling等人的加入,這個(gè)項(xiàng)目更名為Green。其目標(biāo)是使用C++為嵌入式設(shè)備開(kāi)發(fā)一種新的基礎(chǔ)平臺(tái)技術(shù),James Gosling本人負(fù)責(zé)開(kāi)發(fā)一個(gè)編輯器。正如人們事后分析的那樣,這位天才的程序員太懶惰,所以沒(méi)有把C++學(xué)好,開(kāi)發(fā)中碰了一頭包。于是他決定開(kāi)發(fā)一種新的編程語(yǔ)言。他把這種語(yǔ)言命名為C++++--,意思是C++ “加上一些好東西,減去一些壞東西”。顯然這個(gè)糟糕的名字不可能長(zhǎng)久,于是很快這種頗受同伴喜愛(ài)的小語(yǔ)言被命名為Oak。

? 到了1992年9月,Oak語(yǔ)言連同Green OS和一些應(yīng)用程序一起發(fā)布在稱(chēng)做Start 7的小設(shè)備上,有了第一次精彩的亮相。隨后,Sun開(kāi)了一家名為FirstPerson的公司,整個(gè)團(tuán)隊(duì)被轉(zhuǎn)移到這家公司里研發(fā)機(jī)頂盒,以投標(biāo)時(shí)代華納公司的一個(gè)項(xiàng)目。這幫天才被技術(shù)狂熱所鼓舞,開(kāi)發(fā)出了一個(gè)高交互性的設(shè)備,結(jié)果沒(méi)想到時(shí)代華納公司和有線電視服務(wù)商并不愿意用戶擁有那么大的控制權(quán),從而在競(jìng)標(biāo)之戰(zhàn)中敗給了SGI。

? Sun無(wú)奈地關(guān)閉了FirstPerson,召回了整個(gè)團(tuán)隊(duì),java的出路卻沒(méi)有因此而斷送,隨著互聯(lián)網(wǎng)發(fā)展的涌動(dòng),java開(kāi)始離開(kāi)嵌入式小設(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( 橡樹(shù)),這是 Java 語(yǔ)言的前身。

  • 1995 年,Oak 語(yǔ)言改名為 Java。

  • 1996 年,JDK(Java開(kāi)發(fā)所使用的工具包)1.0 發(fā)布,提供了純解釋執(zhí)行的 Java 虛擬機(jī)實(shí)現(xiàn):Sun Classic VM。

  • 1997 年,JDK1.1 發(fā)布,代表技術(shù)有:JDBC、JavaBeans、內(nèi)部類(lèi)、反射。

  • 1998 年,JDK1.2 發(fā)布,Java 技術(shù)體系被拆分為 J2SE、J2EE、J2ME 三大體系。

    • 2000 年,JDK1.3 發(fā)布,默認(rèn)的 Java 虛擬機(jī)由 Sun Classic VM 改為 HotSopt。
  • 2002 年,JDK1.4 發(fā)布,Java 真正走向成熟,代表技術(shù)有:正則表達(dá)式、NIO等。

  • 2004 年,JDK5.0 發(fā)布,對(duì)語(yǔ)法易用性做了很大改進(jìn),新增了泛型、枚舉等,代表技術(shù)有:并發(fā)包等。

  • 2006 年,JDK6.0 發(fā)布,將 J2EE/J2SE/J2ME 的命名方式改為 Java SE 6、Java EE 6、Java ME 6。

  • 2009 年,Sun 公司因?yàn)榻?jīng)營(yíng)不善被 Oracle 公司收購(gòu)。

  • 2011 年,JDK7 發(fā)布。

  • 2013 年,JDK8(LTS) 發(fā)布,函數(shù)式編程,lamda表達(dá)式。

  • 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è)地位達(dá)到巔峰的時(shí)代。但是這個(gè)初出茅廬的毛頭小子硬是引起了微軟帝國(guó)的關(guān)注。所以96年微軟就向sun申請(qǐng)了java認(rèn)證。
微軟的加持確實(shí)推動(dòng)了人們對(duì)java的信心和興趣。
但是好景不長(zhǎng),從1997年發(fā)布Visual J++的第一個(gè)版本開(kāi)始,微軟就開(kāi)始在Java中摻入自己的私有擴(kuò)展。這毫無(wú)疑問(wèn)引起Sun的高度重視。
1997年10月,Sun向美國(guó)加州地方法院起訴微軟公司違反兩公司就微軟使用Java技術(shù)所簽定的合同,指控微軟公司在自己的Java產(chǎn)品中做了“不恰當(dāng)?shù)男薷摹保`反了合同中承諾向用戶提供Java兼容產(chǎn)品的條款。
這一官司一直打到了2001年1月雙方達(dá)成和解。
到了2001年7月,微軟公布新版的Windows XP將不再支持Sun的JVM,并且推出了.NET平臺(tái)與Java分庭抗禮。
當(dāng)然目前.net用的人少了,這是后話。

1.1.3 兩種jdk

openjdk vs oraclejdk:

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

1.2 JVM體系

  • JDK(Java Development Kit)是 Java語(yǔ)言的軟件開(kāi)發(fā)工具包,也是整個(gè)java開(kāi)發(fā)的核心,它包含了JRE和開(kāi)發(fā)工具包

  • JRE(Java Runtime Environment),Java運(yùn)行環(huán)境,包含了JVM和Java的核心類(lèi)庫(kù)(Java API)

  • JVM(Java Virtual Machine),Java虛擬機(jī),它是運(yùn)行在操作系統(tǒng)之上的,它與硬件沒(méi)有直接的交互

所謂“一次編碼,隨處運(yùn)行“正是基于不同系統(tǒng)下的jvm幫你掩蓋了系統(tǒng)之間接口的差異:

總結(jié)

jdk是開(kāi)發(fā)人員的工具包,它包含了java的運(yùn)行環(huán)境和虛擬機(jī),而一次編寫(xiě)到處運(yùn)行就是基于jvm

1.3 各種虛擬機(jī)

1.3.1 清單

1、Sun Classic VM

? 世界上第一款商用 Java 虛擬機(jī)。

1996年隨著Java1.0的發(fā)布而發(fā)布,JDK1.4時(shí)完全被淘汰

2、BEA JRockit

專(zhuān)注于服務(wù)端應(yīng)用,號(hào)稱(chēng)是世界上最快的JVM

? 后來(lái)被 Oracle收購(gòu);Oracle JRockit (原來(lái)的 Bea JRockit)

3、IBM公司的 J9VM

全稱(chēng):IBM Technology for Java Virtual Machine,簡(jiǎn)稱(chēng)IT4J,內(nèi)部代號(hào):J9

是 IBM 自己開(kāi)發(fā)的一款 JVM

市場(chǎng)定位于HotSpot接近,服務(wù)器端、桌面應(yīng)用、嵌入式等多用途VM

4、HotSpot VM(現(xiàn)在最常用)

? 它是Sun JDK和OpenJDK中所帶的虛擬機(jī),也是目前使用范圍最廣的Java虛擬機(jī)。

5、其他

(TaobaoJVM 、Graal VM、Azul VM、Liquid VM、Apache Harmony、)虛擬機(jī)

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虛擬機(jī)

  • Client VM是專(zhuān)門(mén)為快速啟動(dòng)和小內(nèi)存(small footprints)而優(yōu)化的,像GUI就很適合

  • Server VM是專(zhuān)門(mén)為高性能應(yīng)用而優(yōu)化的,如服務(wù)器應(yīng)用

  • 版本是基于tag為1.8.0_181

1.4 jvm整體架構(gòu)

1.4.1 java運(yùn)行過(guò)程

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

2.類(lèi)加載:通過(guò)ClassLoader及其子類(lèi)來(lái)完成JVM的類(lèi)加載

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

1.4.2 jvm模型

由上面的圖可以看出,JVM虛擬機(jī)中主要是由三部分構(gòu)成,分別是類(lèi)加載子系統(tǒng)、運(yùn)行時(shí)數(shù)據(jù)區(qū)、執(zhí)行引擎。

類(lèi)加載子系統(tǒng)

Java虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從Class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類(lèi)型。

運(yùn)行時(shí)數(shù)據(jù)區(qū)

Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。

這些區(qū)域有各自的用途,以及創(chuàng)建和銷(xiāo)毀的時(shí)間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而一直存在,有些區(qū)域則是依賴用戶線程的啟動(dòng)和結(jié)束而建立和銷(xiāo)毀。

執(zhí)行引擎

執(zhí)行引擎用于執(zhí)行JVM字節(jié)碼指令,主要有兩種方式,分別是解釋執(zhí)行和編譯執(zhí)行,區(qū)別在于,解釋執(zhí)行是在執(zhí)行時(shí)翻譯成虛擬機(jī)指令執(zhí)行,而編譯執(zhí)行是在執(zhí)行之前先進(jìn)行編譯再執(zhí)行。

解釋執(zhí)行啟動(dòng)快,執(zhí)行效率低。編譯執(zhí)行,啟動(dòng)慢,執(zhí)行效率高。

垃圾回收器就是自動(dòng)管理運(yùn)行數(shù)據(jù)區(qū)的內(nèi)存,將無(wú)用的內(nèi)存占用進(jìn)行清除,釋放內(nèi)存資源。

本地方法庫(kù)、本地庫(kù)接口

在jdk的底層中,有一些實(shí)現(xiàn)是需要調(diào)用本地方法完成的(使用c或c++寫(xiě)的方法),就是通過(guò)本地庫(kù)接口調(diào)用完成的。比如:System.currentTimeMillis()方法。

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

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

2.1 測(cè)試案例

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 二進(jìn)制概覽

1)vscode打開(kāi)

2)class文件是一個(gè)二進(jìn)制文件,轉(zhuǎn)化后是16進(jìn)制展示,實(shí)際上class文件就是一張表,它由以下數(shù)據(jù)項(xiàng)構(gòu)成,這些數(shù)據(jù)項(xiàng)從頭到尾嚴(yán)格按照以下順序排列:

類(lèi)型 名稱(chēng) 數(shù)量 描述
u4 magic 1 魔數(shù)
u2 minor_version 1 次版本號(hào)
u2 major_version 1 主版本號(hào)
u2 constant_pool_count 1 常量個(gè)數(shù)
cp_info constant_pool constant_pool_count - 1 具體常量
u2 access_flags 1 訪問(wèn)標(biāo)志
u2 this_class 1 類(lèi)索引
u2 super_class 1 父類(lèi)索引
u2 interfaces_count 1 接口索引
u2 interfaces interfaces_count 具體接口
u2 fields_count 1 字段個(gè)數(shù)
field_info fields fields_count 具體字段
u2 methods_count 1 方法個(gè)數(shù)
method_info methods methods_count 具體方法
u2 attributes_count 1 屬性個(gè)數(shù)
attribute_info attributes attributes_count 具體屬性

3)圖示如下:

2.2.2 魔數(shù)與版本

1)魔數(shù):

CAFEBABE,咖啡寶寶,固定的。

2)版本號(hào):

34,換成10進(jìn)制就是52

jdk的版本標(biāo)記映射關(guān)系:

說(shuō)明編譯用的是jdk8,我們改成1.6,重新執(zhí)行 mvn clean compile ,再來(lái)查看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>

擴(kuò)展

在開(kāi)發(fā)中,經(jīng)常會(huì)遇到類(lèi)似Unsupported major.minor version 51.0的錯(cuò)誤,一般情況下都是JDK版本不匹配造成的。
雖然jdk代碼在執(zhí)行時(shí)基本上向下兼容,但是!開(kāi)發(fā)環(huán)境和服務(wù)器環(huán)境jdk最好一致,不要嘗試這個(gè)坑。

區(qū)分和理解兩個(gè)環(huán)境:編譯環(huán)境,運(yùn)行環(huán)境

2.2.3 常量池

再往下遵從相同的規(guī)律: 計(jì)數(shù)器(標(biāo)注后面有多少個(gè)) + 對(duì)應(yīng)個(gè)數(shù)的結(jié)構(gòu)體

我們以常量池為例:

1)位置

2)結(jié)構(gòu)說(shuō)明

常量池記錄了jvm內(nèi)的一堆常量信息,這部分由 【2個(gè)字節(jié)計(jì)數(shù)】 + 【n個(gè)cp_info結(jié)構(gòu)】組成

其中cp_info有多種類(lèi)型:

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


附:綠色代表指針,橙色代表直接類(lèi)型

3)案例

下面以String為例,String是一種引用類(lèi),它會(huì)指向一個(gè)utf8類(lèi)型來(lái)存儲(chǔ)真實(shí)的信息

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

javap -v ClassStruct.class

2.2.4 其他信息

1)說(shuō)明

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

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

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

2)注意事項(xiàng)

要看懂javap后的格式,明白這些格式,可以輕松看懂class結(jié)構(gòu)

類(lèi)型 標(biāo)識(shí)符 案例 說(shuō)明
數(shù)組 [ [Ljava.lang.String String數(shù)組
對(duì)象 L Lcom.test.Demo
基本類(lèi)型 大寫(xiě)字母開(kāi)頭 B=byte,I=int……

組合類(lèi)型

類(lèi)型 案例 說(shuō)明
類(lèi)里的屬性、字段、方法等 com.test.Demo.name:Ljava.lang.String 英文點(diǎn)號(hào)隔開(kāi)
標(biāo)識(shí)什么類(lèi)型 com.test.Demo.getName:()Ljava.lang.String 英文冒號(hào)隔開(kāi)
方法 (參數(shù)類(lèi)型)返回值類(lèi)型 英文括弧,后面是返回值類(lèi)型

3)實(shí)例分析

本文由傳智教育博學(xué)谷教研團(tuán)隊(duì)發(fā)布。

如果本文對(duì)您有幫助,歡迎關(guān)注點(diǎn)贊;如果您有任何建議也可留言評(píng)論私信,您的支持是我堅(jiān)持創(chuàng)作的動(dòng)力。

轉(zhuǎn)載請(qǐng)注明出處!

分享文章:JVM虛擬機(jī)我來(lái)了~~~
本文地址:http://www.chinadenli.net/article34/dsdihpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄品牌網(wǎng)站建設(shè)網(wǎng)站維護(hù)域名注冊(cè)關(guān)鍵詞優(yōu)化外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)