了解JVM运行时的内存分配
前言
上文中,在介紹運行時數據區域中的 JAVA 堆時,提到了 JVM 中的堆,一般分為三大部分:新生代、老年代、永久代,本文將進一步了解運行時的內存分配情況。
正文
1.新生代
主要用來存放新生(new)的對象。一般占據堆的 1/3 空間。由于頻繁創建對象,所以新生代會頻繁的觸發 MinorGC 進行垃圾回收。
新生代又分為 Eden(伊甸園)、SurvivorFrom、SurvivorTo三個區。
- Eden區:Java新對象的出生地(如果新創建的對象占用內存很大,則直接分配到老年代)。
- SurvivorTo:保留了一次MinorGC過程中的幸存者。
- SurvivorFrom:上一次GC的幸存者,作為這一次GC的被掃描者。
當Eden區內存不夠的時候就會觸發MinorGC,對新生代區進行一次垃圾回收,當觸發GC后,JVM會將Eden和其中一個Survivor的對象全部復制到另外一個Survivor中(例如從from 到 to),即采用的復制算法(垃圾回收算法中的一種),在復制過程中,如果對象達到了老生代的要求就會被復制到老生代,復制到Servivor的每個對象的年齡加一,然后清空Eden和之前的Servivor區域。從這里就可以看出在任意時刻一定會存在一個Survivor區域處于空閑狀態。
2.老年代:
主要存放應用程序中生命周期長的內存對象。老年代的對象比較穩定,所以MajorGC不會頻繁執行。
在進行MajorGC前一般都先進行了一次MinorGC,使得有新生代的對象晉身入老年代,導致空間不夠用時才觸發。當無法找到足夠大的連續空間分配給新創建的較大對象時也會提前觸發一次MajorGC進行垃圾回收騰出空間。
MajorGC采用標記—清除算法(垃圾回收算法中的一種):首先掃描一次所有老年代,標記出存活的對象,然后回收沒有標記的對象。MajorGC的耗時比較長,因為要掃描再回收。MajorGC會產生內存碎片,為了減少內存損耗,我們一般需要進行合并或者標記出來方便下次直接分配。
當老年代也滿了裝不下的時候,就會拋出OOM(Out of Memory)異常。
3.永久代
在Java8中,永久代已經被移除,被一個稱為“元數據區”(元空間)的區域所取代。元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在于:元空間并不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。類的元數據放入 Native memory, 字符串池和類的靜態變量放入Java堆中. 這樣可以加載多少類的元數據就不再由MaxPermSize控制, 而由系統的實際可用空間來控制.
總結
前邊巴拉巴拉講了一堆,終于到了總結部分,首先我們了解到堆內存主要分為三部分:新生代、老年代、永久代。
- 新生代存放新生對象,又被分為 Eden 區、2塊 Survivor 區,頻繁發生MinorGC,采用的是 復制算法。
- Minor GC 每次收集后, Eden 區和1塊 Survivor 區都被清空;
- 老年代存放 MinorGC 存留下來的對象,發生MajorGC,采用的是 標記-清除算法。
- 永久代在java8中被元空間所替代,劃分到本地內存,不再使用 JVM 內存,受本地內存限制。
上邊提到的垃圾回收算法有,復制算法、標記-清除算法,未提到的還有 標記-整理算法、分代收集算法(下一篇講解算法部分),當前商業虛擬機(如HotSpot)的垃圾收集都采用 分代收集算法,接下來將以 分代收集算法 描述對象的從創建到 GC 的過程。
1、一個人(對象)出來(new 出來)后會在Eden Space(伊甸園)無憂無慮的生活,直到GC到來打破了他們平靜的生活。GC會逐一問清楚每個對象的情況,有沒有錢(此對象的引用)啊,因為GC想賺錢呀,有錢的才可以敲詐嘛。然后富人就會進入Survivor Space(幸存者區),窮人的就直接kill掉。
2、并不是進入Survivor Space(幸存者區)后就保證人身是安全的,但至少可以活段時間。GC會定期(可以自定義)會對這些人進行敲詐,億萬富翁每次都給錢,GC很滿意,就讓其進入了Genured Gen(養老區)。萬元戶經不住幾次敲詐就沒錢了,GC看沒有啥價值啦,就直接kill掉了。
3、進入到養老區的人基本就可以保證人身安全啦,但是億萬富豪有的也會揮霍成窮光蛋,只要錢沒了,GC還是kill掉。
分區的目的:新生區由于對象產生的比較多并且大都是朝生夕滅的,所以直接采用標記-清理算法。而養老區生命力很強,則采用復制算法,針對不同情況使用不同算法。
描述參考:https://lhc1986.iteye.com/blog/1421832
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:niceyoo
總結
以上是生活随笔為你收集整理的了解JVM运行时的内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样做sns网站?哪里可下载这类程序?
- 下一篇: luogu P1774 最接近神的人_N