java - 什么触发了java垃圾收集器

标签 java garbage-collection jvm

我对 Java 中垃圾收集的工作原理有点困惑。

我知道当不再有对某个对象的实时引用时,该对象就可以进行垃圾回收,但如果它有对实时对象的引用怎么办?

假设我有一个节点集合,它们再次引用更多节点

List
1 -> Node a -> Node b
2 -> Node c -> Node d
3 -> Node d -> Node c
4 -> Node e
5

现在,如果我删除列表,节点 c d 和 e 应该被垃圾收集。节点e不再有对其的引用,节点c和d有循环引用。

但是节点a呢?会被垃圾收集吗?

节点 b 是否具有外部实时引用会有所不同吗?假设如果节点 b 从不同的地方引用了它,这会让节点 a 留在内存中吗?

最佳答案

有一组引用(当前局部变量、静态引用、堆栈帧的操作数堆栈),被视为 Activity 的。从此根引用集中无法访问的任何内容都可以进行垃圾回收。

节点 a 没有任何指向它的引用。因此,即使它引用的是 Activity 对象,它也有资格进行 gc。由于节点 b 具有实时引用,因此它不会被 gc'ed。

关于java - 什么触发了java垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14278793/

相关文章:

java - 带有匿名 EventListener 的 JPanel - 为什么 GC 不破坏监听器?

Java自定义Path2D

java - com.microsoft.sqlserver.jdbc.SQLServerException : The server version is not supported. 目标服务器必须是SQL Server 2000或更高版本

java - Scala 任务返回映射

java - 如何使用 Java ByteBuffer 处理负 int

c# - 强制收集和压缩对于其他进程有用的情况

java - 多线程应用程序中的Java垃圾回收以获取局部变量

java - 迁移到 64 位后 JVM 崩溃

jvm - 如何减少线程到达安全点 - 同步状态所需的时间

java - java "VM thread"是做什么的?