欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請(qǐng)碼778899分享:簡(jiǎn)單了解 JVM

柚子快報(bào)邀請(qǐng)碼778899分享:簡(jiǎn)單了解 JVM

http://yzkb.51969.com/

?

目錄

?

?什么是JVM

??JVM的運(yùn)行流程

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

?虛擬機(jī)棧

?本地方法棧

?堆

?程序計(jì)數(shù)器

?方法區(qū)/元數(shù)據(jù)區(qū)

?

?類加載的過程

?

?雙親委派模型

???垃圾回收機(jī)制

?什么是JVM

JVM 是 Java Virtual Machine 的簡(jiǎn)稱,意為 Java虛擬機(jī)。 虛擬機(jī)是指通過軟件模擬的具有完整硬件功能的、運(yùn)行在一個(gè)完全隔離的環(huán)境中的完整計(jì)算機(jī)系統(tǒng)(如:JVM、VMwave、Virtual Box)。 ?JVM 和其他兩個(gè)虛擬機(jī)的區(qū)別是: VMwave與VirtualBox是通過軟件模擬物理CPU的指令集,物理系統(tǒng)中會(huì)有很多的寄存器,而 JVM則是通過軟件模擬Java字節(jié)碼的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都進(jìn)行了裁剪。?

??JVM的運(yùn)行流程

JVM 是 Java 運(yùn)行的基礎(chǔ),也是實(shí)現(xiàn)一次編譯到處執(zhí)行的關(guān)鍵,那么 JVM 是如何執(zhí)行的呢?

我們知道程序在執(zhí)行之前先要把java代碼轉(zhuǎn)換成字節(jié)碼(class文件),而 JVM 首先需要把字節(jié)碼通過類加載器(ClassLoader)把文件加載到內(nèi)存中的運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area) ,而字節(jié)碼文件是 JVM 的一套指令集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器執(zhí)行引擎(Execution Engine)將字節(jié)碼翻譯成底層系統(tǒng)指令再交由CPU去執(zhí)行,而這個(gè)過程中需要調(diào)用其他語言的本地庫接口(Native Interface)來實(shí)現(xiàn)整個(gè)程序的功能,這就是這4個(gè)主要組成部分的職責(zé)與功能。

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

從上圖我們可以發(fā)現(xiàn)運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分成5個(gè)部分,接下來我們就來看看他的內(nèi)存布局。

?虛擬機(jī)棧

虛擬機(jī)棧是給 Java 代碼使用的棧,每個(gè)線程都會(huì)有一個(gè),虛擬機(jī)棧描述的是 Java 方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息:

①. 局部變量表: 存放了編譯器可知的各種基本數(shù)據(jù)類型(8大基本數(shù)據(jù)類型)、對(duì)象引用。局部變量表 所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在棧幀中分配多大的局部變量空間是完全確定的,在執(zhí)行期間不會(huì)改變局部變量表大小。簡(jiǎn)單來說就是存放方法參數(shù)和局部變量。

②. 操作棧:每個(gè)方法會(huì)生成一個(gè)先進(jìn)后出的操作棧。

③. 動(dòng)態(tài)鏈接:指向運(yùn)行時(shí)常量池的方法引用。

④. 方法返回地址:PC 寄存器的地址。

?本地方法棧

Native Method Stack 中 Native 就表示?JVM 內(nèi)部 C++ 寫的代碼,就是給調(diào)用 Native 方法( JVM 內(nèi)部的方法)準(zhǔn)備的??臻g。

?堆

整個(gè) JVM 中最大的區(qū)域,所有 new 出來的對(duì)象(類的普通成員變量)都是在堆上。

?程序計(jì)數(shù)器

程序計(jì)數(shù)器是一塊比較小的內(nèi)存空間,記錄當(dāng)前線程執(zhí)行到哪個(gè)指令,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。 如果當(dāng)前線程正在執(zhí)行的是一個(gè) Java 方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是一個(gè) Native 方法,這個(gè)計(jì)數(shù)器值為空。

?方法區(qū)/元數(shù)據(jù)區(qū)

元數(shù)據(jù)區(qū)是用來存儲(chǔ)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)的。

注:虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器都是線程私有的(一個(gè)線程有一個(gè)),堆、元數(shù)據(jù)區(qū)是線程公有的(一個(gè)進(jìn)程里的所有線程共用一個(gè))。

?

?類加載的過程

