Java 中如何判断对象是否是垃圾?不同垃圾回收方法有何区别?
Java 中如何判断对象是否是垃圾?
在 Java 中,垃圾是指不再被引用的对象。JVM 使用以下两种方法判断对象是否是垃圾:
1. 引用计数法(Reference Counting)
工作原理
- 每个对象维护一个计数器,记录被引用的次数。
- 当引用计数为 0 时,说明对象是垃圾,可以被回收。
优点
- 简单高效,实时判断对象是否可达。
缺点
- 无法处理循环引用问题。
- 如下示例中,两个对象互相引用,但没有其他引用时,引用计数不会为 0:
class A {
A ref; // 引用另一个对象
}
A obj1 = new A();
A obj2 = new A();
obj1.ref = obj2;
obj2.ref = obj1;
obj1 = null;
obj2 = null;
// 循环引用导致无法回收。
2. 可达性分析法(Reachability Analysis)
工作原理
- 从 GC Roots(根对象)出发,搜索所有可达的对象。
- 如果对象无法通过 GC Roots 找到,则被视为垃圾。
GC Roots 包括
- 当前线程的栈中引用的对象。
- 静态字段引用的对象。
- 本地方法栈(Native Stack)中引用的对象。
优点
- 能正确处理循环引用问题。
示例:可达性分析法的应用
public class ReachabilityExample {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
obj1 = null; // obj1 不再引用该对象
System.gc(); // GC 会标记 obj1 原来的对象为垃圾并回收
}
}
在上述代码中:
- 当 obj1 被置为 null 时,其原来的对象无法通过 GC Roots 找到。
- 这种对象将被标记为垃圾并回收。
使用场景
是 Java 垃圾回收的主流方法,广泛应用于现代 JVM。
3. 总结
- 引用计数法:效率高,但无法解决循环引用问题。
- 可达性分析法:准确处理循环引用问题,是 Java 垃圾回收的主流方法。
- JVM 通过 GC Roots 遍历所有引用链,判定对象是否需要回收。
Java 中如何判断对象是否是垃圾?不同垃圾回收方法有何区别?的更多相关文章
- (转)java中对集合对象list的几种循环访问总结
Java集合的Stack.Queue.Map的遍历 在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...
- Java中类型判断的几种方式
1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...
- java中对集合对象list的几种循环访问
java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...
- Java中的函数对象
初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...
- Java中创建实例化对象的几种方式
Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...
- Java中字节与对象之间的转换
近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOu ...
- Java中创建的对象多了,必然影响内存和性能
1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.
- 判断java中两个对象是否相等
java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...
- Java GC如何判断对象是否为垃圾
查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...
随机推荐
- 一镜到底,通过Llama大模型架构图看透transformers原理
一镜到底,通过Llama大模型架构图看透transformers原理 Llama Nuts and Bolts是Github上使用Go语言从零重写Llama3.1 8B-Instruct模型推理过程( ...
- 为Delphi配置多套环境
假设我们使用Delphi6开发了一个投资系统,在开发过程中我们使用了indy控件.到目前为止投资系统已经发了若干个版本,如投资系统1.0.投资系统1.2.投资系统1.5.投资系统2.0.投资系统2.3 ...
- FastReport如实现打印固定行数,不足补打空白行(转)
看了网上的一些资料,发现了方法,但是描述都不是很详细,也至于每次都无法实现,只能在数据集中做补空行处理.今天终于弄通了,贴出方法,以备后续之用. 1. <1>在报表上加一个Child(在控 ...
- css漂亮的弧形
我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢? 用图片?好像不大现实,因为这样就要无故多加载一张图片了 ,这里我们来说说怎么用css的after伪类来实现弧形. 如果想要调整弧度的话,可以 ...
- 使用CMD命令导出和导入IIS站点配置信息
1.导出导入某个站点 1.1.导出应用程序池和站点 1.1.1.导出某个应用程序池配置 具体导出命令如下所示: %windir%\system32\inetsrv\appcmd list apppoo ...
- 百万架构师第四十课:RabbitMq:RabbitMq-工作模型与JAVA编程|JavaGuide
来源:https://javaguide.net RabbitMQ 1-工作模型与Java编程 课前准备 预习资料 Windows安装步骤 Linux安装步骤 官网文章中文翻译系列 环境说明 操作系统 ...
- c# 对序列化类XMLSerializer 二次封装泛型化方便了一些使用的步骤
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/17270107.html 加工的泛型类如下: using System; using Syste ...
- SSM:Spring整合Mybatis时,连接池和SQLSessionFactory的联系!
- 【自荐】Catime v1.0.4 一款贼好用的计时器
Github: https://github.com/vladelaina/Catime 仅1.3MB!!!!! 特点 极简设计: 透明界面.点击穿透.可调大小和位置.多语言支持 丰富字体: 47种字 ...
- JMeter 线程重复读取在跑数据的解决方法
场景: 需要模拟 100 个账号,100个并发,循环登录登出系统:由此引起了一个问题,如果线程10比线程1提前结束,那么线程10会按 cvs 顺序读取,就有可以读取到目前还在其他线程里面的一个账号: ...