美文网首页jvm调优
jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

作者: tianlang136520 | 来源:发表于2019-08-11 01:07 被阅读0次

    对象分配规则

    堆内存:

    image.png

    分配策略:

    1、jvm内存宏观分配策略
    内存宏观分配策略
    虚拟机栈分配<<<<<传送门
    2、堆内分配策略
    堆内分配策略
    1、对象优先分配在Eden区。

         如果Eden区没有足够的空间时,虚拟机执行一次Minor GC(Yong GC)。

    2、大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。

         这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

    3、长期存活的对象进入老年代。

         虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
    -XX:MaxTenuringThreshold用来定义年龄的阈值。

    4、动态判断对象的年龄。

         如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

    5、空间分配担保。

         在发生Minor GC(Yong GC)之前,JVM会计算Survivor区移至老年区的对象的平均大小,虚拟机会检查老年代最大可用的连续空间是否大于需要转移的对象大小。
               如果大于,则此次Minor GC(Yong GC)是安全的。
               如果小于,jdk1.6之前:则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
                    如果大于,则尝试进行一次Minor GC(Yong GC),但这次Minor GC(Yong GC)依然是有风险的,失败后会重新发起一次Major GC(Full GC);
                    如果小于或者HandlePromotionFailure=false,则改为直接进行一次Major GC(Full GC)。

    但是在jdk1.6 update 24之后-XX:-HandlePromotionFailure 不起作用了,只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MonitorGC,否则FullGC
    jdk1.8下,HandlePromotionFailure会报错,Unrecongnized VM option

    ️回收️:

    什么样的对象会被回收♻️?
    • 引用计数法:


      循环引用问题
    • 可达性分析


      可达性分析
    GC ROOT有哪些?
    • 虚拟机栈中本地变量表引用的对象。
    • 方法区中:
      • 类静态变量引用的对象
      • 常量引用的对象
    • 本地方法栈中JNI(java native interface)引用的对象。(JNI:Navtive 方法是 Java 通过 JNI 直接调用本地 C/C++ 库)
    GC回收器清理对应堆得区域
    • Young Generation(新生代):分为:Eden区和Survivor区,Survivor区有分为大小相等的From Space和To Space。Eden区没有足够的空间时,虚拟机执行一次Minor GC
    • Old Generation(老年代): 当 OLD 区空间不够时, JVM 会在 OLD 区进行 Old GC/Major GC。
    内存区域 回收算法 触发回收条件 垃圾回收器 线程
    Young Generation 复制算法 Eden区没有足够的空间时 Minor GC / Young GC 单or多线程(可选择)
    Old Generation 标记清除算法 Old使用达到CMS设置的阀值-XX:CMSInitiatingOccupancy
    Fraction=70
    Old GC/Major GC 单or多线程(可选择)
    Heap Generation Young Generation采用复制算法
    Old Generation采用标记整理算法
    1、调用System.gc时。
    2、老年代空间不足
    3、方法区空间不足
    4、Concurrent Mode Failure
    CMS进行回收过程中有大对象
    要申请进入Old区此时老年代空
    间不足,就会报
    Concurrent Mode Failure错误,
    同时触发fullgc。
    5、Minor GC后进入老年代对象
    对象占用空间大小大于老年代的
    可用内存。
    6、执行 jmap -histo:live or
    jmap -dump:live
    Full GC 单线程
    常见GC
    • Minor GC/Young GC:新生代GC,指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也比较快。>>>>>复制算法 <<<<<传送门

    • Old GC/Major GC:收集整个Old gen的GC,只有CMS模式这么称呼。MajorGC的速度一般比Minor GC慢10倍以上。

    • Full GC:收集整个堆,包括Young gen、Old gen、Perm gen(如果存在的话)等所有部分的模式。灰常慢呦~

    • Mixed GC:收集整个young gen以及部分old gen的GC。只有G1模式这么称呼。

    相关文章

      网友评论

        本文标题:jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

        本文链接:https://www.haomeiwen.com/subject/zjtdjctx.html