Java類加載是將 .class 文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、解析和初始化的過程。類加載來說總共分為以下幾個(gè)步驟:

?.?加載:把 .class 文件找到,讀取文件內(nèi)容

?.?連接:

????????①. 驗(yàn)證:根據(jù) JVM 規(guī)范,檢查 .class 文件是否符合規(guī)范

????????②. 準(zhǔn)備:給類對(duì)象分配內(nèi)存空間,設(shè)置初始值(基本數(shù)據(jù)類型設(shè)為為 0,引用數(shù)據(jù)類型設(shè)為 null)

????????③. 解析:將常量池內(nèi)的符號(hào)引用替換為直接引用的過程,也就是初始化常量的過程。(字符串常量有一塊內(nèi)存空間存字符串的實(shí)際內(nèi)容,還有一個(gè)引用保存這塊空間的起始地址,類加載前字符串常量存儲(chǔ)在 .class 文件中(還沒有內(nèi)存地址),此時(shí)這個(gè)引用記錄的是字符串常量在文件中的”偏移量“(符號(hào)引用),在類加載后字符串常量才放到內(nèi)存里(有了內(nèi)存地址),才會(huì)將”偏移量“替換成內(nèi)存地址(直接引用))

?. 初始化:

真正對(duì)類對(duì)象里的內(nèi)容進(jìn)行加載,加載父類、執(zhí)行靜態(tài)代碼塊

注:java 程序運(yùn)行后不會(huì)把所有類一次性都加載,而是需要用到哪個(gè)再加載哪個(gè)

?

?雙親委派模型

類加載描述的是找到 .class 文件讀取內(nèi)容的過程,而雙親委派模型描述的就是加載、找 .class文件的基本過程。了解雙親委派模型前,我們得先了解下 JVM 默認(rèn)提供的三種類加載器:?.?BootstrapClassLoader:負(fù)責(zé)加載標(biāo)準(zhǔn)庫中的類(java 規(guī)范要求提供的類,無論哪種 JVM 都會(huì)提供)

?.?ExtensionClassLoader:負(fù)責(zé)加載 JVM 擴(kuò)展庫中的類(規(guī)范之外,由 JVM 廠商提供的擴(kuò)展功能)

?.?ApplicationClassLoader:負(fù)責(zé)加載用戶提供的第三方庫/用戶項(xiàng)目代碼中的類?

這三個(gè)加載器彼此存在“父子類”的關(guān)系, BootstrapClassLoader?相當(dāng)于?ExtensionClassLoder?的父加載器,ExtensionClassLoder?相當(dāng)于?ApplicationClassLoder的父加載器。

雙親委派模型就是單加載一個(gè)類時(shí),首先從 ApplicationClassLoader 開始,但?ApplicationClassLoader 會(huì)把加載任務(wù)交給父加載器?ExtensionClassLoader , ExtensionClassLoader 又會(huì)把加載任務(wù)交給父加載器?BootstrapClassLoader ,BootstrapClassLoader 沒有父加載器才開始搜索標(biāo)準(zhǔn)庫目錄的類,找到了就加載,沒找到就交給子加載器?ExtensionClassLoader,ExtensionClassLoader 搜索擴(kuò)展庫的目錄,找到了就加載,沒找到就交給子加載器 ApplicationClassLoader,ApplicationClassLoader 搜索用戶項(xiàng)目相關(guān)目錄,找到了就加載,沒找到就拋出異常。

注:雙親委派模型的加載順序確保了 BootstrapClassLoader 先加載,ApplicationClassLoader 后加載,可以避免因用戶自己寫的類導(dǎo)致 JVM 已有代碼的混亂。

???垃圾回收機(jī)制

垃圾回收機(jī)制即 GC 主要是對(duì)堆進(jìn)行釋放的,是以對(duì)象為單位進(jìn)行回收的,因此也叫死亡對(duì)象的回收。

要想回收垃圾,首先得判斷誰是垃圾,常見的判斷是否為垃圾的方法有兩種:

?.引用計(jì)數(shù)

給每個(gè)對(duì)象都分配一個(gè)計(jì)數(shù)器,有引用指向它,計(jì)數(shù)器加一;有指向它的引用銷毀,計(jì)數(shù)器減一。

顯然這個(gè)方法簡(jiǎn)單有效,但還是存在缺點(diǎn):內(nèi)存浪費(fèi)的多且可能存在循環(huán)引用(a 對(duì)象的屬性指向 b,b 對(duì)象的屬性指向 a,當(dāng) a 和 b 銷毀時(shí),a 和 b 的引用計(jì)數(shù)仍為 1)的問題。

