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

JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)

 更新時(shí)間:2021年06月18日 11:52:01   作者:知了一笑  
不論是在問題現(xiàn)場(chǎng)還是跳槽面試,我們面對(duì)JVM性能問題,依舊會(huì)束手無辭,它需要你對(duì)Java虛擬機(jī)的實(shí)現(xiàn)和優(yōu)化,有極為深刻的理解。所以我在這里整理了一下 JVM的知識(shí)點(diǎn)。今天說說虛擬機(jī)執(zhí)行引擎和垃圾回收,都是十足的干貨,請(qǐng)各位看官耐心批閱!

一、執(zhí)行引擎

應(yīng)用程序經(jīng)過編譯,轉(zhuǎn)換為字節(jié)碼文件,字節(jié)碼加載到內(nèi)存空間并不能直接在操作系統(tǒng)上執(zhí)行,執(zhí)行引擎作為Java虛擬機(jī)核心的組成部分,作用就是將字節(jié)碼指令解釋/編譯為對(duì)應(yīng)系統(tǒng)平臺(tái)上的本地機(jī)器指令。

解釋器:虛擬機(jī)啟動(dòng)時(shí)會(huì)根據(jù)預(yù)定義對(duì)字節(jié)碼采用逐行解釋的方式執(zhí)行,將每條字節(jié)碼文件中的內(nèi)容解釋為對(duì)應(yīng)系統(tǒng)平臺(tái)的本地機(jī)器指令執(zhí)行;

JIT編譯器:虛擬機(jī)將源代碼編譯成本地機(jī)器平臺(tái)相關(guān)的機(jī)器語言,并且尋找熱點(diǎn)高頻執(zhí)行的代碼將其放入元空間中,即元空間中存放的JIT緩存代碼;

垃圾回收:對(duì)于沒有任何引用的對(duì)象標(biāo)記為垃圾,會(huì)被回收釋放內(nèi)存空間。

二、垃圾對(duì)象標(biāo)記

1、引用計(jì)數(shù)法

每個(gè)對(duì)象保存一個(gè)整型引用計(jì)數(shù)器,用來記錄對(duì)象被引用的次數(shù),當(dāng)該對(duì)象被一個(gè)對(duì)象引用時(shí),計(jì)數(shù)器加1,當(dāng)失去一個(gè)引用時(shí),計(jì)數(shù)器減1;引用計(jì)數(shù)算法就是通過判斷對(duì)象的引用數(shù)量來決定對(duì)象是否可以被當(dāng)做垃圾對(duì)象回收掉。

雖然引用計(jì)數(shù)法效率高,但是當(dāng)兩個(gè)對(duì)象互相引用時(shí)會(huì)導(dǎo)致這兩個(gè)對(duì)象一直不會(huì)被回收,這是一個(gè)致命的缺陷。所以JVM并沒有采用該標(biāo)記算法。

2、可達(dá)性分析算法

可達(dá)性分析算法是基于對(duì)象到根對(duì)象的引用鏈?zhǔn)欠窨蛇_(dá)來判斷對(duì)象是否可以被回收;

運(yùn)行程序把所有的引用關(guān)系鏈看作一張圖,通過GC-Roots根對(duì)象對(duì)象集合作為起始點(diǎn),從每個(gè)根節(jié)點(diǎn)向下不斷搜索被根對(duì)象集合所連接的對(duì)象是否可達(dá),搜索路徑稱為引用鏈(Reference-Chain),如果對(duì)象到GC-Roots沒有任何引用鏈存在,則說明此對(duì)象是不可用的,

  • 虛擬機(jī)棧中引用的對(duì)象;
  • 元空間中類靜態(tài)屬性引用的對(duì)象;
  • 元空間中常量引用的對(duì)象;
  • 本地方法棧中Native方法引用的對(duì)象;

相對(duì)于引用計(jì)數(shù)法算法,可達(dá)性分析算法則避免了循環(huán)引用導(dǎo)致的問題,同樣具備執(zhí)行高效的特點(diǎn),也是JVM采用的標(biāo)記算法。

三、垃圾回收機(jī)制

1、標(biāo)記清除算法

標(biāo)記-清除算法分為標(biāo)記和清除兩個(gè)階段:

標(biāo)記階段:從根對(duì)象集合進(jìn)行掃描,對(duì)存活的對(duì)象對(duì)象標(biāo)記;清除階段:再次掃描發(fā)現(xiàn)未被標(biāo)記的對(duì)象并進(jìn)行回收;

該算法效率不高,進(jìn)行垃圾回收需要暫停應(yīng)用程序,同時(shí)會(huì)產(chǎn)生大量?jī)?nèi)存碎片,后續(xù)程序運(yùn)行過程中分配內(nèi)存占用較大的對(duì)象時(shí),會(huì)有連續(xù)內(nèi)存不夠情況,容易觸發(fā)再一次垃圾收集動(dòng)作。

2、標(biāo)記整理算法

標(biāo)記整理算法的標(biāo)記過程類似標(biāo)記清除算法,第一階段:標(biāo)記出垃圾對(duì)象;第二階段:讓所有存活的對(duì)象都向內(nèi)存區(qū)一端移動(dòng);第三階段:直接清理掉邊界端以外的內(nèi)存,類似于磁盤整理的過程;

該垃圾回收算法效率不高,對(duì)象移動(dòng)過程需要暫停應(yīng)用程序,適用于對(duì)象存活率高的場(chǎng)景(老年代)。

3、復(fù)制算法

