日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

了解JVM运行时的内存分配

發(fā)布時(shí)間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 了解JVM运行时的内存分配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

上文中,在介紹運(yùn)行時(shí)數(shù)據(jù)區(qū)域中的 JAVA 堆時(shí),提到了 JVM 中的堆,一般分為三大部分:新生代、老年代、永久代,本文將進(jìn)一步了解運(yùn)行時(shí)的內(nèi)存分配情況。

正文

1.新生代
主要用來存放新生(new)的對(duì)象。一般占據(jù)堆的 1/3 空間。由于頻繁創(chuàng)建對(duì)象,所以新生代會(huì)頻繁的觸發(fā) MinorGC 進(jìn)行垃圾回收。

新生代又分為 Eden(伊甸園)、SurvivorFrom、SurvivorTo三個(gè)區(qū)。

  • Eden區(qū):Java新對(duì)象的出生地(如果新創(chuàng)建的對(duì)象占用內(nèi)存很大,則直接分配到老年代)。
  • SurvivorTo:保留了一次MinorGC過程中的幸存者。
  • SurvivorFrom:上一次GC的幸存者,作為這一次GC的被掃描者。

當(dāng)Eden區(qū)內(nèi)存不夠的時(shí)候就會(huì)觸發(fā)MinorGC,對(duì)新生代區(qū)進(jìn)行一次垃圾回收,當(dāng)觸發(fā)GC后,JVM會(huì)將Eden和其中一個(gè)Survivor的對(duì)象全部復(fù)制到另外一個(gè)Survivor中(例如從from 到 to),即采用的復(fù)制算法(垃圾回收算法中的一種),在復(fù)制過程中,如果對(duì)象達(dá)到了老生代的要求就會(huì)被復(fù)制到老生代,復(fù)制到Servivor的每個(gè)對(duì)象的年齡加一,然后清空Eden和之前的Servivor區(qū)域。從這里就可以看出在任意時(shí)刻一定會(huì)存在一個(gè)Survivor區(qū)域處于空閑狀態(tài)。

2.老年代:
主要存放應(yīng)用程序中生命周期長的內(nèi)存對(duì)象。老年代的對(duì)象比較穩(wěn)定,所以MajorGC不會(huì)頻繁執(zhí)行。

在進(jìn)行MajorGC前一般都先進(jìn)行了一次MinorGC,使得有新生代的對(duì)象晉身入老年代,導(dǎo)致空間不夠用時(shí)才觸發(fā)。當(dāng)無法找到足夠大的連續(xù)空間分配給新創(chuàng)建的較大對(duì)象時(shí)也會(huì)提前觸發(fā)一次MajorGC進(jìn)行垃圾回收騰出空間。

MajorGC采用標(biāo)記—清除算法(垃圾回收算法中的一種):首先掃描一次所有老年代,標(biāo)記出存活的對(duì)象,然后回收沒有標(biāo)記的對(duì)象。MajorGC的耗時(shí)比較長,因?yàn)橐獟呙柙倩厥铡ajorGC會(huì)產(chǎn)生內(nèi)存碎片,為了減少內(nèi)存損耗,我們一般需要進(jìn)行合并或者標(biāo)記出來方便下次直接分配。

當(dāng)老年代也滿了裝不下的時(shí)候,就會(huì)拋出OOM(Out of Memory)異常。

3.永久代
在Java8中,永久代已經(jīng)被移除,被一個(gè)稱為“元數(shù)據(jù)區(qū)”(元空間)的區(qū)域所取代。元空間的本質(zhì)和永久代類似,都是對(duì)JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制。類的元數(shù)據(jù)放入 Native memory, 字符串池和類的靜態(tài)變量放入Java堆中. 這樣可以加載多少類的元數(shù)據(jù)就不再由MaxPermSize控制, 而由系統(tǒng)的實(shí)際可用空間來控制.

總結(jié)

前邊巴拉巴拉講了一堆,終于到了總結(jié)部分,首先我們了解到堆內(nèi)存主要分為三部分:新生代、老年代、永久代。

  • 新生代存放新生對(duì)象,又被分為 Eden 區(qū)、2塊 Survivor 區(qū),頻繁發(fā)生MinorGC,采用的是 復(fù)制算法。
  • Minor GC 每次收集后, Eden 區(qū)和1塊 Survivor 區(qū)都被清空;
  • 老年代存放 MinorGC 存留下來的對(duì)象,發(fā)生MajorGC,采用的是 標(biāo)記-清除算法。
  • 永久代在java8中被元空間所替代,劃分到本地內(nèi)存,不再使用 JVM 內(nèi)存,受本地內(nèi)存限制。

上邊提到的垃圾回收算法有,復(fù)制算法、標(biāo)記-清除算法,未提到的還有 標(biāo)記-整理算法、分代收集算法(下一篇講解算法部分),當(dāng)前商業(yè)虛擬機(jī)(如HotSpot)的垃圾收集都采用 分代收集算法,接下來將以 分代收集算法 描述對(duì)象的從創(chuàng)建到 GC 的過程。

1、一個(gè)人(對(duì)象)出來(new 出來)后會(huì)在Eden Space(伊甸園)無憂無慮的生活,直到GC到來打破了他們平靜的生活。GC會(huì)逐一問清楚每個(gè)對(duì)象的情況,有沒有錢(此對(duì)象的引用)啊,因?yàn)镚C想賺錢呀,有錢的才可以敲詐嘛。然后富人就會(huì)進(jìn)入Survivor Space(幸存者區(qū)),窮人的就直接kill掉。

2、并不是進(jìn)入Survivor Space(幸存者區(qū))后就保證人身是安全的,但至少可以活段時(shí)間。GC會(huì)定期(可以自定義)會(huì)對(duì)這些人進(jìn)行敲詐,億萬富翁每次都給錢,GC很滿意,就讓其進(jìn)入了Genured Gen(養(yǎng)老區(qū))。萬元戶經(jīng)不住幾次敲詐就沒錢了,GC看沒有啥價(jià)值啦,就直接kill掉了。

3、進(jìn)入到養(yǎng)老區(qū)的人基本就可以保證人身安全啦,但是億萬富豪有的也會(huì)揮霍成窮光蛋,只要錢沒了,GC還是kill掉。

分區(qū)的目的:新生區(qū)由于對(duì)象產(chǎn)生的比較多并且大都是朝生夕滅的,所以直接采用標(biāo)記-清理算法。而養(yǎng)老區(qū)生命力很強(qiáng),則采用復(fù)制算法,針對(duì)不同情況使用不同算法。

描述參考:https://lhc1986.iteye.com/blog/1421832

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):niceyoo

總結(jié)

以上是生活随笔為你收集整理的了解JVM运行时的内存分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。