?.可達(dá)性分析

java 里的對(duì)象都是通過引用指向來訪問的,通過遍歷所有對(duì)象的引用指向就可以判斷出某個(gè)對(duì)象可達(dá)不可達(dá),java 的做法就是通過可達(dá)性分析。

確認(rèn)了哪個(gè)對(duì)象是垃圾就可以對(duì)垃圾進(jìn)行回收,常見的回收垃圾的做法有:

?.標(biāo)記清除

基本概念:標(biāo)記清除算法將垃圾回收分為兩個(gè)階段:標(biāo)記階段和清除階段。在標(biāo)記階段,它從根節(jié)點(diǎn)開始遍歷,標(biāo)記所有可達(dá)的對(duì)象。未被標(biāo)記的對(duì)象被視為垃圾,這些對(duì)象在清除階段被回收。

優(yōu)點(diǎn):標(biāo)記清除算法實(shí)現(xiàn)簡(jiǎn)單,不需要移動(dòng)存活對(duì)象。缺點(diǎn):標(biāo)記清除算法執(zhí)行效率較低,且清除后容易產(chǎn)生大量不連續(xù)的內(nèi)存碎片,這可能導(dǎo)致后續(xù)對(duì)象分配時(shí)找不到足夠的連續(xù)內(nèi)存空間而提前觸發(fā)垃圾回收。

?.復(fù)制算法

基本概念:復(fù)制算法將內(nèi)存分為兩塊,每次只使用其中一塊。當(dāng)一塊內(nèi)存用完時(shí),將還存活的對(duì)象復(fù)制到另一塊上,然后清理掉已使用的內(nèi)存。

優(yōu)點(diǎn):由于只處理其中一塊內(nèi)存區(qū)域,復(fù)制算法運(yùn)行速度較快,且不會(huì)產(chǎn)生內(nèi)存碎片。

缺點(diǎn):復(fù)制算法需要兩倍的內(nèi)存空間,代價(jià)較高。同時(shí),如果對(duì)象的生命周期較長,這種復(fù)制操作會(huì)導(dǎo)致效率低下。

?.標(biāo)記整理

基本概念:標(biāo)記整理算法結(jié)合了標(biāo)記清除和復(fù)制算法的優(yōu)點(diǎn)。在標(biāo)記階段后,將所有存活對(duì)象壓縮到內(nèi)存的一端,然后清理邊界以外的內(nèi)存。

優(yōu)點(diǎn):標(biāo)記整理算法避免了標(biāo)記清除算法的碎片問題,也不需要復(fù)制算法那么多的內(nèi)存空間。缺點(diǎn):標(biāo)記整理算法實(shí)現(xiàn)較為復(fù)雜,且移動(dòng)對(duì)象的過程會(huì)產(chǎn)生額外的開銷。

?.分代回收

基本概念:分代收集算法基于這樣一個(gè)事實(shí):大部分對(duì)象會(huì)在年輕時(shí)死亡。它將堆內(nèi)存分為新生代和老年代,不同年代采用不同的回收算法。新 new 出來的對(duì)象在伊甸區(qū),熬過一輪 GC 就通過復(fù)制算法來到了幸存區(qū),幸存也要經(jīng)過周期性的 GC 考驗(yàn),如果通過考驗(yàn)就進(jìn)入另一個(gè)幸存區(qū),沒通過就釋放掉,當(dāng)一個(gè)對(duì)象在兩個(gè)幸存區(qū)來回拷貝很多次了后就進(jìn)入老年區(qū),老年區(qū)偶而也要經(jīng)歷 GC 的考驗(yàn),如果沒通過就通過標(biāo)記整理算法釋放掉。

優(yōu)點(diǎn):分代收集算法通過將內(nèi)存分區(qū),可以更高效地回收垃圾,特別是針對(duì)新生代中大量短命的對(duì)象。缺點(diǎn):分代收集算法設(shè)計(jì)相對(duì)復(fù)雜,需要根據(jù)不同代的特點(diǎn)選擇合適的回收算法。

注:JVM 就是基于分代回收算法回收垃圾的。

柚子快報(bào)邀請(qǐng)碼778899分享:簡(jiǎn)單了解 JVM

http://yzkb.51969.com/

好文推薦

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19555376.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