java - java中标记为垃圾收集与符合垃圾收集资格

标签 java garbage-collection

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

相关文章:

python - 内存增长虽然被覆盖

node.js - server.js 中的内存泄漏 | react /表达/SSR

java - 第四个符合GC条件的对象是在哪里创建的?

java - java小GC的原因是什么

java - taskdef 类org.apache.jasper.JspC 需要的类找不到: Could not initialize class org. apache.jasper.JspC

使用 Lambda 表达式进行 Java 排序

扫描目录时出现 java.lang.NullPointerException

java - 增加 RecyclerView 项目的字体大小

.NET 版本的 Java 断言 : Unit tesing memory leaks

java - 如果查找键是字符串,则 EnumMap 或 HashMap