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 包括

  1. 当前线程的栈中引用的对象。
  2. 静态字段引用的对象。
  3. 本地方法栈(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 中如何判断对象是否是垃圾?不同垃圾回收方法有何区别?的更多相关文章

  1. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  2. java中的string对象深入了解

    这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...

  3. Java中类型判断的几种方式

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

  4. java中对集合对象list的几种循环访问

    java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...

  5. Java中的函数对象

    初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...

  6. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  7. Java中字节与对象之间的转换

    近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOu ...

  8. Java中创建的对象多了,必然影响内存和性能

    1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.

  9. 判断java中两个对象是否相等

    java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...

  10. Java GC如何判断对象是否为垃圾

    查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC ...

随机推荐

  1. 多个tomcat启停脚本server.sh

    vi server.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/j ...

  2. nginx 编译安装及配置解析

    一.编译安装 安装插件 安装需要的组件 yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel ...

  3. Linux安装Kafka(依赖zookeeper)

    一.版本 kafka:kafka_2.12-2.4.0 zk:zookeeper-3.4.14 二.单机版安装 修改 server.properties ,支持外网访问 [1]创建日志文件夹: mkd ...

  4. MOS管的寄生电容

    我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡. 限制G极电流MOS管是由电压驱 ...

  5. 微信企业付款到零钱(Java版)

    订阅专栏1.开通条件. 商户注册超过90天且,连续30天有交易,可以每天支付1元来刷,目前测试可行.随后在微信商户平台 - 产品管理自动开启,然后需要申请. 疑问: 话说是要有公众号appid才行,但 ...

  6. 【Unity】图形渲染瓶颈与批处理优化

    [Unity]图形渲染瓶颈与批处理优化 图形渲染 工作方式 显卡的工作方式并非连续的,一般分三步. 上传更新渲染数据至显存 设置显卡的渲染管线状态 启动绘制并等待绘制结果 性能瓶颈 由于显卡是大规模并 ...

  7. 读论文-序列感知推荐系统(Sequence-Aware Recommender Systems)

    前言 今天读的论文为一篇于2018年发表在(ACM computing surveys (CSUR))的论文,这篇文章主要讲述了序列感知推荐系统(Sequence-Aware Recommender ...

  8. Java Map一些基本使用方法

    1 // Map key值不能相同,value值可以相同 2 // HashMap中的Entry对象是无序排列的 3 4 // 实例化1 5 Map<String, String> map ...

  9. Vulnhub-sundown

    总结:该靶机是一个wordpress管理系统,需要信息收集得到插件信息,然后搜索插件漏洞,得到一个文件包含exp,利用其得到一个普通用户,利用hydra爆破密码然后ssh连接,信息收集得到一个数据库配 ...

  10. es6 export和export default的区别

    相同点 export 与 export default 均可用于导出常量.函数.文件.模块 可在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其 ...