欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

新手入門(mén)Jvm--jvm概覽

 更新時(shí)間:2021年06月18日 16:52:14   作者:讓你跑39m哈哈  
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的

1. 什么是Jvm

JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。

引入Java語(yǔ)言虛擬機(jī)后,Java語(yǔ)言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語(yǔ)言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。

Java虛擬機(jī)有自己完善的硬件架構(gòu),如處理器、堆棧等,還具有相應(yīng)的指令系統(tǒng)。

Java虛擬機(jī)本質(zhì)上就是一個(gè)程序,當(dāng)它在命令行上啟動(dòng)的時(shí)候,就開(kāi)始執(zhí)行保存在某字節(jié)碼文件中的指令。Java語(yǔ)言的可移植性正是建立在Java虛擬機(jī)的基礎(chǔ)上。任何平臺(tái)只要裝有針對(duì)于該平臺(tái)的Java虛擬機(jī),字節(jié)碼文件(.class)就可以在該平臺(tái)上運(yùn)行。這就是“一次編譯,多次運(yùn)行”。

Java虛擬機(jī)不僅是一種跨平臺(tái)的軟件,而且是一種新的網(wǎng)絡(luò)計(jì)算平臺(tái)。該平臺(tái)包括許多相關(guān)的技術(shù),如符合開(kāi)放接口標(biāo)準(zhǔn)的各種API、優(yōu)化技術(shù)等。Java技術(shù)使同一種應(yīng)用可以運(yùn)行在不同的平臺(tái)上。Java平臺(tái)可分為兩部分,即Java虛擬機(jī)(Java virtual machine,JVM)和Java API類(lèi)庫(kù)

Java虛擬機(jī)主要分為五大模塊:

  • 類(lèi)裝載器子系統(tǒng)
  • 運(yùn)行時(shí)數(shù)據(jù)區(qū)
  • 執(zhí)行引擎
  • 本地方法接口
  • 垃圾收集模塊

2. Jvm組成

2.1 Jdk體系結(jié)構(gòu)

在這里插入圖片描述

2.2 Jvm體系結(jié)構(gòu)

在這里插入圖片描述 .

類(lèi)加載器線程共享區(qū)域 方法區(qū)堆 線程私有區(qū)域 虛擬機(jī)棧本地方法棧程序計(jì)數(shù)器

3. 類(lèi)加載機(jī)制

3.1 流程

加載 >> 驗(yàn)證 >> 準(zhǔn)備 >> 解析 >> 初始化 >> 使用 >> 卸載

  • 加載:在硬盤(pán)上查找并通過(guò)IO讀入字節(jié)碼文件,使用到類(lèi)時(shí)才會(huì)加載,例如調(diào)用類(lèi)的

main()方法,new對(duì)象等等,在加載階段會(huì)在內(nèi)存中生成一個(gè)代表這個(gè)類(lèi)的

java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類(lèi)的各種數(shù)據(jù)的訪問(wèn)入口

  • 驗(yàn)證:校驗(yàn)字節(jié)碼文件的正確性
  • 準(zhǔn)備:給類(lèi)的靜態(tài)變量分配內(nèi)存,并賦予默認(rèn)值
  • 解析:將符號(hào)引用替換為直接引用,該階段會(huì)把一些靜態(tài)方法(符號(hào)引用,比如main()方法)替換為指向數(shù)據(jù)所存內(nèi)存的指針或句柄等(直接引用),這是所謂的靜態(tài)鏈接過(guò)程(類(lèi)加載期間完成),動(dòng)態(tài)鏈接是在程序運(yùn)行期間完成的將符號(hào)引用替換為直接引用,下節(jié)課會(huì)講到動(dòng)態(tài)鏈接
  • 初始化:對(duì)類(lèi)的靜態(tài)變量初始化為指定的值,執(zhí)行靜態(tài)代碼塊

