根搜索算法有没有人了解过的,在垃圾回收机制里面判断对象存活,主要是使用根搜索算法进行实现的,根搜索算法可能稍微有点抽象,算法是怎么进行实现的,又叫GCRoots,类似于树形结构一样的,他怎么样进行实现出来的,GC Roots到底是什么目的,他其实是判断是否有依赖关系,如果你没有和GC Roots做引用关系的话,我认为是不可达对象的,就会被垃圾回收进制给回收掉的,判断是否可达,是通过什么原理实现的呢,需要和根节点有依赖关系,如果没有和我的GC Roots没有任何的引用的情况下,这个就是不可达对象了,这个时候GC就会认为是不可达对象,怎么样才判断可达呢,就是你的对象要和我的GCRoots要形成一个关联,必须要和我的GC ROOTS要有引用的情况下,这个时候GC就会认为是可达对象,一定要和GC ROOTS产生关联,如果没有关联的情况下是一个不可达对象,就会给垃圾回收机制给回收掉,GC ROOTS到底是做什么的比较绕,GC ROOTS其实相当于使用栈,还有方法区的类静态属性引用对象,包括方法区的常量引用对象,还有JNI native方法引用的对象,比如我现在来一个对象叫user1,我这边再来个对象叫user2,这里又user1和user2对象,user1和user2之间没有任何关系,user1和user2都引用到GC ROOTS,比如这个时候再来一个对象,叫做user3,user3他去引用到一个user1,这个时候也有一个可达对象,他底层怎么做的,从GC ROOTS去遍历出来,找到下面的子节点,如果有任何关联的话,都会认为是可达对象的,如果遍历GC ROOTS,如果没有任何依赖的情况下,没有和我GC ROOTS有任何依赖的情况下,那么这个时候就会认为是不可达对象的,这个时候有这个场景,这个场景用的还是比较多的我来一个对象叫做user5,我再copy一个,叫做user6,然后我再来一下user7,user6和user7有依赖关系,user5和user6,user7会不会来及回收进制回收掉呢,user5创建好了之后,没有被任何引用,user6又被user7被引用的情况下,因为这个时候没有GC ROOTS引用的情况下,就会被垃圾回收机制给回收掉,因为它没有GC ROOTS这个根节点,那么我们再反过来说,什么是GC ROOTS,GC ROOTS相当于他是怎么来的,这个时候只要你有一个虚拟的栈,你只要有这样的一个局部变量,能够去引用对象,或者是方法区的引用对象,或者是方法区常量引用对象,方法区JNI native方法引用对象

这个图其实还是很难描述GC ROOTS原理,在这里我又画个图你就知道GC ROOTS的原理了,在这里我画一个非常详细的图你们就知道他们的原理了在这里我们举个例子,方法区主要是存放一个静态信息,那我来问一下你们,方法区能不能做一个GC ROOTS,方法区肯定能的,只要你和GC ROOTS进行关联起来,这个时候垃圾回收机制就会认为有可达对象了,我们这里再来一个堆内存,你知道我们的对象都是在堆内存里面的,然后我们再来一个虚拟机栈,我们可以把他叫做虚拟机栈,就叫栈吧,我们这里还有一个本地方法栈,比如这个时候我们方法去在虚拟栈里面,然后我们栈在GC ROOTS,这个时候我的堆里面有这么几个对象,有哪几个对象呢,比如第一个对象我们把他叫做user1,user1方法区里面是谁在引用他呢,是被方法区引用到了,这个时候我们再有一个对象叫做user2,user2被虚拟机栈引用,然后我们还有一个user3,user3没有任何依赖关系,我们再来一个user5,user5去依赖user3,我把图画完了之后你们就知道什么意思了,接着我又来一个对象叫做user4,user4可能会被本地方法栈所依赖到,那我就把箭头给你画好点,然后我再来一个user6,user6引用到了user4的情况下,这个时候我来问你们,垃圾回收机制,首先方法区,虚拟机栈,本地方法区,都可以做为一个GC ROOTS,只要你能够被别人引用到的话,只要把GC ROOTS作为一个节点,找到这样的一个依赖关系的情况下,是可达的,垃圾回收机制是不会被回收掉的,如果没有和GC ROOTS做关联的情况下,我就会认为是垃圾回收对象,会被回收掉的,这个时候你们可以想一下,1,2,3,4,5,6哪些对象可达,哪些对象是不可达的,1,2,4,6首先是可达对象的,但是3和5你们有一个误区,3和5不是也有依赖关系吗,他确实有依赖关系,但是3和5没有和GC ROOTS做关联,我GC ROOT遍历的时候,我可能认为找不到你,我就认为是不可达的对象,因为它没有GC ROOTS,这就是根搜索算法,这就是可达性算法,这个图是我自己原创出来的

