原标题:Java中JVM判断对象已死的基本算法分析

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

一、两个基本算法

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

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

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

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

两种算法对比如下:

二、GC 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本身所需要的对象,这类对象肯定不能被回收。

三、Java的引用

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

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

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

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

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

对比如下图:

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

四、两次标记

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

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

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

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

责任编辑:

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

  1. java判断集合为空工具_java中怎么判断集合是否为空

    java中怎么判断集合是否为空 发布时间:2020-06-25 15:43:36 来源:亿速云 阅读:103 作者:Leah 这篇文章将为大家详细讲解有关java中判断集合是否为空的方法,文章内容质量 ...

  2. java 什么时候进行垃圾回收_Java中垃圾回收有什么目的?什么时候进行垃圾回收?...

    仅提供一个大致的思路: 垃圾回收(gc)的目的是释放堆中不需要保存的对象,达到内存的充分利用. 1.回收哪些对象的判定 垃圾回收最简单的思路是采用引用计数的方式,即记录对象被引用的次数,直到一段时间内 ...

  3. java对象类型有哪些_Java中常用的对象数据类型有哪些?它们分别又占多少个字节呢?...

    CSDN上面有关于数据类型的一篇总结详细的文章,顺便复制过来: 在java中常见的数据类型有哪些 ? 内置数据类型类型名称字节.位数最小值最大值默认值例子 byte字节1字节,8位-128(-2^7) ...

  4. java 对象 转换 工具类_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...

    通用excel与对象相互转换的工具类 前言:最近开发需要一个Excel批量导入或者导出的功能,之前用过poi-ooxml开发过一个导入的工具类,正好蹭着这次机会,把工具类的功能进行完善. 使用说明: ...

  5. java判定输入是否为英文_java中如何判断输入的是英文还是中文

    字符 人们使用的记号,抽象意义上的一个符号. '1', '中', 'a', '$', '¥', -- 字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间. 0x01, 0x45, ...

  6. python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行

    展开全部 ${rr.right_name} 扩展资料 java控制台程序判断String字符e68a8462616964757a686964616f31333431373263串中只输入了一个回车: ...

  7. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

  8. java String如何回收_java中的垃圾回收

    原文-http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确 ...

  9. android 手动回收对象,Android Studio Studio回收列表中的JSON对象

    我想在recyclerview中显示一些JSON对象,并且希望它们在日期之后排序,我该如何实现?下面是下载从JSON URL的数据的方法:Android Studio Studio回收列表中的JSON ...

最新文章

  1. 快速撑握C#知识点系列文章
  2. DL之DNN之BP:神经网络算法简介之BP算法/GD算法之不需要额外任何文字,只需要八张图讲清楚BP类神经网络的工作原理
  3. oracle 10g进入ascmd,oracle 10g 默许用户名密码及解锁
  4. 找不到php的版本,php – 在任何版本中都找不到请求的包…
  5. SQL Server编写函数获取汉字的拼音码(简拼)
  6. 世界 Web 2.0 网站评奖揭晓
  7. 初级算法-12.反转字符串
  8. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)
  9. 因子分析——python
  10. CentOS6.5 常用命令
  11. 计算机上的mrc功能,计算器上的MRC有什么功能?
  12. 传输层的端口与TCP标志中的URG和PSH位
  13. java集合升序降序
  14. python合并多个excel工作簿_将多个excel文件合并到一个excel的多个sheet
  15. 从程序员到项目经理(28):该死的结果导向(只看结果,不问过程到底行不行?)
  16. ORACLE百例试炼五
  17. linux脚本自动验证,一个无需交互,批量自动连接ssh执行命令的工具(免rsa密钥指纹验证)...
  18. 无向简单图怎么判断_简单图的判定
  19. 区分PMOS管和NMOS管的巧妙记忆方法
  20. 零基础入门MATLAB(一篇十分钟)

热门文章

  1. MFC工作笔记0006---#pragma warning(disable:4996)是什么意思
  2. Netty工作笔记0030---NIO与零拷贝原理剖析
  3. Netty工作笔记0008---NIO的Buffer的机制及子类
  4. maven常用的中央仓库
  5. Java 8 新特性001_Java 8 Optional 类
  6. WM6.5中隐藏和显示任务栏、命令栏及输入面板
  7. 有36匹马,六个跑道。没有记时器等设备,用最少的比赛次数算出跑的最快的前3匹马
  8. java碰到乱码如何解决方法_如何处理java的乱码
  9. 素数c分解语言程序,PTA|《C语言程序设计实验与习题指导(第3版)》实验4-2-3 验证“哥德巴赫猜想” (20分)...
  10. 随想录(再论内存屏障)