标记清除算法
1.标记阶段:将所有对象标记(可达性分析可达目标)
2.清除阶段:从内存清除未标记对象
实现简单
缺点:碎片化,分配速度慢(因为碎片多,通过链表维护)
复制算法
1.准备from和to两部分空间,每次对象分配阶段只能使用一个(from)
2.将存活对象复制到to(可达性分析得到存活对象)
3清除from内容,互换名称
缺点:内存使用效率低
有点:吞吐量高,不会发生碎片化
性能不如标记清除算法
标记整理算法
1.标记阶段:将所有对象标记(可达性分析可达目标)
2.整理阶段:将对象全部移动到一端,清除其余空间
缺点:整理阶段的效率不高
优点:内存使用效率高,没有碎片化
分代GC(当前使用2023.12.18日)
将内存分为young和old两部分,old内存放存活时间较长对象,young分为eden区和survivor区,survivor区可分为两块此处代称s0,s1。
执行流程
1.创建的对象会放在eden区,当新创建的对象无法放入则触发Young GC会将eden中和from(s0)中需要回收的对象清除,把没有回收的对象放入to(s1)(复制算法)
每次出现搬运会给年龄加一,初始为0
2.当年级达到15时,会把对象放入old区
3.当old区空间不足时会先尝试Young GC,如果内存依然不够,会启动Full GC对整个堆垃圾回收(产生的stw较长)
4.如果内存依旧不足,则抛出异常OutOfMemory