jvm中有各种的垃圾收集器,每个收集器都有各自的算法。但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础。

01两个基本算法

a、引用记数法:对象中加一个引用计数器,每次被引用计数器加一,引用失效减一,当减到0的时候就不会在被再引用了,就可以回收了。

优点:原理简单,效率高。

缺点:有很多例外情况要用大量额外的处理,比如两个对象相互引用。

b、可达性分析:通过一系列“GC Roots”的根对象为起始,根据引用关系向下搜索,搜索路径形成引用链,而那些没有在任何引用链上的叫做不可达对象,都是不可能被再次使用的。如下图,红色部分就是需要回收的。

两种算法对比如下:

02GC Roots包含哪些

可达性分析首先要确认的是GC Roots,只有选择合适的GC Roots才能真正的找到应该存在的对象和排除不应该存在的对象。GC Roots主要包含以下:

a、虚拟机栈中的对象,就是各个线程的方法里面的方法参数、局部变量、临时变量。

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

c、方法区中常量引用的对象,比如字符串常量池的引用。

d、本地方法栈引用的对。

e、虚拟机内部的引用,基本类型对应的class对象,常驻异常对象,系统类加载器。

f、所有被同步锁(synchronized)持有的对象。

g、Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存。

可以把上面的大概分成几个方面,如下图:

GC Roots实际上就是当前JVM必须要的对象,可以分成三类。

第一类是JVM线程里面直接引用的对象,相当于正在执行的方法里面的对象,这些肯定是必须存活的。

第二类是设置的一些静态常量,比如我们在类里面用static final修饰的一些对象,这类对象至jvm启动到结束都会一直存在。

第三类就是JVM本身所需要的对象,这类对象肯定不能被回收。

03Java的引用

可达性分析就是根据引用来判断的,那么Java中有哪些引用呢?一共分4类引用:

a、强引用:常见的引用赋值,垃圾收集器不回收。ObjectA a=new ObjectA();

b、软引用:还有用,但非必须。在系统将要发生内存溢出前,把他们列为回收范围进行二次回收,JDK1.2后SoftReference类实现。

c、弱引用:非必须,比软引用更弱。下次垃圾收集器无论内存是否足够,均回收。JDK1.2后WeakReference类实现。

d、虚引用:最弱引用关系,虚引用不影响对象的生存,也无法通过虚引用来取得对象实例。唯一作用是可以在垃圾收集器回收前收到一个系统通知。JDK1.2后PhantomReference类实现。

对比如下图:

后面三个引用我们平时使用几乎没有,多在一些源码中出现,依靠3个类实现:SoftReference、WeakReference、PhantomReference。在看到这三个类的时候能知道对应的含义。

04两次标记

当一个对象被标记为不可达对象的时候并不一定是马上被回收的。如果对象重写了finalize()方法,并且finalize()方法还没有被执行过(finalize()方法只会被执行一次),那么这个对象会被放入F-Queue队列里面。会有一个Finalizer线程去执行队列里面对象的finalize()。如果finalize()方法把这个对象重新赋值给了其他变量,就叫做逃脱成功。

垃圾收集器会对F-Queue队列里的对象进行第二次标记,如果在上一步中成功逃脱的就会移除即将回收的集合。

对于逃脱的对象,在下次被标记成不可达对象时,就会被直接回收,因为finalize()方法已经执行过一次了。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

java判断对象已死_Java的JVM判断对象已死的基本算法分析相关推荐

  1. Java虚拟机笔记(五):JVM中对象的分代

    为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...

  2. java判断对象已经被回收_Java中JVM判断对象已死的基本算法分析

    原标题:Java中JVM判断对象已死的基本算法分析 jvm中 有各种的垃圾收集器,每个收集器都有各自的算法. 但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础 ...

  3. java中的vm自变量_java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 JVM的内部结构如下图: 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求 ...

  4. java对象序列化作用_Java学习之——理解对象序列化

    Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...

  5. java 对象的交互_Java中什么是对象的交互?解释一下交互怎么操作?

    其实并没有那个复杂.java中对象是什么,你要明白一点就是: 在java中万物皆对象 比如,实体类之间的互相调用,不想访问以及访问其他属性及其方法等. 不论你是线程,还是异步任务,还是...都可以用以 ...

  6. java 对象值拷贝_Java 值传递与对象拷贝

    setter/getter new 新对象后用 set/get 方法设置属性 浅克隆 被复制的类需要实现Clonenable接口(不实现的话在调用 clone 方法会抛出 CloneNotSuppor ...

  7. java怎么判断对象为空_java中怎么判断对象是否为空

    java中判断对象是否为空的方法: 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的:另一种是org.springframework.u ...

  8. java永生代和新生代_Java:永生的对象和对象的复活

    java永生代和新生代 什么是物体复活? 当没有其他对象引用该对象时,该Java对象可以进行垃圾回收. 当JVM:s垃圾收集器最终将要删除未使用的对象时,将调用该对象的finalize()方法. 但是 ...

  9. java string不为空_java如何正确判断String为空

    Hi多磨,大家好我是suleifi,今天给大家说说java中是如何处理String的. 在一个大佬非常多的QQ群中,我发现一位大佬截图了他自己的代码,他是用如下方式判断String是否为空的: //s ...

最新文章

  1. selenium python 一些操作和定位收集
  2. java多态强制类型转换_java多态和强制类型转换
  3. centos ruby通过rvm更新版本
  4. css 浮动在最上层_CSS编码规范
  5. config之安全(用户认证)
  6. webpack 谷歌地图_如何在Webpack中设置可靠且可维护的Google Analytics(分析)
  7. Linux基础(9)--延时与时间
  8. 【英语学习】【WOTD】thole 释义/词源/示例
  9. 最小生成树(模板 prim)
  10. 无盘服务器集群,镜像(无盘柜)-单活集群解决方案
  11. 动森11月19日服务器维护,动物森友会11月19日更新内容介绍
  12. HCIE-Security Day3:防火墙特征和组网方式
  13. 怎么样学好c++_怎么样
  14. 《计算智能导论》下载
  15. 计算机应用宣传传统文化,计算机应用工程系创建优秀传统文化特色班级侧记
  16. Drupal主题制作流程
  17. go 连接服务器 并存放图片_[本站大事件] 又更换服务器了 – 小文's blog
  18. 腾讯地图产业版 WeMap 官网正式发布
  19. 工行二维码支付时代来了
  20. VSCode-工控机远程开发 之(一) VSCode无法连接扩展商店

热门文章

  1. Ubuntu 进入单用户模式—修改启动项利器
  2. 到底是32位系统运行快还是64位系统快
  3. 计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...
  4. 运行时间_运行一段时间报高压保护
  5. Android studio 清除缓存数据的步骤
  6. 普通 项目打包包含第三方jar包
  7. eslint php,ESlint操作步骤详解
  8. 如何使用JavaScript控制台改进工作流程
  9. display转块状化
  10. 如何将视频设置为网页背景