美文网首页
对象死亡

对象死亡

作者: 隔壁丨王大爷 | 来源:发表于2018-08-27 15:59 被阅读8次

1、引用计数算法

给对象添加一个引用计数器,每当一个地方引用它时,计数器就加1,当引用失效时,计数器就减1,任何时刻计算器为0的对象就是不再被使用的。

优点:实现简单,判定效率高。

缺点:很难解决对象之间相互引用的问题。

2、可达性分析算法

通过一系列的称为“GC Roots”的对象作为起始点,从这个节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

Java中,可作为GC Roots的对象包括:

虚拟机栈(栈中的本地变量表)中引用的对象。

方法区中类静态属性引用的对象。

方法区中常量引用的对象。

本地方法栈中JNI(即一般说的Native方法)引用的对象。

3、引用

强引用:只要强引用还存在,垃圾回收器永远不会回收掉被引用的对象。

软引用:用来描述一些还有用但非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行二次回收。

弱引用:也是用来描述非必需对象的,被弱引用关联的对象只能生产到下一次垃圾回收之前。当垃圾回收器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

虚引用:是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存空间构成影响,也无法通过一个虚引用来获得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

4、finalize()

如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。(当对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机将这两种情况视为“没有必要执行”)

5、回收方法区

回收废弃常量和无用的类。

无用的类:

该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例。

加载该类的ClassLoader已经被回收。

该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

虚拟机满足上述三个条件也不一定必然回收,只是可以。

相关文章

  • 对象死亡

    1、引用计数算法 给对象添加一个引用计数器,每当一个地方引用它时,计数器就加1,当引用失效时,计数器就减1,任何时...

  • JVM读书笔记-对象回收算法-04

    怎么判断一个对象已经死亡,我们不如先说说什么才是对象死亡,一个对象死亡,其实就是这个对象不可能再被使用了,所以我们...

  • Java后端高频面试问题:垃圾回收机制

    1.如何判断对象是否死亡? 堆中⼏乎放着所有的对象实例,对堆垃圾回收前的第⼀步就是要判断哪些对象已经死亡(即不能再...

  • 线程的状态与生命周期

    新建 - 就绪 - 运行 - 阻塞 - 死亡 新建:实例化线程对象 就绪:向线程对象发送start消息,线程对象被...

  • 2.垃圾收集器与内存分配策略(1)

    本章要点 1.如何判定对象死亡2.垃圾回收算法3.垃圾收集器4.引用分类 1.判定对象死亡 要想知道如何垃圾回收,...

  • GC

    采用分代的方式回收内存,关于对垃圾进行回收,被引用的对象是存活的对象,而不被引用的对象是死亡的对象也就是垃圾,GC...

  • 无可避免

    无可避免的这是错误的对象 除了生命,写字,思想 其他都已死亡

  • 垃圾收集器

    垃圾收集器的工作区域如下图: 垃圾收集器 是按照标记存活对象实现的,而标记死亡对象 应该需要扫描所有对象,标记存活...

  • 垃圾收集算法

    本文只讨论垃圾收集的算法的思想 垃圾收集器 是按照标记存活对象实现的,而标记死亡对象 应该需要扫描所有对象,标记存...

  • 对象的生死判定和算法详解

    对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一个将死对象?...

网友评论

      本文标题:对象死亡

      本文链接:https://www.haomeiwen.com/subject/qhxtwftx.html