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

詳解JVM的分代模型

 更新時(shí)間:2020年10月15日 14:19:33   作者:H.U.C-王子  
這篇文章主要介紹了JVM的分代模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機(jī)相關(guān)知識(shí),感興趣的朋友可以了解下

前言

上篇文章我們一起對(duì)jvm的內(nèi)存模型有了比較清晰的認(rèn)識(shí),小伙伴們可以參考JVM內(nèi)存模型不再是秘密這篇文章做一個(gè)復(fù)習(xí)。

本篇文章我們將針對(duì)jvm堆內(nèi)存的分代模型做一個(gè)詳細(xì)的解析,和大家一起輕松理解jvm的分代模型。

相信看過其他文章的小伙伴們可能都知道,jvm的分代模型包括:年輕代、老年代、永久代。

那么它們分別代表著什么角色呢?我們先來看一段代碼

public class Main {
  public static void main(String[] args) {
    while (true){
      load();
    }
  }

  public static void load(){
    SysUser sysUser = new SysUser();
    sysUser.setAvatar("1");
  }

}

這段代碼本身沒有什么特殊的含義,主要是理解jvm的運(yùn)行機(jī)制。

首先一旦執(zhí)行main()方法,就會(huì)把main()方法的棧幀壓入main線程的虛擬機(jī)棧,然后調(diào)用load()方法后,又會(huì)把load()方法的棧幀壓入虛擬機(jī)棧。

接著在執(zhí)行l(wèi)oad()方法時(shí),會(huì)在java堆內(nèi)存中創(chuàng)建一個(gè)SysUser對(duì)象實(shí)例,而棧幀中會(huì)有sysUser局部變量引用堆內(nèi)存中的SysUser對(duì)象實(shí)例。

如下圖:

到這里上篇文章都講解過,相信大家都能看懂。

變量的存活時(shí)間

現(xiàn)在我們思考一下會(huì)發(fā)現(xiàn),這個(gè)SysUser對(duì)象實(shí)際上屬于一個(gè)短暫存活的對(duì)象,因?yàn)樵趌oad()方法執(zhí)行完畢后,load()方法的棧幀就會(huì)出棧。

而一旦出棧,就沒有了sysUser這個(gè)局部變量來引用SysUser這個(gè)對(duì)象的實(shí)例。

所以,其實(shí)這個(gè)SysUser對(duì)象已經(jīng)沒有用了,但是它還在占用著堆內(nèi)存的空間,那么對(duì)于這種沒有引用的對(duì)象實(shí)例jvm是如何處理的呢?

這就要說到j(luò)vm的垃圾回收機(jī)制了,jvm本身是有垃圾回收機(jī)制的,它是一個(gè)后臺(tái)線程,會(huì)把沒有人引用的SysUser對(duì)象實(shí)例給回收掉,不斷的釋放內(nèi)存空間。

所以這個(gè)SysUser對(duì)象實(shí)例是一個(gè)存活時(shí)間很短的對(duì)象,可能在執(zhí)行l(wèi)oad()方法的時(shí)候被創(chuàng)建出來,執(zhí)行之后就被垃圾回收掉了。

而這種對(duì)象在我們平時(shí)的開發(fā)中是很常見的,占絕大多數(shù)比例。

現(xiàn)在我們將上邊的代碼改造一下:

public class Main {
  private static SysUser sysUser = new SysUser();
  public static void main(String[] args) {
    while (true){
      load();
    }
  }

  public static void load(){
    sysUser.setAvatar("1");
  }
}

其實(shí)就是把局部變量sysUser變成了靜態(tài)變量,這樣修改后,sysUser不在作為局部變量保存在棧中,而是和class類文件一起保存在方法區(qū)中,這樣SysUser對(duì)象實(shí)例就會(huì)一直被這個(gè)靜態(tài)變量引用,所以不會(huì)被垃圾回收,一直保存在堆內(nèi)存中。如下圖:

分代模型

接下來我們進(jìn)入核心內(nèi)容,就是jvm的分代模型了。

上文中我們發(fā)現(xiàn),根據(jù)我們的編碼方式的不同,采用不同的方式創(chuàng)建和使用對(duì)象,對(duì)象的存活時(shí)間是不同的。

所以jvm將內(nèi)存區(qū)分為兩個(gè)區(qū)域:年輕代和老年代。

年輕代就是我們的第一種局部變量的示例,創(chuàng)建和使用完畢后會(huì)被垃圾回收掉。

