前言

判断对象可被GC回收有两种办法分别是:引用计数算法根可达性算法

引用计数算法

引用计数算法是一个已经被淘汰的算法,它是给每个对象加一个计数器,当有其他对象引用该对象时,该对象的计数器加一,当这个引用失效时,计数器就会减一,当该对象的计数器为零时,就会认为该对象可以被所回收。

引用计数算法是一个简单并且高效的算法,但这种算法却有一个非常大的弊端。就是这种算法会造成对象的循环引用,导致即使这个对象不再被需要,仍然存在一个一直指向它的引用,使得计数器不为零,导致该对象无法被回收,造成内存空间的浪费。

例如:假设存在对象A与对象B,他们之间的引用关系如图所示:

即时A、B对象已经没有被其他对象所引用了,但他们之间仍然有一条引用指向对方,导致对象A、对象B的计数器都不为零,从而使得A、B对象都没法回收。

根可达性算法

根可达性算法是JVM默认的算法,他的原理就是定义一系列的根,我们把这些根称为:GC Roots。从GC Roots开始向下搜索,中间查找的路径被称为:引用链

当一个对象到GC Roots之间没有任何引用链相连接时,我们就认为这个对象可以被GC回收。

根可达性很好的解决了对象循环引用问题。

例如:

如上图所示,我们可以发现Object 6与Object 7、Object 8之间存在引用关系,但是他们到GC Roots之间没有任何一条引用链,因从Object 6、Object 7、Object 8都可被回收。

Java的四种引用类型

在上述判断对象在何时能被GC回收是,我们多次提到了引用,那大家一定好奇什么是引用?引用有分为那些类型?一下我们就一一列举。

什么是引用?

举个例子:假设我们创建了一个创建了一个User对象,就像这样:new User(),但是也仅仅是创建了一个对象,并没有办法访问它。如果我们要访问这个对象,就必须指定一个User类型变量来表示这个对象:User user = new User(),user又被叫做"引用","="是指user这个引用指向User对象。 所以,java里对象的引用就是一个类类型的变量指向创建出来的对象

引用有分为那些类型?

在Java中引用被分为四种类型:强引用、软引用、弱引用、虚引用

强引用

强引用是最频繁使用的一种引用,当一个对象具有强引用时,GC绝对不会回收这个对象。当内存空间不足,JVM宁愿抛出内存溢出错误,也不会随意回收强引用对象。

如果强引用对象不再使用,可以通过弱化的方式回收该对象,弱化方式有两种分别是:

  1. 如果不在使用该对象,就及时将对象指向null,这时GC就会认为该对象不存在引用,但具体什么时候回收仍取决与GC算法
  2. 弱化的第二种方式,就是让不在使用的对象超出它的作用域范围,例如在方法中存在的对象当这个方法调用结束,GC就会回收这个对象

软引用

软引用是对内存敏感的引用。如果内存空间充足,GC就不会回收软引用对象,如果内存空间不足,GC就会回收软引用对象。采用SoftReference来创建一个软引用对象

//强引用
String str = new String("hahaha");//软引用
SoftReference<String> softReference = new SoftReference<String>(str);

弱引用

弱引用是不管内存是否充足,只要在GC扫描的过程中发现了弱引用对象,就会回收该对象。采用WeakReference创建弱引用对象

//强引用
String str = new String("hahaha");//弱引用
WeakReference<String> weakReference = new WeakReference<>(str);

虚引用

虚引用是最弱的一种引用关系,如果一个对象是虚引用,那么这个对象就和没有任何引用是一样的,随时都可能被回收。虚引用的主要作用是用来跟踪对象被垃圾回收的活动

如何判断对象可被GC回收?相关推荐

  1. java gc 例子_Java 中, 为什么一个对象的实例方法在执行完成之前其对象可以被 GC 回收?...

    收到好多邀请-泻药泻药.其中有好些感觉是想来吃瓜的. 所以请让我先跑个题,为吃瓜群众献上几个传送门: private static void newSingleThreadPool() { Execu ...

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

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

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

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

  4. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  5. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

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

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

  7. GC回收垃圾对象过程

    GC回收垃圾对象需要完成的三件事 1.哪些内存需要回收? 2.如何判断对象是否该回收? 3.如何回收垃圾对象? 哪些内存需要回收 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生随线程而灭.虚拟机栈 ...

  8. 判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制 ...

  9. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

    文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...

最新文章

  1. 【Web安全】Weak Session IDs (弱会话IDs)-burp进行Cookie劫持
  2. laravel CURD ORM
  3. springboot开启jms服务监控jvm运行情况
  4. 操作系统和数据库的知识梳理(思维导图)
  5. 【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)
  6. ac3168无线网卡驱动下载_更换BCM94360CS2网卡,拯救黑苹果无线网络
  7. 25岁php,“最好的语言“ 25 岁了,PHP说要走向安全和开放!
  8. spring-boot-devtools 热部署
  9. Lock应用之 读写锁
  10. 无法为类型 CuteEditor.Editor 授予有效的许可证。
  11. java jsm_JSM 基础
  12. 基于局部敏感哈希的协同过滤算法之simHash算法
  13. sketchup 255个su常用插件)_[插件课堂] SU.KIT发布了v2020,完美支持SketchUp 2020
  14. hbase 查询固定条数_HBase统计表行数(RowCount)的四种方法
  15. linux服务器怎么安装证书,linux服务器证书安装指引
  16. 判断一个数是否为素数
  17. C++ 输入输出加速挂(ACM竞赛常用)
  18. IBM SPSS Statistics如何快速有效地录入数据
  19. 并发与同步、信号量与管程、生产者消费者问题
  20. 创立10年,已成为自助建站翘楚的 Squarespace .这五大成功经验.

热门文章

  1. 【SDK】Left 4 Dead 2 Authoring Tools 完美整合版
  2. 自动化工具 WEB 自动化工具
  3. 人体可以为手表供电了!运动 10 分钟,供电半小时
  4. linux 下 mount 挂载 无写文件权限问题解决
  5. Android基于rxjava2+retrofit2实现断点续传下载,模拟支付宝更新app
  6. 54-JavaBean、综合案例
  7. 每日科技新闻速递 2022/08/19
  8. js+css+html制作下拉菜单
  9. 教务系统抢课程序原理
  10. 量子计算 9 量子力学与现实世界