背景
一般遇到关于创建对象时内存不足的时候会爆出堆内存不足的情况,为了研究怎么合理避免这种情况的发生有必要了解下关于堆空间里年轻代和老年代的垃圾回收触发机制以及存放机制。那么下面就简单介绍下了。类似沟~
关于垃圾回收机制
说到垃圾回收,在内存不足的时候,JVM首先肯定不是直接把堆内存的eden区域直接清空或者其他内存不足的地方清空,这种操作没有道理。如果真的这样想那还有什么安全性可言。那么内心就这样了:
正常的JVM会启动自我检查会触发以下两种算法:
- 引用计数法
- 可达性算法
总而言之,会先标记好那些对象已经没有强引用之类的,然后根据情况进行不同的垃圾回收新生代一般会触发的是MinorGC基于复制算法的回收算法,例如下面的情况:
新生代的第一次MinorGC处理流程:
- 新生成对象的时候发现内存不够了
- 分析算法:
引用计数法和可达性算法进行分析寻找进行标记动作 - 迁移幸存区:
把存活的对象复制到幸存区,并且寿命加一。 - Minor GC后幸存区From和To互换
当再次内存满了之后,第二次Minor GC
- 先清空未引用的对象,包括幸存区的,如果有引用存入到幸存区,原来在幸存区仍然存活的对象再加一。
- 当寿命超过默认值的话就放到了老年代
注意:当新生代内存肯定不够的时候&