虚拟机初始堆状态 ,为了方便 区域划分比较小
from /to 分别占一个单元
eden占8个单元
OldGen 占20个单元
过程忽略代数计算
所有对象为强引用,都是不可回收的状态
然后开始对象分配 新创建的对象首先分配到Eden 区域中
直到Eden区域分配满
此时触发第一次GC 操作 ,为Eden空间分配不足触发的MinorGC
from区域现在是空的,所以首先将Eden中的对象向 to中进行分配,分配满以后 会将其余的对象分配到老年代 OldGen中
第一次GC 完成后 继续向Eden 创建对象 直到再次触发MinorGC
此时首先将From区域中的元素复制到to区域(此处忽略的代数,如果有代数在默认15代的对象需要晋升到老年代中,并且此处留一个坑,是先计算代数然后放入to还是先将Eden放入to),由于此时To区域已满,所以剩余的对象会放入老年代OldGen中
继续在Eden分配对象
再次触发MinorGC
可以看到,此时 Eden需要晋升的对象数量要大于老年代的剩余空间,这是会触发FullGC 操作来对老年代进行回收操作(此处有第二个坑,FullGC 时是否会对From区域再次进行回收,还是直接将from区域的对象复制到OldGen,看流程FullGC是前面一个MinorGC 触发的,所以理论上 已经完成了对From区域的处理)
接下来有两种情况:
一:已经无法在申请到内存空间,此时 老年代无法申请空间存放Eden中的元素 抛出OOM
二:jvm可以向系统申请空间扩展,则如下图进行空间扩展,然后将Eden晋升对象放入老年代