java - Java 中的垃圾收集是否在循环内工作?

标签 java garbage-collection

<分区>

假设以下代码:

public static void main(String []args) {
    MessageProcessor processor = Util.createMessageProcessor();
    MessageArchiver archiver = Util.createMessageArchiver();
    List<Message> messages = new ArrayList<>();

    for (int i = 0; i < Util.EXPECTED_TOTAL; i++) {

        Message msg = Util.random();
        processor.processMessage(msg);
        messages.add(msg);
        msg = null;
    }

    archiver.archiveMessages(messages, m -> m.getSubject().startsWith("A"));

    Util.validate();
}

我注意到该方法在每个循环中创建对象 msg。要显式删除对象,我设置了 msg=null。我的问题是,Java 的自动垃圾回收会在每个 循环结束时还是在循环退出 之后拾取对象。

最佳答案

My question is, will Java's auto garbage collection pick up the object at the end of each loop or after the exit of the loop.

两者都不是,它只会在 main 完成后拾取它(当 GC 下次运行时,如果它执行了*),因为您正在将消息对象添加到 messages 列表,维护对象的引用,使对象不符合 GC 的条件。 变量 不会被 GC(在您所指的意义上),对象 会。

只有在 main 的末尾,当 messages 超出范围时,列表才有资格进行 GC,这意味着列表的条目有资格进行 GC(不提供任何内容) else 仍然指的是它们)。

关于循环,不需要 msg = null; 语句,它没有做任何重要的事情。您的 msg 变量的范围限定为循环迭代,并在每次循环迭代结束时超出范围,这将释放它对它所引用的任何内容的保留。


一般情况:当您遇到与内存相关的性能问题时,请担心与内存相关的性能问题,而不是之前。 :-)


*“如果是”- 在 JVM 终止时,它可以释放整个 JVM 堆而不用担心 GC。

关于java - Java 中的垃圾收集是否在循环内工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548428/

相关文章:

java - Android Maps v2 上的自定义 Google Maps Engine map ?

java - 添加设计支持库

java - GC 输出说明

Java 用两种模式分割 CSV

java - 如何将 MouseListener 留在 ChildComponent 上,但正确跟踪父组件上的鼠标进入和退出?

java - 如何使用正则表达式验证文本字段

java - 如何以及何时使用 Mockito Annotations 和 jUnit 进行清理

java - 使用 JDK 1.7 版本编译的类的 JDK 1.8 垃圾收集器 G1 算法

c++ - 使用 AutoZone 垃圾收集器

python-3.x - GC如何通过两个线程收集Class引用