一、引用计数法

给对象添加一个引用计数器,但凡有一个地方引用它,就给计数器的值+1,引用失效就-1;任何时刻计数器为0的对象,不能再被使用了。主流的JVM中没有使用“引用计数法”来管理内存,主要是因为它很难解决对象间的互循环引用的问题。

二、可达性分析算法

通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始往下搜索,搜索走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时(从GC Roots到这个对象不可达),证明此对象是不可用的。即会被判定为可回收对象。
Java中可作为GC Roots的对象包括:①虚拟机栈(栈帧中的本地变量表)中的引用的对象②方法区内类静态属性引用的对象③方法区内常量引用的对象④本地方法栈中JNI(Native方法)引用的对象;总的来说,就是方法运行时,方法引用的对象、类的静态变量引用的对象、类中常量引用的对象、Native方法中引用的对象。
在可达性分析算法中,要想真正宣告一个对象的死亡,至少要经历两次标记过程:①对象在进行可达性分析后,发现没有与GC Roots相连接的引用链,就会被第一次标记并进行一次筛选,筛选的条件是此对象是否有必要执行**finalize()**方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过了,虚拟机将会把这两种情况视为“没有必要执行”; ②如果这个对象被判定为有必要执行finalize()方法,那么这个对象就会被放在F-Queue队列中,并在稍后被一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC回对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()方法中成功自救,只需重新与引用链的的任意一个对象建立关联即可(如把自己赋值给某个类变量、对象的成员变量),那么在第二次标记时它会被从“即将回收”的集合移除。如果对象还没有逃脱,那就真没救了。

三、判断对象是否存活与“引用”有关

在JDK2之后,Java对引用的概念进行了扩充,分为强引用、软引用、弱引用、虚引用。强度依次减弱。
强引用:在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,被引用的对象就不会被收集器回收。
软引用:描述一些还有用,但并非必须的对象。在系统将要发生内存溢出异常之前,会把这些对象进行二次回收。
弱引用:用来描述非必须对象的,这些对象只能存活到下一次垃圾收集之前。一旦垃圾收集器开始工作,不管内存是否充足,此类对象都会被回收掉。
虚引用:一个对象是否有虚引用的存在,不会对生存时间产生影响,更无法通过一个虚引用来获得对象实例。为对象设置虚引用的目的就是这个对象在被回收时能够得到一个系统的通知。

JVM判断对象是否已死?相关推荐

  1. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...

    JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...

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

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

  3. java判断对象已死_Java的JVM判断对象已死的基本算法分析

    jvm中有各种的垃圾收集器,每个收集器都有各自的算法.但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础. 01两个基本算法 a.引用记数法:对象中加一个引用计 ...

  4. JVM 判断对象已死,实践验证GC回收

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  5. JVM判断对象是否存活

    引用计数法 可达性分析算法 引用计数法 给对象添加一个引用计数器,每当有一个地方引用,计数器就加1,当引用失效,计数器减1,计数器为0的对象没有被使用,Java中没有使用引用计数法,原因是引用计数法无 ...

  6. 对象已死?及其判断算法

    在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就 是要确定这些对象之中哪些还"存活"着,哪些已经"死去"("死 ...

  7. 如何判断对象是否是垃圾

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 我们都Java会自动进行内存管理,JVM会进行垃圾回收,哪它是怎么判定哪些是"垃圾&quo ...

  8. 【深入Java虚拟机JVM 07】JVM如何判断对象已死

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些 ...

  9. python程序如何执行死刑图片_如何判断对象已死

    已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...

最新文章

  1. Nat. Mach. Intell. | 集成深度学习在生物信息学中的发展与展望
  2. NEO共识节点推荐搭建步骤
  3. 2020年春季学习信号与系统课程作业参考答案-第十一次作业
  4. 第一章·MySQL介绍及安装
  5. 微擎jsapi支付必须传openid怎么解决_面经腾讯微信支付面试记
  6. UVA 11733 Airports
  7. Android两个控件叠在一起,如何让被挡住的控件显示出来
  8. B站网站后台工程源码泄露 用户信息还安全吗?
  9. 爬虫笔记之实战(一):爬取猫眼电影排行
  10. 【已解决】node.dll丢失怎么办?计算机丢失node.dll是什么意思?
  11. 腾讯app看视频看不了显示服务器没有返回,腾讯视频TV版暂停服务怎么办?教你方法!...
  12. 1.CPU基本工作流程
  13. python不解压直接提取文件_不解压直接读取压缩包中的文件
  14. Unity3d简谐运动振屏效果实现
  15. 中国大陆手机号码如何注册谷歌账号?解决手机收不到验证码
  16. 可视化行程管理app_可视化流量:时间行程,扭矩和时间图
  17. 大脑简史(1)-历史上的大事件
  18. 微信小程序开发(三)——IE盒子,Flex弹性布局,色子六面
  19. 安全运营 splunk入门
  20. windows server 2012 r2 及 server 2019的sxs文件

热门文章

  1. 油猴脚本第一家,网页网盘链接实时判断+资源搜索网站导航,资源重度患者的福利...
  2. python面试题之“该死的for循环系列”(二)
  3. html中,纯数字或纯英文的一串字符超出父容器不会折行显示,如何解决?
  4. 组成关系映射(注解)
  5. Android开发中使用七牛云存储进行图片上传下载
  6. ThreadLocal 简介
  7. 【6】Zookeeper脚本及API
  8. CentOS7 搭建GIT环境
  9. 局域网语音通话demo
  10. Flask web开发之路四