【GC 死亡对象判断】

哪些内存需要回收

如何判定哪些对象需要回收?在堆里面存放了几乎所有的对象实例,在GC之前第一件事就是要确定这些对象哪些还“存活”着,哪些已经“死去”。其中判断对象是否存活有两种算法:可达性分析算法、引用计数算法。

可达性分析算法

通过一系列的**“GC Roots”根对象作为始节点,开始往下遍历有引用**关系的对象形成一条“引用链”,通过这条引用链的可达的对象是存活的,不可达的对象则是不再使用。

那么什么样的对象可以GC Roots呢?主要是以下对象:

  1. 虚拟机栈中的引用对象
  2. 方法区的类静态的引用对象、常量的引用对象
  3. Java虚拟机内部引用:基本数据类型的Class对象、异常对象、系统类加载器
  4. 所有同步锁持有的对象
  5. 反映虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存。

可达性分析算法是大多数系统使用的对象存活判断算法。

引用计数算法

在对象中添加一个引用计数器,每当有一个地方引用它,计数器就+1,当一个引用失效,计数器就-1,当计数器>0时就表示对象为存活使用状态,不得回收。大多数不会用这个办法来判断对象存活,因为当对象实例相互引用时,当栈中的引用已经失效,对象也还是不能回收。


上面的可达性分析算法和引用计数算法都用到了引用,这种引用默认是强引用。在JDK1.2版本之后,Java除了有强引用外,还增加了三种引用:

  • 软引用(SoftReference): 内存溢出前,可对持有该引用的对象回收
  • 弱引用(WeakReference):GC就会被回收,相当于没有引用。
  • 虚引用(PhantomReference): 无法通过其获得对象实例,唯一目的是当对象被回收时能收到一个系统通知。

如果对象被可达性分析算法引用计数算法识别为无使用对象就可以被GC回收吗?不是,一个对象要至少要经过两个的标志过程。其还会查询对象是否重写了finalize()方法,如果重写了就会用另一个Finalize线程去执行这个finalize方法,这个方法可以时对象重新被引用,但官方并不推荐这样做。


堆中的对象实例可以使用可达性分析算法和引用计数算法来决定是否回收。但方法区的常量池和类型信息是否回收却另有条件:

  • 常量池的字符串和符号引用 虚拟机中没有任何对象有引用到它。

  • 类型卸载 1.该类的所有实例被回收 2.该类的ClassLoader被回收 3.Class对象没有被任何地方引用 以上三种条件同时被满足。

相关推荐

  1. GC 死亡对象判断

    2024-07-10 10:40:07       26 阅读
  2. JVM中的GC如何判断对象可以被回收

    2024-07-10 10:40:07       39 阅读
  3. 前端判断对象为空

    2024-07-10 10:40:07       66 阅读
  4. 判断对象存活的算法

    2024-07-10 10:40:07       36 阅读
  5. 生日判断星座【GO

    2024-07-10 10:40:07       27 阅读
  6. js 如何判断对象自身为空?

    2024-07-10 10:40:07       62 阅读
  7. ES6---判断对象是否为{}

    2024-07-10 10:40:07       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 10:40:07       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 10:40:07       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 10:40:07       90 阅读
  4. Python语言-面向对象

    2024-07-10 10:40:07       98 阅读

热门阅读

  1. [ABC275A] Find Takahashi 题解

    2024-07-10 10:40:07       24 阅读
  2. 洛谷 P2141 [NOIP2014 普及组] 珠心算测验

    2024-07-10 10:40:07       27 阅读
  3. 微软edge浏览器全解析

    2024-07-10 10:40:07       29 阅读
  4. react根据后端返回数据动态添加路由

    2024-07-10 10:40:07       27 阅读
  5. RedHat运维-Ansible自动化运维基础22-rhel-system-roles

    2024-07-10 10:40:07       22 阅读
  6. 深入浅出:Scikit-Learn基础教程

    2024-07-10 10:40:07       26 阅读
  7. python class

    2024-07-10 10:40:07       25 阅读
  8. 10.pwn ROP(栈溢出攻击的核心)

    2024-07-10 10:40:07       33 阅读
  9. sklearn基础教程

    2024-07-10 10:40:07       30 阅读
  10. 跨境支付新篇章:引领电商潮流

    2024-07-10 10:40:07       33 阅读