一、对象生命周期
1. 对象生命周期
大部分对象都是存活周期极短的
少数对象是长期存活的
二、JVM分代模型
1. 年轻代和老年代
1.1 什么是新老年代
堆内存分为年轻代和老年代
(1) 年轻代
年轻代也叫新生代。存放创建和使用完后很快就要被回收的对象。
年轻代划分
- 又分为Eden区,from survivor区,to survivor区
- Eden区和两块较小的survivor空间。默认大小比例为8:1:1
(2) 老年代
存放长期存在的对象
(3) 新老年代示例:
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堆中。