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 ...
随机推荐
- 解决StringBuilder readline阻塞问题
readline之所以会阻塞socket流没有结束符 阻塞场景:read() 没有读取到任何数据 readLine() 没有读取到结束符或者换行符 可以用ready判断通道中数据是否读完,读完返回fa ...
- 使用 Dify + LLM 构建精确任务处理应用
在构建基于大语言模型(LLM)的应用时,如何确保返回结果的准确性和可重复性是一个常见的挑战.本文将结合 Dify + LLM 的使用经验,介绍如何设计一个精确的 LLM 任务处理流程,避免传统 LLM ...
- AI定制祝福视频,广州塔、动态彩灯、LED表白,直播互动新玩法(附下载链接)
在追剧的时候经常能看到一些浪漫的告白桥段,男主用圣诞彩灯表白.用城市标志性建筑的LED表白,或者在五光十色的烟花绽放后刻下女主角的名字,充满了仪式感和氛围感~ 现在,这样的表白效果用AI软件就能实现了 ...
- Q:bash: fork: 无法分配内存,ssh无法连接新会话
老版本系统的内核pid参数比较小(默认设置的是32768) 原因分析,– 内存不足或进程数超出限制– 系统内部的总进程数达到pid_max的上限,创建新进程看到以上提示 查看最大进程数 sysctl ...
- 自动安装zabbix-agentd脚本 自己写的
zabbix_agent_install.sh #!/bin/bash #auther by wangxp ZABBIX_AGENT_DIR="/usr/local/zabbix" ...
- FLink怎么做压力测试和监控?
我们一般碰到的压力来自以下几个方面: 一,产生数据流的速度如果过快,而下游的算子消费不过来的话,会产生背压问题.背压的监控可以使用Flink Web UI(localhost:8081)来可视化监控, ...
- Android 监听短信数据库过滤获取短信内容上传至服务器
前言 Android 监听短信的方式有两种 1.监听短信数据库,数据库发生改变时回调. 2.监听短信广播 其中第二种方式由于国内各厂家的定制Android 可能导致无响应 目前测试 魅族 无法监听到短 ...
- Normalizing flow 流模型 | CS236深度生成模型Lec8学习笔记
主要参考资料:Stanford University CS236: Deep Generative Models Lec8. 这篇blog基本上是CS236 Lec8的刷课总结/刷课笔记. VAE 这 ...
- Sqoop - [01] 概述
将关系型数据库(Oracle.MySQL.PG等)数据与Hadoop数据进行转换的工具. 一.Sqoop1和Sqoop2的区别 Sqoop1由client端直接接入Hadoop,任务通过解析生成对应的 ...
- 【ABAQUS Material】density 行为
1.overview 进行eigenfrequency . transient dynamic analysis. transient heat transfer analysis. adiabati ...