标记为垃圾收集vs符合java中的垃圾收集条件

时间:2017-12-31 06:34:34

标签: java garbage-collection

我正在阅读Java中的垃圾收集概念。根据我的学习,它说GC在后台定期运行并检查任何未引用或无法访问的对象。但是当内存受到某种压力时,只有GC就完成了。 GC还有标记阶段,重定位阶段等阶段。在以下程序中,在第1行的末尾,对象符合条件用于垃圾收集,因为无法保证GC始终运行或它们在第1行后立即标记为

如果我在任何陈述中出错,请纠正我。

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行,有多少个对象标记为垃圾回收? 据我所知,GC的2个对象符合条件,没有标记。答案可能会有所不同

1 个答案:

答案 0 :(得分:2)

在GC 实际运行之前,没有对象标记为垃圾回收。标记由垃圾收集器生成,并且只有在 GC运行时才有效/有意义

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

您可能正在尝试区分无法访问的对象与GC实际收集的对象之间的区别。但即使这样也通常无法回答,因为不同的Java GC在收集对象时的行为方式不同。

至于什么是符合条件的用于垃圾收集,计数取决于JVM / GC实现以及如何计算对象。例如:

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

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

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

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

  • 并且...... JVM可以创建任意数量的其他对象(在实例化JVM,构建args数组,加载类等等)时可能无法访问点。

简而言之,测验所提出的问题对于一个绝对正确的答案来说太模糊了。