JVM内存回收小结

JVM通过GC来回收堆和方法区中的内存,GC的基本原理首先会找到程序中不再被使用的对象,然后回收这些对象所占用的内存空间,通常采用收集器的方式实现GC,主要的收集器有引用计数收集器和跟踪收集器。

1、引用计数收集器

引用计数收集器采用的是分散式的管理方式,通过计数器记录对象是否被引用。当对象被引用的时候,计数器加1,当没有引用的时候计数器减1,当计数器为零的时候,说明此对象已经不再被引用,则可进行回收。

引用计数器需要在每次对对象进行赋值的时候进行引用计数器的增减,这有一定的消耗。另外引用计数器对循环引用的场景没有办法实现回收。因此对于JAVA这种面向对象的会形成复杂引用关系的语言来说,引用计数器不是很适合;

2、跟踪收集器

跟踪收集器采用的为集中式管理方式,全局记录数据的引用状态。基于一定条件的触发(例如定时,空间不足等),执行时需要从根集合来扫描对象的引用关系。主要有赋值(Copying)、标志-清除(Mark-Sweep)和标志-压缩(Mark-Compact)三种实现算法。

复制(Copying):

复制采用的方法是从根集合扫描出存活的对象,并将找到的对象复制到一块新的完全未使用的空间。复制收集器方法仅需要从根集合扫描所有存活的对象,当要回收的空间中存活的对象较少时,复制算法效率比较高,但其带来的成本是增加一块空的内存空间。

标志-清除(Mark-Sweep):

标志-清除采用的方式是从根集合开始扫描,对存活的对象进行标志,标志完之后,再扫描整个空间未标志的对象,进行回收。标志-清除不需要进行对象的移动,且对其不存活的对象进行处理。在空间中存活对较多的情况下较为高效。但由于标志-清除采用的为直接回收不存活对象所占的内存空间,因此会产生内存碎片。

标志-压缩(Mark-Compact)

标志-压缩和标志-清除采用的是一样的方式对存活的对象进行标志,但在清除的时候,在回收不存活的对象所在的内存空间后,会将其他存活的对象都往左端空闲的空间进行移动,并更新引用其对象指针。标志-压缩在标志-清除的基础上面还需进行对象移动,成本相对较高,好处是不产生内存碎片。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值