Java垃圾收集方法

对象是否已死

引用计数算法

给对象添加一个引用计数器,每当一个地方要引用它时,计数器的值就加一;当引用失效,计数器值就减一。
看似合理,但是没法解决对象间互相引用的问题。

可达性分析算法

通过“GC Roots”的对象作为起始点,向下搜索,当一个对象到GC Roots没有任何引用链相连,则说明对象不可达,即对象不可用。
可以作为GC Roots 的对象包括:

  • 栈帧中引用的对象
  • 方法区静态类属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈引用的对象
引用

如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用:

  • 强引用(Strong Reference):只要强引用在,垃圾回收机制永远不会回收掉被引用的对象
  • 软引用(SoftReference):将要发生内存溢出之前,会把这些对象列入回收范围进行第二次回收。若这次回收还没有足够的内存,才抛出溢出异常
  • 弱引用(Weak Reference):只要发生垃圾回收,就把他干掉
  • 虚引用(Phantom Reference):其存在与否无影响,只是在回收时会反馈一个信息
对象的自救

一个对象要真正被判死刑,需经历两次标记:

  • 若对象不可达,判断对象是否有必要执行finalize()方法:
    没有必要执行:
    ①没有覆盖此方法
    ②此方法已经被调用过
  • 若执行,则放在一个F-Queue队列中,稍后由一个优先级低的Finaizer线程执行它,只要对象在被执行之前重新与引用脸上的任何一个对象建立关联即可。
    但是只有一次自救机会
回收方法区

条件:

  • 该类所有实例都被收回
  • 加载该类的ClassLoader已经被回收
  • 该类对应的Java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

垃圾收集

标记-清楚算法

标记要回收的对象,标记完后统一回收所有被标记的对象
不足:①效率,标记和清楚效率都不高
②空间,清楚产生大量内部碎片

复制算法

把内存分成两半,每次把其中存活的对象复制到另一半空白处,然后把原来那半全部干掉
缺点:内存只剩下了一半,浪费太多(所以现实中,并不是按照1:1)

标记-整理算法

让存活的对象向一端移动,把不是边界的部分清除掉

分代收集算法
  • 新生代:复制算法,因为有大量对象被干掉
  • 老年代:标记-清理 或 标记-整理 ,因为存活率高,并且没有额外空间对它进行担保。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值