如何判断对象可被GC回收?
前言
判断对象可被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宁愿抛出内存溢出错误,也不会随意回收强引用对象。
如果强引用对象不再使用,可以通过弱化的方式回收该对象,弱化方式有两种分别是:
- 如果不在使用该对象,就及时将对象指向null,这时GC就会认为该对象不存在引用,但具体什么时候回收仍取决与GC算法
- 弱化的第二种方式,就是让不在使用的对象超出它的作用域范围,例如在方法中存在的对象当这个方法调用结束,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回收?相关推荐
- java gc 例子_Java 中, 为什么一个对象的实例方法在执行完成之前其对象可以被 GC 回收?...
收到好多邀请-泻药泻药.其中有好些感觉是想来吃瓜的. 所以请让我先跑个题,为吃瓜群众献上几个传送门: private static void newSingleThreadPool() { Execu ...
- 判断对象是否可回收、垃圾回收算法
本节将会介绍下判断对象是否都能回收的两种方式:引用计数法.可达性分析,另外会介绍一下常用的垃圾回收算法:标记清除算法,复制算法,标记整理算法,分代回收算法. 目录 对象是否可回收 引用计数算法 可达性 ...
- 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC
31. 如何计算对象已死 31.1.引用计数器算法 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象 ...
- 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )
文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...
- Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector
文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...
- bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...
JVM系列: 面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判 ...
- GC回收垃圾对象过程
GC回收垃圾对象需要完成的三件事 1.哪些内存需要回收? 2.如何判断对象是否该回收? 3.如何回收垃圾对象? 哪些内存需要回收 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生随线程而灭.虚拟机栈 ...
- 判断是否存在此对象_JVM的垃圾回收机制,判断对象是否死亡
这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制 ...
- JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?
文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...
最新文章
- 【Web安全】Weak Session IDs (弱会话IDs)-burp进行Cookie劫持
- laravel CURD ORM
- springboot开启jms服务监控jvm运行情况
- 操作系统和数据库的知识梳理(思维导图)
- 【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)
- ac3168无线网卡驱动下载_更换BCM94360CS2网卡,拯救黑苹果无线网络
- 25岁php,“最好的语言“ 25 岁了,PHP说要走向安全和开放!
- spring-boot-devtools 热部署
- Lock应用之 读写锁
- 无法为类型 CuteEditor.Editor 授予有效的许可证。
- java jsm_JSM 基础
- 基于局部敏感哈希的协同过滤算法之simHash算法
- sketchup 255个su常用插件)_[插件课堂] SU.KIT发布了v2020,完美支持SketchUp 2020
- hbase 查询固定条数_HBase统计表行数(RowCount)的四种方法
- linux服务器怎么安装证书,linux服务器证书安装指引
- 判断一个数是否为素数
- C++ 输入输出加速挂(ACM竞赛常用)
- IBM SPSS Statistics如何快速有效地录入数据
- 并发与同步、信号量与管程、生产者消费者问题
- 创立10年,已成为自助建站翘楚的 Squarespace .这五大成功经验.