:類(lèi)被加載到方法區(qū)中后主要包含 運(yùn)行時(shí)常量池、類(lèi)型信息、字段信息、方法信息、類(lèi)加載器的引用、對(duì)應(yīng)class實(shí)例的引用等信息。類(lèi)加載器的引用:這個(gè)類(lèi)到類(lèi)加載器實(shí)例的引用對(duì)應(yīng)class實(shí)例的引用:類(lèi)加載器在加載類(lèi)信息放到方法區(qū)中后,會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的Class 類(lèi)型的對(duì)象實(shí)例放到堆(Heap)中, 作為開(kāi)發(fā)人員訪問(wèn)方法區(qū)中類(lèi)定義的入口和切入點(diǎn)。

3.2 類(lèi)加載器和雙親委派機(jī)制

上面的類(lèi)加載過(guò)程主要是通過(guò)類(lèi)加載器來(lái)實(shí)現(xiàn)的,Java里有如下幾種類(lèi)加載器

  • 引導(dǎo)類(lèi)加載器:負(fù)責(zé)加載支撐JVM運(yùn)行的位于JRE的lib目錄下的核心類(lèi)庫(kù),比如rt.jar、charsets.jar等
  • 擴(kuò)展類(lèi)加載器:負(fù)責(zé)加載支撐JVM運(yùn)行的位于JRE的lib目錄下的ext擴(kuò)展目錄中的JAR類(lèi)包
  • 應(yīng)用程序類(lèi)加載器:負(fù)責(zé)加載ClassPath路徑下的類(lèi)包,主要就是加載你自己寫(xiě)的那些類(lèi)
  • 自定義加載器:負(fù)責(zé)加載用戶自定義路徑下的類(lèi)包

3.3 類(lèi)加載器初始化過(guò)程

會(huì)創(chuàng)建JVM啟動(dòng)器實(shí)例sun.misc.Launcher。

sun.misc.Launcher初始化使用了單例模式設(shè)計(jì),保證一個(gè)JVM虛擬機(jī)內(nèi)只有一個(gè) sun.misc.Launcher實(shí)例。

在Launcher構(gòu)造方法內(nèi)部,其創(chuàng)建了兩個(gè)類(lèi)加載器,分別是 sun.misc.Launcher.ExtClassLoader(擴(kuò)展類(lèi)加載器)和sun.misc.Launcher.AppClassLoader(應(yīng)用類(lèi)加載器)。

JVM默認(rèn)使用Launcher的getClassLoader()方法返回的類(lèi)加載器AppClassLoader的實(shí)例加載我們的應(yīng)用程序。

3.4 雙親委派機(jī)制

JVM類(lèi)加載器是有親子層級(jí)結(jié)構(gòu)的,如下圖

在這里插入圖片描述

這里類(lèi)加載其實(shí)就有一個(gè)雙親委派機(jī)制,加載某個(gè)類(lèi)時(shí)會(huì)先委托父加載器尋找目標(biāo)類(lèi),找不到再委托上層父加載器加載,如果所有父加載器在自己的加載類(lèi)路徑下都找不到目標(biāo)類(lèi),則在自己的類(lèi)加載路徑中查找并載入目標(biāo)類(lèi)。

雙親委派機(jī)制說(shuō)簡(jiǎn)單點(diǎn)就是,先找父親加載,不行再由兒子自己加載

3.5 為什么要設(shè)計(jì)雙親委派機(jī)制?

  • 沙箱安全機(jī)制:自己寫(xiě)的java.lang.String.class類(lèi)不會(huì)被加載,這樣便可以防止核心API庫(kù)被隨意篡改
  • 避免類(lèi)的重復(fù)加載:當(dāng)父親已經(jīng)加載了該類(lèi)時(shí),就沒(méi)有必要子ClassLoader再加載一次,保證被加載類(lèi)的唯一性

3.6 全盤(pán)負(fù)責(zé)委托機(jī)制

“全盤(pán)負(fù)責(zé)”是指當(dāng)一個(gè)ClassLoder裝載一個(gè)類(lèi)時(shí),除非顯示的使用另外一個(gè)ClassLoder,該類(lèi)所依賴及引用的類(lèi)也由這個(gè)ClassLoder載入。

4. Jvm各區(qū)域串聯(lián)

在這里插入圖片描述

在這里插入圖片描述

5. 總結(jié)

看完本章,大概對(duì)Jvm和Jvm結(jié)構(gòu)有大概了解,下面將繼續(xù)深入Jvm,未完待續(xù)~!希望大家可以多多關(guān)注腳本之家的其他內(nèi)容!

