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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM—运行时内存

發布時間:2024/4/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM—运行时内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、新生代

2、MinorGC?過程

3、老年代?

4、永久代


Java?堆從?GC?的角度還可以細分為:?新生代(Eden?區、From Survivor?區和?To Survivor?區)和老年代。

1、新生代

是用來存放新生的對象,一般占據堆的1/3空間。由于頻繁創建對象,所以新生代會頻繁出發MinorGC進行垃圾回收。新生代又分為Eden區、SurvivorFrom區、Survivor To三個區。

  • 1)Eden?區:Java?新對象的出生地(如果新創建的對象占用內存很大,則直接分配到老 年代)。當?Eden?區內存不夠的時候就會觸發?MinorGC,對新生代區進行 一次垃圾回收。
  • 2)ServivorFrom:上一次?GC?的幸存者,作為這一次?GC?的被掃描者。
  • 3)ServivorTo:保留了一次?MinorGC?過程中的幸存者。

2、MinorGC?過程

MinorGC?過程采用復制算法:復制->清空->互換。

1)eden、servicorFrom?復制到?ServicorTo,年齡+1

首先,把?Eden?和?ServivorFrom?區域中存活的對象復制到?ServicorTo?區域(如果有對象的年 齡以及達到了老年的標準,則賦值到老年代區),同時把這些對象的年齡+1(如果?ServicorTo?不 夠位置了就放到老年區);

2)清空?eden、servicorFrom

然后,清空?Eden?和?ServicorFrom?中的對象;

3)ServicorTo?和?ServicorFrom?互換

最后,ServicorTo?和?ServicorFrom?互換,原?ServicorTo?成為下一次?GC?時的?ServicorFrom區。

3、老年代?

主要存放應用程序中生命周期長的內存對象。

老年代的對象比較穩定,所以?MajorGC?不會頻繁執行。在進行?MajorGC?前一般都先進行了一次?MinorGC,使得有新生代的對象晉身入老年代,導致空間不夠用時才觸發。當無法找到足夠大的連續空間分配給新創建的較大對象時也會提前觸發一次?MajorGC?進行垃圾回收騰出空間。

MajorGC?采用標記清除算法:首先掃描一次所有老年代,標記出存活的對象,然后回收沒有標記的對象。MajorGC?的耗時比較長,因為要掃描再回收。MajorGC?會產生內存碎片,為了減少內存損耗,我們一般需要進行合并或者標記出來方便下次直接分配。當老年代也滿了裝不下的 時候,就會拋出?OOM(Out of Memory)異常。

4、永久代

指內存的永久保存區域,主要存放?Class?和?Meta(元數據)的信息,Class?在被加載的時候被 放入永久區域,它和和存放實例的區域不同,GC?不會在主程序運行期對永久區域進行清理。所以這 也導致了永久代的區域會隨著加載的?Class?的增多而脹滿,最終拋出?OOM?異常。

JAVA8?與元數據

在?Java8?中,永久代已經被移除,被一個稱為“元數據區”(元空間)的區域所取代。元空間的本質和永久代類似,元空間與永久代之間最大的區別在于:元空間并不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。類的元數據放入?native memory,?字符串池和類的靜態變量放入?java?堆中,這樣可以加載多少類的元數據就不再由?MaxPermSize?控制,?而由系統的實際可用空間來控制。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。