我正在阅读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个对象符合条件,没有标记。答案可能会有所不同
答案 0 :(得分:2)
在GC 实际运行之前,没有对象标记为垃圾回收。标记由垃圾收集器生成,并且只有在 GC运行时才有效/有意义。
因此,询问对象是否在代码中的特定点被标记是......毫无意义。
您可能正在尝试区分无法访问的对象与GC实际收集的对象之间的区别。但即使这样也通常无法回答,因为不同的Java GC在收集对象时的行为方式不同。
至于什么是符合条件的用于垃圾收集,计数取决于JVM / GC实现以及如何计算对象。例如:
显式String
创建的new
对象(很可能)无法访问。
对应于字符串文字的String
对象可能无法访问。 (除非GC足够聪明才能意识到main
方法不能再次使用它们......这是不可能的)
但是......第一个String
对象实际上有一个char[]
。
并且...... System.out.println("testing ")
调用可能会产生垃圾。
并且...... JVM可以创建任意数量的其他对象(在实例化JVM,构建args
数组,加载类等等)时可能无法访问点。
简而言之,测验所提出的问题对于一个绝对正确的答案来说太模糊了。