JVM垃圾回收总结

1.常见的垃圾标记算法有:
垃圾标记算法: 引用计数法(每个对象都会有一个引用计数器,当该对象被引用一次之后,该计数器就会加一,当引用结束之后,计数器-1,当计数器为0的时候,就会被标记为垃圾回收对象)
优点:实现简单,而且效率高。
缺点:无法解决循环引用的问题。每个对象都需要单独的计数器来记录引用次数,占用空间。

根搜索算法: 以跟对象为起点,按照从上往下的顺序,判断链接对象是否可达。不可到达对象则被判定为垃圾对象,需要进行回收。
(并非说一旦不可达,就立马会被进行标记。至少要经历两次的标记过程。在执行gc回收的时候,会先去判断finalize函数,需要判断该对象是否有进行自救)

2.垃圾收集算法: 标记清除法,复制算法,标记压缩法

标记清除法: 由于已经进行了相应的标记,那么在清除的时候也就会比较简单,只需要将被标记的对象保留,没有标记的对象进行回收即可。但是这个时候要注意,进行回收标记的时候,需要先暂停整个线程在进行标记。(原因自己可以思考一下)
缺点:
1.容易造成相应的碎片化空间。
2.需要进行暂停回收,而且还需要在堆里面进行递归遍历,性能不佳。
在这里插入图片描述
复制算法: 将内存分为了AB两块,(A正在使用的内存,B未使用的内存)将正在使用的对象复制到B内存中,然后对A进行垃圾回收。
缺点:
占用空间内存。需要复制,消耗性能。
在这里插入图片描述
标记压缩法
前期和标记清楚算法一样,都是需要给相应的对象标记是否引用。但是后期则是将具有引用的对象往内存的一侧移动,进行整理,最后清理整理区域另一侧的对象。
**缺点:**需要有额外的空间进行内存分配。

增量算法:
额外开一条线程,主程序在A线程执行,回收程序在B线程执行。B采用标记清除法和复制法的思路来分阶段性的进行回收,减少对于系统卡顿的影响。
**缺点:**不断的进行AB线程之间的切换,会造成相应的系统性能消耗。

分代回收算法:
对于GC回收的分代如果了解的同学应该知道,大多数的对象存活周期都是比较短的。因此在进行垃圾回收的时候需要结合各个年代的对象特点来进行回收。
年轻代一般存活对象在第一次垃圾回收的时候就挂了,因此可以采用复制算法(会有额外的空间)
老年代中存活概率高,因此采用标记-整理算法
当前jvm主要采用分代回收算法
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值