老年代就是第二種靜態(tài)變量的示例,創(chuàng)建后需要長期在堆內(nèi)存中存活。

相信到這里大家就應(yīng)該理解了什么樣的對(duì)象是短期存活的對(duì)象,什么樣的對(duì)象是長期存活的對(duì)象,那么它們是如何分別存在年輕代和老年代中的呢?為什么要這么區(qū)分呢?

其實(shí)這與垃圾回收機(jī)制是密不可分的。

對(duì)于年輕代里的對(duì)象,他們的特點(diǎn)是創(chuàng)建后很快就會(huì)被回收,而對(duì)于老年代里的對(duì)象,他們的特點(diǎn)是需要長期存活,所以這兩種對(duì)象是不能用一種垃圾回收算法進(jìn)行回收的,所以需要區(qū)分成兩個(gè)。

對(duì)于長期存在的靜態(tài)變量sysUser,其實(shí)剛開始的時(shí)候也是在年輕代的,那它是什么時(shí)候進(jìn)入老年代的呢?我們下文會(huì)講解這個(gè)問題。

那永久代又是什么呢?其實(shí)永久代就是我們說的jvm的方法區(qū),用于存放一下類信息的,這部分之后的文章涉及到會(huì)詳解,現(xiàn)在理解到這就可以了。

新生代的垃圾回收

前文我們了解了,當(dāng)load方法執(zhí)行完畢出棧后,里面的局部變量sysUser就沒了,堆內(nèi)存中的SysUser對(duì)象就沒有引用了,所以會(huì)被垃圾回收掉。

那么問題來了,是沒有引用后就會(huì)立即發(fā)生垃圾回收,回收掉沒有被引用的對(duì)象實(shí)例嗎?

其實(shí)不是這樣的,垃圾回收是有觸發(fā)條件的。

有一個(gè)比較常見的場(chǎng)景是這樣的,假設(shè)我們的代碼中創(chuàng)建了大量的對(duì)象,導(dǎo)致堆內(nèi)存中囤積了大量的對(duì)象,然后這些對(duì)象現(xiàn)在都沒有人引用了。

這個(gè)時(shí)候,如果新生代預(yù)先分配的內(nèi)存空間被占滿了,那么我們的代碼此時(shí)要新創(chuàng)建一個(gè)對(duì)象的時(shí)候,發(fā)現(xiàn)新生代空間滿了,怎么辦?

這個(gè)時(shí)候就會(huì)觸發(fā)一次新生代的垃圾回收,也稱為“Minor GC”或"Young GC",它會(huì)嘗試把新生代中沒有人引用的對(duì)象給回收掉,釋放空間。

下圖表達(dá)了這一過程:

長期存活的對(duì)象什么時(shí)候進(jìn)入老年代

接下來我們談?wù)撘粋€(gè)話題,靜態(tài)變量引用的長期存活的對(duì)象是什么時(shí)候進(jìn)入老年代的。

上文我們了解到,新生代的對(duì)象會(huì)經(jīng)歷一次次的垃圾回收,而被靜態(tài)變量引用的對(duì)象因?yàn)橐恢北灰茫砸恢辈粫?huì)被回收,所以此時(shí)jvm就有了一條規(guī)定。

如果新生代中的對(duì)象,在經(jīng)歷了15次垃圾回收后,依然堅(jiān)挺的存活著,那就證明它是個(gè)"老年人"了,然后它會(huì)被轉(zhuǎn)移到老年代中。

老年代就是存放這些年齡比較大的對(duì)象的。

那么老年代中的對(duì)象會(huì)被垃圾回收嗎?

答案是肯定的,因?yàn)槔夏甏锏膶?duì)象隨著代碼的運(yùn)行,也是可以不再被任何人引用的,就需要垃圾回收了。

或者說,隨著越來越多的對(duì)象進(jìn)入老年代,老年代的內(nèi)存也會(huì)被占滿,所以一定是要對(duì)老年代進(jìn)行垃圾回收的。

我們暫時(shí)不用考慮具體是怎么回收的,這個(gè)內(nèi)容在之后的文章中我們會(huì)有詳細(xì)的解析。

總結(jié)

今天就給大家準(zhǔn)備了這么多內(nèi)容,可能有些小伙伴覺得還沒看夠,這些內(nèi)容都比較簡(jiǎn)單,我已經(jīng)會(huì)了,有沒有更深入的東西呢?

