JVM-分代模型

一、对象生命周期

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-分代模型)