当前位置: 首页 > 面试题库 >

是什么触发了Java垃圾收集器

袁鸿达
2023-03-14
问题内容

我对Java中的垃圾回收如何工作感到有些困惑。

我得到一个对象,当它不再有实时引用时,就可以进行垃圾回收,但是如果它引用了实时对象又该怎么办?

可以说我有一个节点集合,再次引用了更多节点

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

现在,如果我删除列表,则应该对节点cd和e进行垃圾回收。节点e没有更多引用,而节点c和d具有循环引用。

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

节点b是否具有外部实时引用会有所不同吗?假设节点b从另一个地方引用了它,那会使节点成为内存吗?


问题答案:

有一组根引用(当前局部变量,静态引用,堆栈帧的操作数堆栈)被认为是活动的。从此根引用根目录无法访问的所有内容都可以进行垃圾回收。

节点a没有指向它的引用。因此,即使它指向活动对象,也符合gc的资格。由于节点b具有实时引用,因此不会得到gc’ed。



 类似资料:
  • 问题内容: 我想知道触发Java完整垃圾收集的确切情况是什么。 显而易见的是: 用完了老一代 用完了perm gen 调用System.gc() 那么其他导致全gc的情况又如何呢?尤其: Survivor Space中的可用空间不足,无法从Eden复制对象。 次要收藏集无法应付新对象的分配率(虽然不知道如何)。 我正在运行Sun Java 1.6,并将Concurrent Mark-Sweep和P

  • 问题内容: 我是Java新手,对Java中的垃圾收集器感到困惑。它实际上是做什么的,什么时候生效。请描述Java中垃圾收集器的一些属性。 问题答案: 该垃圾收集器是运行在一个程序的Java虚拟机,其摆脱其未使用的Java应用程序了对象。它是自动内存管理的一种形式。 当典型的Java应用程序运行时,它正在创建新的对象,例如和,但是在一段时间之后,这些对象将不再使用。例如,看下面的代码: 在上面的代码

  • 问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • 由于ElasticSearch是基于Java语言的应用,所以它必须运行在Java虚拟机上。任何Java程序都被编译成字节码,然后才能运行在JVM上。用最常规的方式思考,可以想象JVM只是执行其它的程序,并且控制程序的行为。但是除非你是在为ElasticSearch开发新的插件(这部分的内容将在第9章 开发ElasticSearch插件中论述),否则这不是你关注的重点。你需要关注的重点是垃圾收集器,

  • 问题内容: 我知道当分配DirectbyteBuffer时,它不受垃圾回收的限制,但是我想知道的是 包装 对象是否被垃圾回收了。 例如,如果我分配了一个新的DirectByteBuffer dbb,然后使用dbb.duplicate()将其复制(浅复制),则我将在同一块内存中使用两个包装器。 这些包装器是否要进行垃圾收集?如果我做了 我最终会自己OOM吗? 问题答案: 在Sun JDK中,由创建的