相關(guān)文章

  • 分析設(shè)計(jì)模式之模板方法Java實(shí)現(xiàn)

    分析設(shè)計(jì)模式之模板方法Java實(shí)現(xiàn)

    所謂模板方法模式,就是一個(gè)對(duì)模板的應(yīng)用,就好比老師出試卷,每個(gè)人的試卷都是一樣的,這個(gè)原版試卷就是一個(gè)模板,可每個(gè)人寫(xiě)在試卷上的答案都是不一樣的,這就是模板方法模式。它的主要用途在于將不變的行為從子類(lèi)搬到超類(lèi),去除了子類(lèi)中的重復(fù)代碼
    2021-06-06
  • Mybatis中@Param的用法和作用詳解

    Mybatis中@Param的用法和作用詳解

    這篇文章主要介紹了Mybatis中@Param的用法和作用,在文中給大家補(bǔ)充了spring中@param和mybatis中@param使用區(qū)別,需要的朋友可以參考下
    2017-09-09
  • IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟

    IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟

    這篇文章主要介紹了IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 重新實(shí)現(xiàn)hashCode()方法

    重新實(shí)現(xiàn)hashCode()方法

    hashCode()是Java中的一個(gè)重要方法,用于計(jì)算對(duì)象的哈希碼。本文介紹了如何重新實(shí)現(xiàn)hashCode()方法,包括使用對(duì)象的屬性計(jì)算哈希碼、使用字符串拼接計(jì)算哈希碼、使用隨機(jī)數(shù)計(jì)算哈希碼等方法。同時(shí),還介紹了如何避免哈希沖突,提高哈希表的效率。
    2023-04-04
  • 深入理解SpringBoot中關(guān)于Mybatis使用方法

    深入理解SpringBoot中關(guān)于Mybatis使用方法

    這篇文章主要介紹了SpringBoot中關(guān)于Mybatis使用方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • Java編程實(shí)現(xiàn)A*算法完整代碼

    Java編程實(shí)現(xiàn)A*算法完整代碼

    這篇文章主要介紹了Java編程實(shí)現(xiàn)A*算法完整代碼,簡(jiǎn)單介紹了a星算法,然后分享了完整測(cè)試代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • Java8?Stream?collect(Collectors.toMap())的使用

    Java8?Stream?collect(Collectors.toMap())的使用

    這篇文章主要介紹了Java8?Stream?collect(Collectors.toMap())的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SpringSecurity實(shí)現(xiàn)自定義登錄接口的詳細(xì)過(guò)程

    SpringSecurity實(shí)現(xiàn)自定義登錄接口的詳細(xì)過(guò)程

    本文詳細(xì)介紹了如何使用SpringSecurity實(shí)現(xiàn)自定義登錄接口,文章還涉及了對(duì)用戶實(shí)體類(lèi)的增強(qiáng)以滿足詳細(xì)信息的需求,適合需要深入了解和實(shí)現(xiàn)SpringSecurity自定義登錄功能的開(kāi)發(fā)者,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • 解決Java包裝類(lèi)比較時(shí)遇到的問(wèn)題

    解決Java包裝類(lèi)比較時(shí)遇到的問(wèn)題

    所謂包裝類(lèi)的作用就是將原始數(shù)據(jù)類(lèi)型轉(zhuǎn)換成引用數(shù)據(jù)類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于在Java包裝類(lèi)比較時(shí)遇到的問(wèn)題的解決方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • redis分布式鎖解決表單重復(fù)提交的問(wèn)題

    redis分布式鎖解決表單重復(fù)提交的問(wèn)題

    在系統(tǒng)中,有些接口如果重復(fù)提交,可能會(huì)造成臟數(shù)據(jù)或者其他的嚴(yán)重的問(wèn)題,所以我們一般會(huì)對(duì)與數(shù)據(jù)庫(kù)有交互的接口進(jìn)行重復(fù)處理。本文就詳細(xì)的介紹一下redis分布式鎖解決表單重復(fù)提交,感興趣的可以了解一下
    2021-11-11

最新評(píng)論