美文网首页javaJVM
JVM-分代模型

JVM-分代模型

作者: terry蒋 | 来源:发表于2021-01-06 23:32 被阅读0次

    一、对象生命周期

    1. 对象生命周期

    • 大部分对象都是存活周期极短的

    • 少数对象是长期存活的

    二、JVM分代模型

    1. 年轻代老年代

    1.1 什么是新老年代

    堆内存分为年轻代老年代

    (1) 年轻代

    年轻代也叫新生代。存放创建和使用完后很快就要被回收的对象。

    年轻代划分

    • 又分为Eden区,from survivor区,to survivor区
    • Eden区和两块较小的survivor空间。默认大小比例为8:1:1
    (2) 老年代

    存放长期存在的对象

    (3) 新老年代示例:
    image.png

    Kafka的静态变量"fetcher"引用了ReplicaFetcher对象,这个对象先在年轻代停留一段时间,最终会进入老年代。

    而loadReplicasFromDisk方法中的replicaManager引用的实例对象在一次方法调用结束后,方法的栈帧出栈,实例对象会很快被回收。

    1.2 为什么分为年轻代和老年代

    因为不同存活时长的对象需要不同的垃圾回收算法,这样回收更高效。

    • java大部分对象都是朝生夕死的,这些不需要长期存在的对象,放年轻代中,需要使用一种垃圾回收算法;

    • 长期存在的,放老年代中,需要使用另外一种垃圾回收算法。

    1.3 为什么要有survivor区

    • 没有survivor区,只有eden区的话,每进行一次minor gc,对象就被送入老年代。很容易触发full gc,影响性能
    • 而如果又survivor区,则可以减少送入老年代的对象数量,减少full gc的发生

    1.4 为什么要设置两个survivor区

    每次minor gc,通过将eden和一个survivor的内容复制到另一个survivor, 避免碎片化问题

    2. 永久代

    JDK1.8以前有永久代,JDK1.8开始,已经取消了永久代。但是方法区作为概念上的区域仍然存在,但是我们不再叫方法区了,而是叫元数据区(metaspace)。

    原先永久代中类的元信息会被放入本地内存(元数据区metaspace),将类的静态变量和内部字符串放入到java堆中。

    相关文章

      网友评论

        本文标题:JVM-分代模型

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