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