我正在了解 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/