大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 JVM堆內存

JVM堆內存

更新時間:2021-08-02 16:58:13 來源:動力節(jié)點 瀏覽1211次

Java堆內存管理是影響性能的主要因素之一。

堆內存溢出是Java項目非常常見的故障,在解決該問題之前,必須先了解下Java堆內存是怎么工作的。

先看下JAVA堆內存是如何劃分的,如圖:

jvm堆

  • JVM內存劃分為堆內存和非堆內存,堆內存分為年輕代(Young Generation)、老年代(Old Generation),非堆內存就一個永久代(Permanent Generation)。
  • 年輕代又分為Eden(生成區(qū))和Survivor(生存區(qū))。Survivor區(qū)由FromSpace和ToSpace組成。Eden區(qū)占大容量,Survivor兩個區(qū)占小容量,默認比例是8:1:1。
  • 堆內存用途:存放的是對象,垃圾收集器就是收集這些對象,然后根據(jù)GC算法回收。
  • 非堆內存用途:永久代,也稱為方法區(qū),存儲程序運行時長期存活的對象,比如類的元數(shù)據(jù)、方法、常量、屬性等。

在JDK1.8版本廢棄了永久代,替代的是元空間(MetaSpace),元空間與永久代上類似,都是方法區(qū)的實現(xiàn),他們最大區(qū)別是:元空間并不在JVM中,而是使用本地內存。

元空間有兩個參數(shù):

  • MetaspaceSize:初始化元空間大小,控制發(fā)生GC閾值。
  • MaxMetaspaceSize:限制元空間大小上限,防止異常占用過多物理內存。

為什么移除永久代?

移除永久代原因:為融合HotSpot JVM與JRockit VM(新JVM技術)而做出的改變,因為JRockit沒有永久代。

有了元空間就不再會出現(xiàn)永久代OOM問題了

分代概念

新生成的對象首先放到年輕代Eden區(qū),當Eden空間滿了,觸發(fā)Minor GC,存活下來的對象移動到Survivor0區(qū),Survivor0區(qū)滿后觸發(fā)執(zhí)行Minor GC,Survivor0區(qū)存活對象移動到Survivor1區(qū),這樣保證了一段時間內總有一個survivor區(qū)為空。經(jīng)過多次Minor GC仍然存活的對象移動到老年代。

老年代存儲長期存活的對象,占滿時會觸發(fā)Major GC=Full GC,GC期間會停止所有線程等待GC完成,所以對相應要求高的應用盡量減少發(fā)生Major GC,避免響應超時。

  • Minor GC:清理年輕代
  • Major GC:清理老年代
  • Full GC:清理整個堆空間,包括年輕代和永久代

所有GC都會停止所有應用進程

為什么分代?

將對象根據(jù)存活概率進行分類,對存活時間長的對象,放到固定區(qū),從而減少掃描垃圾時間及GC頻率。針對分類進行不同的垃圾回收算法,對算法揚長避短。

為什么Survivor分為兩塊相等大小的幸存空間?

主要為了解決碎片化。如果內存碎片化嚴重,也就是兩個對象占用不連續(xù)的內存,已有的連續(xù)內存不夠新對象存放,就會觸發(fā)GC。

JVM堆內存常用參數(shù)

參數(shù) 描述
-Xms 堆內存初始大小,單位m、g
-Xmx(MaxHeapSize) 堆內存最大允許大小,一般不要大于物理內存的80%
-XX:PermSize 非堆內存初始大小,一般應用設置初始化200m,最大1024m就夠了
-XX:MaxPermSize 非堆內存最大允許大小
-XX:NewSize(-Xns) 年輕代內存初始大小
-XX:MaxNewSize(-Xmn) 年輕代內存最大允許大小,也可以縮寫
-XX:SurvivorRatio=8 年輕代中Eden區(qū)與Survivor區(qū)的容量比例值,默認為8,即8:1
-Xss 堆棧內存大小

垃圾回收算法(GC,Garbage Collection)

紅色是標記的非活動對象,綠色是活動對象。

  • 標記-清除(Mark-Sweep)

GC分為兩個階段,標記和清除。首先標記所有可回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象。同時會產(chǎn)生不連續(xù)的內存碎片。碎片過多會導致以后程序運行時需要分配較大對象時,無法找到足夠的連續(xù)內存,而不得已再次觸發(fā)GC。

jvm堆

  • 復制(Copy)

將內存按容量劃分為兩塊,每次只使用其中一塊。當這一塊內存用完了,就將存活的對象復制到另一塊上,然后再把已使用的內存空間一次清理掉。這樣使得每次都是對半個內存區(qū)回收,也不用考慮內存碎片問題,簡單高效。缺點需要兩倍的內存空間。

jvm堆

  • 標記-整理(Mark-Compact)

也分為兩個階段,首先標記可回收的對象,再將存活的對象都向一端移動,然后清理掉邊界以外的內存。此方法避免標記-清除算法的碎片問題,同時也避免了復制算法的空間問題。

一般年輕代中執(zhí)行GC后,會有少量的對象存活,就會選用復制算法,只要付出少量的存活對象復制成本就可以完成收集。

而老年代中因為對象存活率高,沒有額外過多內存空間分配,就需要使用標記-清理或者標記-整理算法來進行回收。

jvm堆

jvm堆

以上就是動力節(jié)點小編介紹的"JVM堆內存",希望對大家有幫助,想了解更多可查看Java虛擬機視頻。動力節(jié)點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧洲一级黄色片 | 一级香蕉免费毛片 | 精品一成人岛国片在线观看 | 天天玩夜夜操 | 精品伊人久久久99热这里只 | 国产夫妻久久 | 国产精品福利在线观看 | 日韩一区二区三区视频在线观看 | 91久久福利国产成人精品 | 亚洲精品一二三四区 | 天天摸天天碰色综合网 | 一色屋精品亚洲香蕉网站 | 精品国产一区二区三区在线观看 | 一级毛片免费不卡在线 | 国产精品资源网站在线观看 | 天啪天天久久天天综合啪 | 亚洲看黄 | 久久网页 | 色另类| 成人一级片 | 热久久99影院 | 97se亚洲| 免费久福利视频在线观看 | 国产成人久久综合二区 | 亚洲视频免费在线看 | 国产美女精品在线观看 | 成人亚洲欧美 | 手机看高清特黄a大片 | 九九99九九在线精品视频 | 99成人在线 | 深夜精品寂寞在线观看黄网站 | 国产欧美日韩图片一区二区 | 亚洲国产高清在线精品一区 | 亚洲精品456| 黄色www| 天天爽天天狼久久久综合 | 欧美末成年videos在线观看 | 手机看一级片 | 91免费精品国自产拍在线不卡 | 亚洲精品久久成人福利 | 热九九精品 |