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 ...
随机推荐
- 多个tomcat启停脚本server.sh
vi server.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/j ...
- nginx 编译安装及配置解析
一.编译安装 安装插件 安装需要的组件 yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel ...
- Linux安装Kafka(依赖zookeeper)
一.版本 kafka:kafka_2.12-2.4.0 zk:zookeeper-3.4.14 二.单机版安装 修改 server.properties ,支持外网访问 [1]创建日志文件夹: mkd ...
- MOS管的寄生电容
我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡. 限制G极电流MOS管是由电压驱 ...
- 微信企业付款到零钱(Java版)
订阅专栏1.开通条件. 商户注册超过90天且,连续30天有交易,可以每天支付1元来刷,目前测试可行.随后在微信商户平台 - 产品管理自动开启,然后需要申请. 疑问: 话说是要有公众号appid才行,但 ...
- 【Unity】图形渲染瓶颈与批处理优化
[Unity]图形渲染瓶颈与批处理优化 图形渲染 工作方式 显卡的工作方式并非连续的,一般分三步. 上传更新渲染数据至显存 设置显卡的渲染管线状态 启动绘制并等待绘制结果 性能瓶颈 由于显卡是大规模并 ...
- 读论文-序列感知推荐系统(Sequence-Aware Recommender Systems)
前言 今天读的论文为一篇于2018年发表在(ACM computing surveys (CSUR))的论文,这篇文章主要讲述了序列感知推荐系统(Sequence-Aware Recommender ...
- Java Map一些基本使用方法
1 // Map key值不能相同,value值可以相同 2 // HashMap中的Entry对象是无序排列的 3 4 // 实例化1 5 Map<String, String> map ...
- Vulnhub-sundown
总结:该靶机是一个wordpress管理系统,需要信息收集得到插件信息,然后搜索插件漏洞,得到一个文件包含exp,利用其得到一个普通用户,利用hydra爆破密码然后ssh连接,信息收集得到一个数据库配 ...
- es6 export和export default的区别
相同点 export 与 export default 均可用于导出常量.函数.文件.模块 可在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其 ...