三、GC简介

目录

一、概念

二、GC算法

可触及性

引用计数法​

标记-清除​

标记-压缩​

复制算法​

标记-复制(整合标记-压缩与复制)

三、stop-the-world(全局暂停)


一、概念

  • Garbage Collection(垃圾回收):将无用的对象进行清理以释放空间;
  • GC的对象是JVM堆空间和永久区(1.8之后改为元空间);

二、GC算法

  • 可触及性

    • 进行垃圾回收之前需要确定哪些对象是可触及(存活)的;
      • 栈中引用的对象,因为java程序执行都是在栈中执行;
      • 方法区中静态变量引用的对象或者产量;
    • 从根对象出发,可达的对象为可触及对象;
    • 可复活:引用被释放后的对象为可复活对象;(A a = null;);
    • finalize()方法中可复活的对象,且复活的对象不可被回收,避免使用finalize()方法,用try-catch-finally代替;
  • 引用计数法

    • 当一个对象被引用一次,该对象的引用计数器就+1;当引用失效时,引用计数器-1,当一个对象的引用计数器为0时说明该对象没有被引用,即可回收;
    • 存在问题:
      • 对象被引用和去引用伴随着运算,影响效率;
      • 无法处理循环引用的问题:两个对象A、B,A中引用B,B中引用A,但A、B都已经不被根节点引用,实际上A、B均可被回收,但由于引用计数器不为0无法被回收;
    • 没有被java使用
  • 标记-清除

    • 标记:从根节点出发,标记出所有可被追寻的对象(可达对象);
    • 清除:清除所有未被标记的对象;
    • 会造成内存空间不连续;
  • 标记-压缩

    • 标记:从根节点出发,标记出所有可被追寻的对象(可达对象);
    • 压缩:将标记的对象移到内存一端,然后清空边界外的空间;
    • 适用于存活对象较多的地方,比如老年代;
  • 复制算法

    • 将内存分为两块大小完全相等的空间,每次只使用其中一块,进行回收时,将所有存活对象复制到空闲的空间中,情况原先的空间;
    • 至少浪费了一半空间;
    • 适用于新生代,因为新生代存活的对象相对较少,复制次数不多(老年代存活对象较多,几乎要复制整个内存空间)
  • 标记-复制(整合标记-压缩与复制)

    • 为解决复制算法对空间的浪费情况,整合标记-压缩与复制算法;
    • 将大对象和到达一定年龄(回收一次依然存活年龄+1)的对象移入单独的内存中(老年代),将回收次数还未达到指定年龄的对象移入空余的空间(to surivor);
    • 大对象直接放入老年代
      • 新生代内存比老年代小,可能放不下;
      • 新生代放入大对象之后,其它小对象可能放不下;
  • 分代思想
    • 由于对象的不同特性,有些对象存活时间短,有些对象存活时间长,适用的垃圾回收算法也不同;
    • 少量对象存活的区域适合复制算法,因为要复制的对象不多;大量对象存活的区域适合标记-压缩算法;

三、stop-the-world(全局暂停)

  • 进行垃圾回收时,会暂停所有工作线程,因为工作线程会产生新的垃圾,一边回收垃圾,一边生产垃圾会导致回收不干净;
  • 全局暂停多半由GC造成;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值