因为这个图理解起来比较绕,主要是让大家能够理解起来,根搜索算法的基本思想就是使用GC ROOTS作为起点,从这个起点开始往下搜索,如果没有找到任何相关联的话,我就认为此对象就是不可达对象的,要是如果你们相互引用的情况下,就是有关联的情况下,我就认为是可达对象,GC ROOTS其实我们可以认为是被引用对象,这样理解就行了,像我们刚才说的方法区,虚拟机栈,本地栈,都是GC ROOTS的

如何判断对象是否存活之根搜索算法相关推荐

  1. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用

    我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题.另外,本文还要谈 ...

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

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

  3. 垃圾回收器判断对象是否存活

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

  4. 如何判断对象是否存活之引用计数发

    垃圾回收机制是怎么判断一个对象是否存活的,为什么要讲这个呢,这个讲完你就明白,新生代是怎么做晋升的,他的存活有几个方向点,垃圾回收对象是怎么判断存活的,哪几种,首先第一种引用计数法,根搜索法,GC r ...

  5. 三、垃圾收集之判断对象是否存活

    2019独角兽企业重金招聘Python工程师标准>>> 一.引用计数算法 当有一个地方引用这个对象时,计数器加1 当引用失效时,计数器减1 当计数器为0时,则对象死亡,等待回收 二. ...

  6. JVM判断对象是否存活

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

  7. JVM怎么判断对象是否存活

    https://blog.csdn.net/qq_29860591/article/details/111244593

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

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

  9. 判断对象是否可回收、垃圾回收算法

    本节将会介绍下判断对象是否都能回收的两种方式:引用计数法.可达性分析,另外会介绍一下常用的垃圾回收算法:标记清除算法,复制算法,标记整理算法,分代回收算法. 目录 对象是否可回收 引用计数算法 可达性 ...

最新文章

  1. 将用户添加至sudoers列表
  2. python的用途实例-Python基础之函数原理与应用实例详解
  3. 重视细节,方能得到认可
  4. 谷歌大脑科学家亲解 LSTM:一个关于“遗忘”与“记忆”的故事
  5. c++栈和java栈的区别
  6. [51nod1264]线段相交
  7. Spring Boot 2.1 版本变化[翻译]
  8. tortoisegit图标消失_TortoiseGit文件夹和文件图标不显示解决方法
  9. linux删除了mount目录,Linux记录-分区(df/fdisk/mount/umount/fuser)
  10. python docx表格宽度_RPA手把手——python-docx 设置 word 文档中表格格式
  11. 其他综合-使用Xshell远程连接管理Linux实践
  12. box2dweb基础
  13. 190109每日一句
  14. linux扫描后门工具,Linux下rootkit后门检测工具chkrootkit安装使用教程
  15. 0基础入门VTD-实操静态道路建模3
  16. 前端实现街道地图_webgis前端地图功能展示
  17. 你以为你在利用碎片化时间,实际上你的时间被碎片化了
  18. 在python中month函数的用法_python @classmethod 的使用场合
  19. Python游戏概率保底算法PRD的实现
  20. 计算机图形学 构成立方体数据结构的简单表结构,计算机图形学-沈工大作业管理ppt课件...

热门文章

  1. linux下格式化U盘
  2. zigbee 协议栈的时钟和定时器分频
  3. CrtInvertedIdx
  4. NYOJ-42 一笔画问题
  5. (精)tomcat 源码学习
  6. JavaScript 发布-订阅模式
  7. Android `AsyncTask`简要分析
  8. 前端er怎样操作剪切复制以及禁止复制+破解等
  9. ueditor1_4_3_3编辑器的应用
  10. easyui tab