文章目录
Pre
上篇文章已经讲清楚了新生代的垃圾回收算法,包括跟这个垃圾回收算法搭配的新生代内存区域的划分,大家也都清楚了为什么有一块Eden区域和两块Survivor区域
那么本文就要给大家说说,新生代里的对象一般在什么场景下会进入老年代。
首先我们来看下面的图,我们写好的代码在运行的过程中,就会不断的创建各种各样的对象,这些对象都会优先放到新生代的Eden区和Survivor1区。
接着假如新生代的Eden区和Survivor1区都快满了,此时就会触发Minor GC,把存活对象转移到Survivor2区去
如下图所示
然后接着就会使用Eden区和Survivor2区,来分配新的对象,如下图所示。
这个过程上篇文章已经讲的非常的清楚了。那么这篇文章我们就来依次看看各种情况下,对象是如何进入老年代的,以及老年代的垃圾回收算法是什么样的?
躲过15次GC之后进入老年代
按照上面的图示的那个过程,其实大家可以理解为我们写的系统刚启动的时候,创建的各种各样的对象,都是分配在新生代里的。
然后慢慢系统跑着跑着,新生代就满了,此时就会触发Minor GC,可能就1%的少量存活对象转移到空着的Survivor区中。
然后系统继续运行,继续在Eden区里分配各种对象,大概就是这个过程。
那么之前给大家讲过,我们写的系统中有些对象是长期存在的对象,他是不会轻易的被回收掉的,比如下面的代码。
只要这个“Kafka”类还存在,那么他的静态变量“replicaManager”就会长期引用“ReplicaManager”对象,所以你无论新生代怎么垃圾回收,类似这种对象都不会被回收掉的。
此时这类对象每次在新生代里躲过一次GC被转移到一块Survivor区域中,此时他的年龄就会增长一岁
默认的设置下,当对象的年龄达到15岁的时候,也就是躲过15次GC的时候,他就会转移到老年代里去。
这个具体是多少岁进入老年代,可以通过JVM参数“-X