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

在java中标记为垃圾收集vs符合垃圾收集条件,java,garbage-collection,Java,Garbage Collection,我正在学习Java中的垃圾收集概念。据我所知,GC在后台定期运行,并检查任何未引用或无法访问的对象。但是,当内存受到某种压力时,只执行GC。GC也有标记阶段、重新定位阶段等阶段。在下面的程序中,在第1行末尾,对象是否符合垃圾收集的条件,因为无法保证GC始终运行,或者它们在第1行之后立即被标记为垃圾收集 如果我的陈述有错,请纠正我 public class ImmutableStrings { public static void main(String[] args) {

我正在学习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的要求,并且没有一个标记为。答案可能会有所不同

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

所以询问对象是否在代码中的某个特定点被标记是。。。毫无意义

您可能试图区分无法访问的对象和GC实际收集的对象。但即使这样,也无法回答,因为不同的Java GC在收集对象的时间上表现不同


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

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

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

  • 但是。。。第一个
    字符串
    对象实际上有一个
    char[]

  • 而且。。。
    System.out.println(“测试”)
    调用可能会生成垃圾

  • 而且。。。JVM创建的任何数量的其他对象(在实例化JVM、构建
    args
    数组、加载类等时)都可能无法访问



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

据我所知,内存中的对象已符合垃圾收集的条件,但是,在执行垃圾收集“标记并清除”算法之前,仍将占用空间。我假设,在您将变量1、2和3标记为null之后,GC可能会在瞬间运行,这样在第1行中,您可能会对最后一个问题有多个答案。请注意,垃圾收集器的行为是故意定义得非常模糊的,因此各种实现对它们设置的限制很少。这也是System.gc()不一定做任何事情的原因。