最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、執(zhí)行引擎

應(yīng)用程序經(jīng)過(guò)編譯,轉(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ī)器語(yǔ)言,并且尋找熱點(diǎn)高頻執(zhí)行的代碼將其放入元空間中,即元空間中存放的JIT緩存代碼;

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

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

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

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

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

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

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

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

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

相對(duì)于引用計(jì)數(shù)法算法,可達(dá)性分析算法則避免了循環(huán)引用導(dǎo)致的問(wèn)題,同樣具備執(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)行過(guò)程中分配內(nèi)存占用較大的對(duì)象時(shí),會(huì)有連續(xù)內(nèi)存不夠情況,容易觸發(fā)再一次垃圾收集動(dòng)作。

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

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

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

3、復(fù)制算法

復(fù)制算法將內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊,當(dāng)使用的這塊的內(nèi)存用完,就將還存活著的對(duì)象復(fù)制到另外一塊空閑內(nèi)存上,然后使用過(guò)的內(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ū)無(wú)法存放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)文章

  • Java異常類型及處理詳情

    Java異常類型及處理詳情

    這篇文章主要介紹了Java異常類型及處理, 異常指的是程序在執(zhí)行過(guò)程中,出現(xiàn)了非正常情況,導(dǎo)致了java的jvm停止。感興趣的小伙伴就和小編一起來(lái)學(xué)習(xí)下面文章的具體內(nèi)容吧
    2021-09-09
  • Java設(shè)計(jì)模式七大原則之合成復(fù)用原則詳解

    Java設(shè)計(jì)模式七大原則之合成復(fù)用原則詳解

    合成復(fù)用原則(Composite Reuse Principle),即盡量使用組合/聚合的方式,而不是使用繼承。本文將為大家具體介紹一下Java設(shè)計(jì)模式七大原則之一的合成復(fù)用原則,需要的可以參考一下
    2022-02-02
  • 一文詳解Java方法重載與遞歸應(yīng)用

    一文詳解Java方法重載與遞歸應(yīng)用

    方法重載 允許在同一個(gè)類中定義多個(gè)具有相同名稱的方法,但 參數(shù)列表 必須不同,遞歸 是一種讓函數(shù)調(diào)用自身的技術(shù),它提供了一種將復(fù)雜問(wèn)題分解為簡(jiǎn)單問(wèn)題的方法,這樣更容易解決,本文詳細(xì)介紹了Java方法重載與遞歸應(yīng)用,需要的朋友可以參考下
    2024-02-02
  • IDEA工程運(yùn)行時(shí)總是報(bào)xx程序包不存在實(shí)際上包已導(dǎo)入(問(wèn)題分析及解決方案)

    IDEA工程運(yùn)行時(shí)總是報(bào)xx程序包不存在實(shí)際上包已導(dǎo)入(問(wèn)題分析及解決方案)

    這篇文章主要介紹了IDEA工程運(yùn)行時(shí),總是報(bào)xx程序包不存在,實(shí)際上包已導(dǎo)入,本文給大家分享問(wèn)題分析及解決方案,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-08-08
  • spring?java?動(dòng)態(tài)獲取consul?K/V的方法

    spring?java?動(dòng)態(tài)獲取consul?K/V的方法

    這篇文章主要介紹了spring?java?動(dòng)態(tài)獲取consul?K/V的相關(guān)資料,主要包括springConsul配置kv路徑以及自動(dòng)注入consulKV到服務(wù)中,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java的優(yōu)先隊(duì)列PriorityQueue原理及實(shí)例分析

    Java的優(yōu)先隊(duì)列PriorityQueue原理及實(shí)例分析

    這篇文章主要介紹了Java的優(yōu)先隊(duì)列PriorityQueue原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用

    SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用

    本篇向小伙伴介紹springboot配置文件的配置,已經(jīng)全局配置參數(shù)如何使用的。需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-01-01
  • Java 在生活中的 10 大應(yīng)用

    Java 在生活中的 10 大應(yīng)用

    這篇文章主要給大家分享Java 在生活中的 10 大應(yīng)用,桌面圖形用戶界面、移動(dòng)應(yīng)用、人工智能、網(wǎng)絡(luò)應(yīng)用程序、大數(shù)據(jù)技術(shù)、游戲應(yīng)用、商業(yè)應(yīng)用、嵌入式系統(tǒng)、云應(yīng)用、科學(xué)應(yīng)用,下文來(lái)看具體應(yīng)用介紹,需要的朋友可以參考一下
    2021-11-11
  • Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn)

    Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Security 自定義短信登錄認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • springboot如何關(guān)掉tomcat容器

    springboot如何關(guān)掉tomcat容器

    這篇文章主要介紹了springboot如何關(guān)掉tomcat容器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

武邑县| 延津县| 台东县| 美姑县| 习水县| 丰镇市| 平定县| 车险| 大名县| 天气| 常熟市| 逊克县| 开江县| 合江县| 共和县| 南川市| 卫辉市| 宜州市| 民县| 定西市| 波密县| 永济市| 察雅县| 衡山县| 绥江县| 荥阳市| 浪卡子县| 芦溪县| 台山市| 天水市| 商河县| 军事| 竹山县| 额尔古纳市| 灵寿县| 孟连| 澄城县| 景谷| 灯塔市| 镇宁| 泾源县|