1 引用计数算法

1.1 算法思想

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

1.2 特点

  • 优点:实现简单;判定效率高。
  • 缺点:很难解决对象之间相互循环引用的问题。(所以虚拟机不是通过引用计数算法判断对象是否存活)

2 可达性分析算法

2.1 算法思想

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

2.2 GC Roots的对象

  • 虚拟机栈(栈帧中本地变量表)中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(Native方法)引用的对象;

3 对象存亡判断

3.1 两次标记过程

真正宣布一个对象已死,必须经历两次标记过程:

  1. 如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,则将会被第一次标记并且进行一次筛选;
  2. 若这个对象被判定有必要执行finalize()方法,则该对象放置在一个叫F-Queue队列中,并之后由VM自动建立的、低优先级的Finalizer线程去执行它。
  3. finalize()方法是对象逃脱死亡的最后一次机会,稍后GC将对F-Queue队列中的对象进行第二次小规模的标记,若finalize()能够救活自己,则第二次标记时,将被移除出“即将回收”的集合;若对象没有完成自救,则回收。

3.2 补充

  1. 筛选的条件:这个对象有没有必要去执行finalize()方法?当对象没有覆盖finalize()方法或者finalize()方法已经被VM掉用过,则“没有必要执行“
  2. “执行”操作的触发:是VM会触发这个方法,而不承诺等它运行结束,原因:如果一个对象在finalize()方法中执行缓慢,或发生死循环,将导致F-Queue队列中其他对象永远处于等待,甚至导致整个内存回收系统崩溃。
  3. finalize()中对象自救:只要重新与引用链上的任何一个对象建立关联即可,譬如把自己(this关键字)赋值给某个类变量或者对象的成员变量。finalize()最多只会被系统自动调用一次,所以自救机会只有一次。finalize()方法的运行代价搞,不确定大,无法保证各个对象的调用顺序。

JVM—引用计数和可达性分析算法(存活性判断)相关推荐

  1. 对象是否要被回收(引用计数和可达性分析算法)

    java堆和方法区主要存放各种类型的对象(方法区中也存储一些静态变量和全局常量等信息),那么我们在使用GC对其进行回收的时候首先要考虑的就是如何判断一个对象是否应该被回收.也就是要判断一个对象是否还有 ...

  2. 【JVM】引用计数和可达性分析算法详解

    前言 JVM堆中几乎存放了所有对象的实例,那么垃圾收集器怎么确定哪些对象还"存活"着,哪些已经"死去"呢?本文主要介绍判断对象是否存活算法引用计数算法和可达性分 ...

  3. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

  4. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  5. JVM——引用计数算法与可达性分析算法

    前几篇博客我们一起认识了JVM的内存模型(程序计数器.虚拟机栈.本地方法栈.方法区与堆),了解了它们的内存结构与分配,同时也略带提到关于内存的回收. JVM--内存模型(一):程序计数器 JVM--内 ...

  6. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还"存活"着,哪些对 ...

  7. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  8. 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC

    31. 如何计算对象已死 31.1.引用计数器算法 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象 ...

  9. JVM:可达性分析算法

    在堆里存放着几乎多有的java对象实例,垃圾搜集器在对堆进行回收之前,第一件事情就是确定这些对象之中哪些还"存活"着(即通过任何途径都无法使用的对象). 一.可达性分析算法 在Ja ...

最新文章

  1. 肝完这篇垃圾回收,和面试官扯皮不怕了
  2. 未来30年,这20项技术将颠覆人类生活
  3. 惊艳了!升级版的 APDrawing,秒让人脸照变线条肖像画
  4. C语言 —— 运算符的优先级
  5. python docker自动化_自动化 – 自动创建docker容器并启动python脚本
  6. pytorch深度学习_深度学习和PyTorch的推荐系统实施
  7. 在精益(Lean)中对定理进行证明(第一章)
  8. linux查询文件重复记录,Linux 查询文件内容重复数 uniq
  9. Mysql 复制表结构
  10. 运用nginx和阿里云解析配置二级域名 设置不同端口号
  11. 利用随机数生成器生成固定概率生成器
  12. 自制原版mega2560(mega16U2 and mega2560 BootLoader 恢复再造)
  13. 如果恰巧有一台超微服务器,如何调节风扇转速
  14. redis 底层数据结构详解
  15. html中div动态边框,[实践总结]纯css实现动态边框
  16. 【计算机组成原理】CPU如何区分指令和数据
  17. 这3款可以把照片变3d的app,请你一定要收藏好
  18. 雷达跟踪软件 SPx Server
  19. 移动路由器当文件服务器,通过 SNMP 在路由器和 TFTP 服务器之间移动文件和镜像...
  20. 实验五 微控制器实验

热门文章

  1. Linux终端登录和退出Dockerhub
  2. SinGAN: Learning a Generative Model from a Single Natural Image
  3. python网络框架生产环境_配置Django框架为生产环境的注意事项(DEBUG=False)
  4. a 标签中 rel=“noopener noreferrer“属性的含义和功能
  5. Vue2.0项目安装Mint-UI - cmd篇
  6. WordPress主题-The7 v9.16.0主题模板
  7. 创建一列矩阵数字一样吗_吴恩达深度学习笔记(122) | NLP | 嵌入矩阵Embedding Matrix...
  8. java多重继承用在什么地方_Java提高篇——Java实现多重继承
  9. 考试君 - 基于.NET 5语言的Furion框架开发在线考试系统
  10. 让网站变成灰色插件 可以设定特殊时间