【发布时间】:2018-06-10 22:52:01
【问题描述】:
我正在学习 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 可能会在您将变量 1、2 和 3 标记为 null 后的那一刻运行,以便在第 1 行中,因此您可能对最后一个问题有多个答案。
-
请注意,垃圾收集器的行为被有意定义得非常模糊,因此各种实现对其设置的限制很少。这也是 System.gc() 不一定做任何事情的原因。