復(fù)制算法將內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊,當(dāng)使用的這塊的內(nèi)存用完,就將還存活著的對(duì)象復(fù)制到另外一塊空閑內(nèi)存上,然后使用過的內(nèi)存空間一次清理。

該算法實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行效率高,但是內(nèi)存空間嚴(yán)重浪費(fèi),適用于對(duì)象存活率低的場(chǎng)景,比如新生代。

4、分代收集算法

當(dāng)前市場(chǎng)上幾乎所有的虛擬機(jī)都采用該回收算法,分代收集算法根據(jù)年輕代和老年代的各自特點(diǎn)采用不同的算法機(jī)制,不同內(nèi)存區(qū)域中對(duì)象生命周期也不同,因此對(duì)堆內(nèi)存不同區(qū)域采用不同的回收策略可以提高垃圾回收?qǐng)?zhí)行效率。通常情況新生代對(duì)象存活率低,回收頻繁,就采用復(fù)制算法;老年代存對(duì)象生命周期長(zhǎng),活率高,就用標(biāo)記清除算法或者標(biāo)記整理算法。

Java堆內(nèi)存一般可以分為新生代、老年代和永久代三個(gè)模塊,如下圖所示:

新生代

通常情況下,新創(chuàng)建的對(duì)象實(shí)例首先都是放在新生代空間中,所以追求快速的回收掉垃圾對(duì)象,一般情況下,新生代內(nèi)存按照8:1:1的比例分為一個(gè)eden區(qū)和兩個(gè)survivor(survivor0,survivor1)區(qū),對(duì)象實(shí)例大部分在Eden區(qū)中生成;

垃圾回收時(shí)先把eden區(qū)存活對(duì)象復(fù)制到S0區(qū),然后清空eden區(qū),當(dāng)S0區(qū)也滿時(shí),再將eden區(qū)和S0區(qū)存活對(duì)象復(fù)制到S1區(qū),然后清空eden和S0區(qū),之后交換S0區(qū)和S1區(qū)的角色,當(dāng)S1區(qū)無法存放eden區(qū)和S0區(qū)的存活對(duì)象時(shí),就將存活對(duì)象直接存移到老年代區(qū),當(dāng)老年代區(qū)也滿了,觸發(fā)一次FullGC,即新生代、老年代都進(jìn)行回收。

老年代

老年代區(qū)存放一些生命周期較長(zhǎng)的對(duì)象,對(duì)象實(shí)例在新生代中經(jīng)歷了多次垃圾回收仍然存活的對(duì)象,會(huì)被移動(dòng)到老年代區(qū)中。

四、源代碼地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

以上就是JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JVM執(zhí)行引擎和垃圾回收的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 簡(jiǎn)單講解Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法

    簡(jiǎn)單講解Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法

    這篇文章主要介紹了Android開發(fā)中觸摸和點(diǎn)擊事件的相關(guān)編程方法,包括事件偵聽器等安卓開發(fā)中常用的接口的基本使用方法,需要的朋友可以參考下
    2015-12-12
  • java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境

    java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境

    今天我將與大家分享一下我學(xué)JAVA WEB寫的一些小實(shí)例 ,我個(gè)人是不太喜歡書本上的晦澀的概念的,所以我花了更多的時(shí)間在一些應(yīng)用實(shí)例上,我覺得這樣的學(xué)習(xí)方式很適合我,由簡(jiǎn)到繁,由淺入深
    2015-12-12
  • 解決Maven多模塊編譯慢的問題

    解決Maven多模塊編譯慢的問題

    這篇文章主要介紹了Maven多模塊編譯慢的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 聊聊注解@Aspect的AOP實(shí)現(xiàn)操作

    聊聊注解@Aspect的AOP實(shí)現(xiàn)操作

    這篇文章主要介紹了聊聊注解@Aspect的AOP實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java實(shí)現(xiàn)根據(jù)模板自動(dòng)生成新的PPT

    Java實(shí)現(xiàn)根據(jù)模板自動(dòng)生成新的PPT

    這篇文章主要介紹了如何利用Java代碼自動(dòng)生成PPT,具體就是查詢數(shù)據(jù)庫(kù)數(shù)據(jù),然后根據(jù)模板文件(PPT),將數(shù)據(jù)庫(kù)數(shù)據(jù)與模板文件(PPT),進(jìn)行組合一下,生成新的PPT文件。感興趣的可以了解一下
    2022-02-02
  • java GUI編程之布局控制器(Layout)實(shí)例分析

    java GUI編程之布局控制器(Layout)實(shí)例分析

    這篇文章主要介紹了java GUI編程之布局控制器(Layout),結(jié)合實(shí)例形式分析了java GUI編程中布局控制器(Layout)具體功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟

    java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)html轉(zhuǎn)pdf方法的相關(guān)資料,要將HTML轉(zhuǎn)換成PDF,我們需要借助Java中的第三方庫(kù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Mybatis打印替換占位符后的完整Sql教程

    Mybatis打印替換占位符后的完整Sql教程

    這篇文章主要介紹了Mybatis打印替換占位符后的完整Sql教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • PowerJob的ProcessorLoader工作流程源碼解讀

    PowerJob的ProcessorLoader工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob的ProcessorLoader工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java三種循環(huán)求和方法

    Java三種循環(huán)求和方法

    本篇文章給大家介紹了Java三種循環(huán)求和的方法,大家在學(xué)程序的時(shí)候如果能用的到,參考下吧。
    2018-02-02

最新評(píng)論