• JVM内存分配策略、各个代区、FullGC/MinorGC


    主要讨论默认的Serial/Serial Old内存分配:

    一、几种分配方案

      1.  对象优先在Eden分配;

        一般情况下,对象会在新生代的Eden区分配,Eden区没有足够空间时,虚拟机会 发起一次MinorGC;当MinorGC时,若无法放入survivor空间,就会再通过分配担保机制转移到老年代中;

      2. 大对象直接进入老年代;

        通过 -XX:PretenureSizeThreshold参数设置;

      3. 长期存活的对象进入老年代:

        通过 -XX:MaxTenuringThreshold参数设置;每MinorGC一次还存活在Survivor中,则年龄加1;

      4. 组团进入 老年代:

        在survivor中年龄相同的所有对象大小总和大于 PretenureSizeThreshold 参数的一半,年龄大于或等于该年龄的对象进入老年代。

      5. 空间担保进入 老年代:

        每次MinorGC之前,会检查老年代最大连续可用空间是否大于 新生代所有对象的总空间,大于则表示安全可进行MinorGC;

        如果小于:(JDK 6U24不再检查HandlePromotionFailure,一定会冒险)

            a. 检查HandlePromotionFailure 为 true ,表示允许冒险,则与历次晋升到老年代的对象平均大小比较,若大于则进行MinorGC,若小于则进行FullGC;

            b. HandlePromotionFailure 为 false,进行FullGC;

        

    二、MinorGC 与FullGC/Major

      MinorGC:指发生在新生代的GC,因大多数新生对象生命周期很短,所以MinorGC通常很频繁,回收速度也较快;

      MajorGC/FullGC:指老年代GC,速度一般较慢,一般是MinorGC的10倍;通常MajorGC会伴随一次MinorGC;(书原话,有歧义)

      参考知乎R大答案:Major GC和Full GC的区别是什么?触发条件呢?

        触发条件:

        MinorGC:Eden区满时触发;FullGC也会伴随有MinorGC;通常会使得Old gen变大;

        FullGC:a. MinorGC触发前,检查历次进入老年代的平均大小,若小于则FullGC;

            b. 如果有永久代(perm gen),在不足哆分配时,触发FullGC;

            c. 调用System.gc(),提醒JVM FullGC,但不可控;

    三、HotSpot几个区域

      新生代分为:Eden Space、Survivor Space

      老年代:Tenured Gen

      永久代:Perm Gen(方法区相关数据);

          在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之是一个叫做 Metaspace(元空间) 的东西。

          扩展:Java8内存模型—永久代(PermGen)和元空间(Metaspace)

      

  • 相关阅读:
    Newbit 启用淘宝店域名
    Ninja构建系统入门
    异想家Golang学习笔记
    Webpack学习
    JavaFx图形界面开发
    异想家Win10常用的软件推荐
    Java Swing图形界面开发
    优雅写Java之四(类与对象)
    优雅写Java之三(IO与文本解析)
    优雅写Java之二(数组集合流)
  • 原文地址:https://www.cnblogs.com/mzzcy/p/7048129.html
Copyright © 2020-2023  润新知