gpt4 book ai didi

java - java中标记为垃圾收集与符合垃圾收集资格

转载 作者:行者123 更新时间:2023-11-30 02:16:57 25 4
gpt4 key购买 nike

我正在了解 Java 中垃圾收集的概念。据我所知,GC 会在后台定期运行,并检查是否有任何未引用或无法访问的对象。但是当内存有某种压力时,就只进行 GC。 GC 还具有标记阶段、重定位阶段等阶段。在下面的程序中,在第 1 行末尾,对象是否符合垃圾回收的条件,因为不能保证 GC 始终运行或它们在第 1 行之后立即标记用于 GC?

如果我的任何陈述有误,请纠正我。

public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
String three = "someString";
one = two = three=null;
System.out.println("testing "); // 1
System.out.println("testing again");// 2
}
}

在第 1 行,有多少对象被标记为垃圾回收?据我所知,有 2 个对象有资格进行 GC,但没有一个对象被标记。答案可能会有所不同

最佳答案

在 GC 实际运行之前,不会将任何对象标记为垃圾回收。这些标记是由垃圾收集器生成的,并且仅在 GC 运行时才有效/有意义。

因此询问对象是否在代码中的特定点被标记是......毫无意义的。

您可能试图区分无法访问的对象和 GC 实际收集的对象。但即便如此,通常也是无法回答的,因为不同的 Java GC 在收集对象时的行为不同。

<小时/>

至于什么有资格进行垃圾回收,计数取决于 JVM/GC 实现以及对对象进行计数的方式。例如:

  • 由显式 new 创建的 String 对象将(很可能)无法访问。

  • 与字符串文字对应的String对象可能不会无法访问。 (除非 GC 足够聪明,能够意识到 main 方法无法再次使用它们......这不太可能)

  • 但是...第一个 String 对象内部实际上有一个 char[]

  • 并且...System.out.println("testing ")调用可能会生成垃圾。

  • 而且...JVM 可能会创建任意数量的其他对象(在实例化 JVM、构建 args 数组、加载类等时),这些对象可能是那时无法访问。

<小时/>

简而言之,测验提出的问题太模糊,无法给出绝对正确的答案。

关于java - java中标记为垃圾收集与符合垃圾收集资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com