亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JVM執(zhí)行引擎和垃圾回收要點總結

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

一、執(zhí)行引擎

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

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

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

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

二、垃圾對象標記

1、引用計數(shù)法

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

雖然引用計數(shù)法效率高,但是當兩個對象互相引用時會導致這兩個對象一直不會被回收,這是一個致命的缺陷。所以JVM并沒有采用該標記算法。

2、可達性分析算法

可達性分析算法是基于對象到根對象的引用鏈是否可達來判斷對象是否可以被回收;

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

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

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

三、垃圾回收機制

1、標記清除算法

標記-清除算法分為標記和清除兩個階段:

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

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

2、標記整理算法

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

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

3、復制算法

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

該算法實現(xiàn)簡單,運行效率高,但是內(nèi)存空間嚴重浪費,適用于對象存活率低的場景,比如新生代。

4、分代收集算法

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

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

新生代

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

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

老年代

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

四、源代碼地址

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

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

您可能感興趣的文章:

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    PowerJob的ProcessorLoader工作流程源碼解讀

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

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

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

最新評論