一、gc 什么时候触发?
实际的gc发生是在 新生代内存使用达到 90%时开始进行,当gc时会复制存活的对象到S1区(to), 当gc结束后,会将S1区的对象重新放回到S0(from),既然这这两个区要互换位置,那么这两个区的内存大小也要是一样的,GC就是清理的他们,始终保持着其中一个 S 区是空留的,保证GC的时候复制存活的对象有个存储的地方。因此
新生代 = (eden : from :to) =8:1:1
至于为什么是这个比例:
GC是统计学测算出当内存使用超过98%以上时,内存就应该被minor gc时回收一次。但是实际应用中,我们不能较真的只给 他们留下2%,换句话说当内存使用达到98%时才GC 就有点晚了,应该是多一些预留10%内存空间,这预留下来的空间我们称为S区(有两个s区 s1 和 s0),S区是用来存储新生代GC后存活下来的对象,而我们知道新生代GC算法使用的是复制回收算法
注意:如何判断对象存活可用,可达性分析法来判断:通过一系列称为 GCRoot 对象做起点,从这些节点向下搜索,搜索所走过的路径称为引用链,如果一个对象在引用链上,就说是可达的,这种对象就是需要存活下来的!!作为GC Roots的对象包括下面几种:
1.1 当前虚拟机栈中局部变量表中的引用的对象
1.2 当前本地方法栈中局部变量表中的引用的对象