我正在研究Java中的垃圾收集的概念。据我所知,它说GC在后台定期运行,并检查任何不可引用或不可访问的对象。但是当内存受到某种压力时,只有GC才能完成。同样,GC有标记阶段,重新定位阶段etc..In,在第1行的末尾,由于不能保证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和无标记的。答案可能会有所不同
发布于 2017-12-31 08:06:21
在GC实际运行之前,没有标记为垃圾收集的对象。并且标记是由垃圾收集器做出的,并且只有在GC运行时才有效/有意义。
因此,询问对象是否在代码中的特定点被标记是.毫无意义。
您可能试图区分不可访问的对象与GC实际收集的对象。但是,即使是这样,通常也是无法回答的,因为不同的Java在收集对象时的行为有所不同。
至于什么是符合垃圾收集条件的,计数取决于JVM / GC实现,以及如何计数对象。例如:
String创建的new对象(很可能)是不可访问的。String对象可能不是不可访问的。(除非GC足够聪明地意识到main方法不能再次使用它们.这不太可能)String对象实际上有一个char[]。System.out.println("testing ")调用可能会生成垃圾。args数组、加载类等过程中),这些对象在这一点上是不可访问的。简而言之,小测验提出的问题太模糊,无法得到明确正确的答案。
https://stackoverflow.com/questions/48040532
复制相似问题