标记为垃圾收集vs符合java中的垃圾收集条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标记为垃圾收集vs符合java中的垃圾收集条件相关的知识,希望对你有一定的参考价值。

我正在阅读Java中的垃圾收集概念。根据我的学习,它说GC在后台定期运行并检查任何未引用或无法访问的对象。但是当内存受到某种压力时,只有GC就完成了。 GC还有标记阶段,重定位阶段等阶段。在以下程序中,在第1行的末尾,是否有资格进行垃圾收集的对象,因为无法保证GC始终运行或者在GC之后立即标记为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行,有多少个对象标记为垃圾回收?据我所知,2个对象将有资格获得GC,没有标记。答案可能有所不同

答案

在GC实际运行之前,没有对象标记为垃圾收集。并且标记由垃圾收集器生成,并且仅在GC运行时有效/有意义。

因此,询问对象是否在代码中的特定点被标记是......毫无意义。

您可能试图区分无法访问的对象与GC实际收集的对象之间的区别。但即使这样也通常无法回答,因为不同的Java GC在收集对象时的行为方式不同。


至于什么符合垃圾收集的条件,计数取决于JVM / GC实现,以及如何计算对象。例如:

  • 由显式String创建的new对象(很可能)将无法访问。
  • 对应于字符串文字的String对象可能无法访问。 (除非GC足够聪明才能意识到main方法不能再次使用它们......这不太可能)
  • 但是......第一个String物体实际上里面有一个char[]
  • 并且...... System.out.println("testing ")呼叫可能会产生垃圾。
  • 并且......可能存在由JVM创建的任何数量的其他对象(在实例化JVM,构建args数组,加载类等等)时,此时可能无法访问。

简而言之,测验所提出的问题对于一个绝对正确的答案来说太模糊了。

以上是关于标记为垃圾收集vs符合java中的垃圾收集条件的主要内容,如果未能解决你的问题,请参考以下文章

67.Java垃圾收集机制对象引用垃圾对象的判定垃圾收集算法标记—清除算法标记—整理算法分代收集垃圾收集器性能调优

带有变量分配的 Java 垃圾收集

Java垃圾收集算法

Java 垃圾回收 - 收集算法

为啥在执行 Java Stream 终端操作时对象没有被垃圾收集?

深入理解java虚拟机GC垃圾回收-垃圾收集算法