別急,學(xué)習(xí)是循序漸進(jìn)的事情,王子是想要用最簡(jiǎn)單的大白話來和小伙伴們一起討論jvm的原理的,同時(shí)也想找一些案例來和大家一起探討,印象會(huì)更深刻。

所以今天小伙伴們了解到這里就可以了,讓我們?cè)诤罄m(xù)的文章中不見不散,深入討論些更深層的內(nèi)容吧。

以上就是詳解JVM的分代模型的詳細(xì)內(nèi)容,更多關(guān)于JVM 分代模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中OGNL表達(dá)式語言的使用詳解

    Java中OGNL表達(dá)式語言的使用詳解

    本文介紹了OGNL(ObjectGraphNavigationLanguage)表達(dá)式語言,這是一種用于Java語言的對(duì)象圖導(dǎo)航和操作的表達(dá)式語言,它支持訪問對(duì)象屬性、調(diào)用對(duì)象方法、執(zhí)行算術(shù)和邏輯運(yùn)算,以及處理集合和數(shù)組等操作,OGNL的語法簡(jiǎn)潔明了
    2024-12-12
  • 使用JavaSE來模擬斗地主

    使用JavaSE來模擬斗地主

    這篇文章主要介紹了使用JavaSE來模擬斗地主,對(duì)棋牌游戲有研究的同學(xué)可以參考一下
    2021-04-04
  • 如何通過??低曉O(shè)備網(wǎng)絡(luò)SDK進(jìn)行Java二次開發(fā)攝像頭車牌識(shí)別詳解

    如何通過海康威視設(shè)備網(wǎng)絡(luò)SDK進(jìn)行Java二次開發(fā)攝像頭車牌識(shí)別詳解

    這篇文章主要介紹了如何通過??低曉O(shè)備網(wǎng)絡(luò)SDK進(jìn)行Java二次開發(fā)攝像頭車牌識(shí)別的相關(guān)資料,描述了如何使用??低曉O(shè)備網(wǎng)絡(luò)SDK進(jìn)行車牌識(shí)別和圖片抓拍的開發(fā)流程,包括遇到的問題及其解決辦法,需要的朋友可以參考下
    2025-02-02
  • 關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化

    關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化

    大家好,本篇文章主要講的是關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Spring Boot 校驗(yàn)用戶上傳的圖片文件(兩種方式)

    Spring Boot 校驗(yàn)用戶上傳的圖片文件(兩種方式)

    圖片上傳是現(xiàn)代應(yīng)用中非常常見的一種功能,也是風(fēng)險(xiǎn)比較高的一個(gè)地方,惡意用戶可能會(huì)上傳一些病毒、木馬,本文給大家介紹兩種對(duì)圖片文件進(jìn)行校驗(yàn)的方法,感興趣的朋友一起看看吧
    2023-11-11
  • spring cglib 與 jdk 動(dòng)態(tài)代理

    spring cglib 與 jdk 動(dòng)態(tài)代理

    本篇文章主要介紹了spring cglib與jdk動(dòng)態(tài)代理的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-05-05
  • Idea里github的圖形化操作配置方法

    Idea里github的圖形化操作配置方法

    這篇文章主要介紹了Idea里github的圖形化操作配置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java攔截器和過濾器的區(qū)別分析

    Java攔截器和過濾器的區(qū)別分析

    今天帶大家分析java攔截器和過濾器的區(qū)別,文中有非常詳細(xì)的解釋說明,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java排序?qū)崿F(xiàn)的心得分享

    Java排序?qū)崿F(xiàn)的心得分享

    這篇文章主要介紹了Java排序?qū)崿F(xiàn)的心得,有需要的朋友可以參考一下
    2014-01-01
  • Simple JSON開發(fā)指南

    Simple JSON開發(fā)指南

    注意:JSONPauser不是線程安全的,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

开封市| 米脂县| 黄陵县| 金山区| 上饶市| 盈江县| 河间市| 广宗县| 故城县| 称多县| 渝北区| 万年县| 潍坊市| 逊克县| 固阳县| 平安县| 灵台县| 云龙县| 丹凤县| 宜良县| 水城县| 沛县| 宣武区| 沙湾县| 监利县| 项城市| 鹤岗市| 从江县| 固阳县| 仁寿县| 奉贤区| 云南省| 锡林郭勒盟| 中阳县| 乃东县| 二连浩特市| 固安县| 孟津县| 琼海市| 汽车| 曲靖市|