GC 过程——(一)

虚拟机初始堆状态 ,为了方便 区域划分比较小
from /to 分别占一个单元
eden占8个单元
OldGen 占20个单元
过程忽略代数计算
所有对象为强引用,都是不可回收的状态

vm_0.jpg

然后开始对象分配 新创建的对象首先分配到Eden 区域中
直到Eden区域分配满
vm_2.png

此时触发第一次GC 操作 ,为Eden空间分配不足触发的MinorGC
vm_3.png

from区域现在是空的,所以首先将Eden中的对象向 to中进行分配,分配满以后 会将其余的对象分配到老年代 OldGen中
vm_4.png

第一次GC 完成后 继续向Eden 创建对象 直到再次触发MinorGC
vm_5.png

此时首先将From区域中的元素复制到to区域(此处忽略的代数,如果有代数在默认15代的对象需要晋升到老年代中,并且此处留一个坑,是先计算代数然后放入to还是先将Eden放入to),由于此时To区域已满,所以剩余的对象会放入老年代OldGen中
vm_6.png

继续在Eden分配对象
vm_7.png

再次触发MinorGC
vm_8.png

可以看到,此时 Eden需要晋升的对象数量要大于老年代的剩余空间,这是会触发FullGC 操作来对老年代进行回收操作(此处有第二个坑,FullGC 时是否会对From区域再次进行回收,还是直接将from区域的对象复制到OldGen,看流程FullGC是前面一个MinorGC 触发的,所以理论上 已经完成了对From区域的处理)
接下来有两种情况:
一:已经无法在申请到内存空间,此时 老年代无法申请空间存放Eden中的元素 抛出OOM
二:jvm可以向系统申请空间扩展,则如下图进行空间扩展,然后将Eden晋升对象放入老年代
vm_9.png

vm_10.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容