垃圾收集器与内存分配策略

垃圾收集器与内存分配策略

  1. 判断对象是否存活

    • 引用计数:
      给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1,;任何时刻都计数器都为0的对象就是不可能再被使用的。在大部分情况下它都是一个不错的算法,但是它难以解决对象之间的相互循环引用的问题。
    • 根搜索算法
      基本思路:通过一系列的名为“GC Roots”对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(从GC Roots 到这个对象不可达),则证明此对象是不可用的。
  2. 生存还是死亡
    在根搜索算法中不可达的算法,也并非是被立即回收的,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件就是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。
    如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条虚拟机自动建立的、低优先级的Finalizer线程去执行,这里所谓的执行是虚拟机会触发这个方法,但并不承诺会等待它运行结束,因为一个对象在finalize()方法中执行缓慢,或者发生了死循环,将很可能会导致F-Queue队列中的其他对象永久处于等待状态,甚至导致整个内存回收系统崩溃。如果对象在finalize()中重新与引用链上的任何一个对象建立了关联,那么在第二次标记时它将被移出F-Queue。

  3. 垃圾收集算法

    • 标记清除算法:先将可回收的对象标记,然后回收。
    • 复制算法:将内存分为两份,将不可回收的对象复制到另外一份内存,然后全部回收这个一份内存
    • 标记整理算法:将所有不可回收的对象移动到一端,然后清理掉边界以外的所有内存
    • 分代收集算法:根据对象的存活周期不同,将内存划分为几块,不同的区域使用不同的收集算法
  4. 垃圾收集器

    • Serial收集器:它进行垃圾收集的时候,必须暂停其他所有的工作线程(Stop The World),对于运行在Client模式下的虚拟机来说是一个很好的选择
    • ParNew收集器:Serial收集器的多线程版本,是许多运行在Server模式下的虚拟机中首选的新生代收集器。
    • Parallel Scavenge 收集器:它也是使用复制算法的收集器,又是并行的多线程收集器,它关注的目标是达到一个可控制的吞吐量(Throughput)
    • Serial Old收集器:是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理算法”,主要意义也是被Client模式下的虚拟机使用。
    • Parallel Old 收集器:是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
    • CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都几种在互联网站或B/S系统的服务器上。基于“标记-清楚”算法实现,整个过程分为4个步骤:
      • 初始标记(CMS initial mark)(需要‘Stop The World’,速度很快)
      • 并发标记(CMS concurrent mark)
      • 重新标记(CMS remark)(需要‘Stop The World)
      • 并发清除(CMS concurrent sweep)
    • G1收集器:基于“标记-清楚”算法,可以非常精确的控制停顿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值