栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM之堆空间

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM之堆空间

堆内存细分:
    Java7 及之前堆内存逻辑上分为三部分:新生区+养老区+永久区

    Young Generation Space 新生区 ,又被划分为Eden区和Survivor区Old generation space 养老区 Permanent Space 永久区 Java 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间

    Young Generation Space 新生区,又被划分为Eden区和Survivor区Old generation space 养老区meta Space 元空间 meta

 约定:新生区 <–> 新生代 <–> 年轻代 、 养老区 <–> 老年区 <–> 老年代、 永久区 <–> 永久代


对象分配过程:
    new的对象先放Eden区。当Eden区的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃圾回收(MinorGC),将Eden区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到Eden区。将Eden中的未被回收的对象移动到Survivor 0区。如果再次触发垃圾回收机制,Survivor 0区中未被回收的对象,就会放到Survivor 1区。如果再次触发垃圾回收机制,Survivor 1区中未被回收的对象会移回Survivor 0区,如此反复。通过设置反复次数(默认是15次)控制,当反复次数到达所设置的值时Survivor区中仍未被回收的对象将被移到养老区。设置 JVM 参数:**-XX:MaxTenuringThreshold**=N 当养老区内存不足时,触发GC:Major GC,进行养老区的内存清理若养老区执行了Major GC之后,发现依然无法进行对象的保存,就会产生OOM异常。

对象分配的特殊情况:
    如果来了一个新对象,先看看 Eden 是否放的下?

    如果 Eden 放得下,则直接放到 Eden 区如果 Eden 放不下,则触发 YGC ,执行垃圾回收,看看还能不能放下?将对象放到养老区又有两种情况:

    如果 Eden 执行了 YGC 还是无法放不下该对象,说明是超大对象,只能直接放到养老区养老区也放不下,则先触发FullGC ,如果还是放不下,就报 OOM如果 Eden 区满了,将对象往Survivor区拷贝时,Survivor也放不下,就让新对象直接晋升至养老区


GC分类:

JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。针对Hotspot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(FullGC)

    部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:

    新生代收集(Minor GC/Young GC):只是新生代(Eden,s0,s1)的垃圾收集老年代收集(Major GC/Old GC):只是老年代的圾收集。目前,只有CMS GC会有单独收集老年代的行为。注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为

    整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777046.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号