谈到垃圾回收,就不得不说如何判断一个对象是不是垃圾?是否可以在本次收集活动中清理掉?所以就需要一种算法来判断一个对象是应该生存还是死亡。目前主要有两种算法,一种是引用计数法(python语言采用此算法),另一种就是这里要讲的可达性分析算法(java,c#等语言)主要思路 可达性分析算法的主要思路是先找出一批根节点对象集合作为GC Roots(可称为根节点枚举),然后从这批根节点出发,查找其引用关系(类似于深度优先搜索),最终形成如下图这样的反映对象间依赖关系的图,若某些对象没有任何引用链与GC Roots相连(如下图中的Object5,Object6,Object7),则说明这些对象就是垃圾对象,是可以被垃圾收集器回收的。

GC Roots

如下这些对象就可以作为GC Roots对象:

​ 虚拟机栈中引用的对象(参数,局部变量等)

​ 方法区中类静态变量

​ 方法区中常量引用的对象

​ 本地方法栈中引用的对象

​ 被同步锁(synchronized)持有的对象

​ JMXBean等实现原理

​ 从思路上来看,可达性分析算法很简单,就两步,第一步找出GC Roots,第二步从GC Roots开始向下遍历整个对象图。但在真正的实现中,还是有很多地方值得注意的。

​ 就拿根节点枚举来说。整个方法区那么多类,常量信息,若一个一个来检查那些可做GC Roots,耗费的时间肯定不少,所以在HotSpot虚拟机中就通过一组OopMap的数据结构来记录哪些位置是引用,在类加载完成后就将哪个对象内什么偏移量上是什么数据类型计算出来,这样收集器就可以直接得知这些信息,而不需要依次遍历整个方法区。

​ 而第二步从GC Roots向下遍历对象图则有很多优化措施,例如,如何让用户线程与垃圾收集线程并发运行?并发运行会产生什么问题?有哪些解决方案?

​ 对于CMS收集器是通过增量更新来解决并发标记问题的,而G1,ShenanDoah垃圾收集器则是通过原始快照来(Snapshot At The Beginning,SATB)解决并发标记问题。这两种解决方案分别是破坏了会导致并发标记产生问题的两个必要条件之一。至于这两个必要条件是啥,可参考三色标记理论。

java可达性_可达性分析详解相关推荐

  1. java内存分析详解_深入java内存查看与分析详解

    1:gc日志输出在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationS ...

  2. java基础_题库详解

    删除线格式 # 1 JDK和JRE有什么区别? JRE:Java Runtime Environment( java 运行时环境).即java程序的运行时环境,包含了 java 虚拟机,java基础类 ...

  3. java即时编译器_即时编译器 (JIT) 详解

    最近听我的导师他们讨论Java的即时编译器(JIT),当时并不知道这是啥东西,所以就借着周末的时间,学习了一下! 一.概述 在部分的商用虚拟机(Sun HotSpot)中,Java程序最初是通过解释器 ...

  4. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  5. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

  6. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  7. 【Java基础】HashMap原理详解

    [Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...

  8. [java] 虚拟机(JVM)底层结构详解[转]

    [java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...

  9. 转:Java 7 种阻塞队列详解

    转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...

  10. (best!)JAVA中文字符编码问题详解

    转载自:http://blog.csdn.net/youyue/article/details/4580402 JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应 ...

最新文章

  1. 多视图立体几何PatchMatchStereo:DSI与Cost Volume
  2. swift_026(Swift 的类型转换)
  3. 网红送餐无人车被指用人冒充AI始末:没有人工,就没有智能
  4. Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
  5. 0311互联网新闻 | 知乎增加“视频回答”入口;苹果将最早于今年年底生产AR设备...
  6. Python Django 数据缓存存储位置类
  7. java架构师眼中的高并发架构
  8. JS判断鼠标从哪个方向进入DIV容器
  9. 获取js里添加的css文件,用JS添加一个css文件
  10. 【Elasticsearch】使用两阶段提交在 Elasticsearch 中模拟事务功能
  11. Spark RDD Transformation
  12. 机器学习笔记——随机森林
  13. 国际象棋游戏界面和简易棋谱规则-最新Python学习成果
  14. 理想的低通滤波器、巴特沃斯滤波器、高斯滤波器
  15. 决策树算法与python——心脏病预测
  16. 宋体(Simsun)和新宋体(NSimsun)的区别
  17. 计算机显卡怎样安装方法,台式机显卡怎么安装?教您安装方法
  18. 如何用html实现图片轮播,怎么单纯的用html+css实现图片轮播?
  19. 《幕后产品:打造突破式产品思维》读书笔记
  20. ROM(只读存储器)

热门文章

  1. 计算机网络实验报告实验台,计算机控制实验台
  2. 小程序Vant组件库的使用
  3. 车辆颜色分类网络—BeerNet
  4. c语言全局变量global,C语言定义共享全局变量
  5. element cannot be mapped to a null key
  6. 适合数码家电行业用的进销存,一个软件顶一百个人工不是梦
  7. IEC 60601-1-2020 最新英文-医疗电气设备--第1部分 基本安全性及性能的一般要求
  8. imindmap思维导图免费下载
  9. 京瓷p5018cdn教程_京瓷ECOSYS P5018cdn驱动
  10. tree.js实现3D效果,官网demo