Java线程垃圾回收

标签 java multithreading garbage-collection

当线程中的 run() 方法完成时或当调用它的函数完成时,是否收集了线程垃圾?

我没有遇到任何问题,但我想避免内存泄漏等问题。

对于喜欢代码的人:

public void SomeClass {
    public SomeClass() {

    }

    public void someMethod() {
        Object data = veryBigObject;

        while(true) {
            MyThread thread = new MyThread(veryBigObject);
            thread.run();

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { /* do nothing */ }
        }
    }

    public static void main(String[] args) {
        SomeClass myclass = SomeClass();
        myclass.someMethod();
    }
}


public class MyThread extends Thread {
    private Object data;

    public Thread(Object data) {
        this.data = data;
    }

    public void run() {
        // do stuff with data
    }
}

在我所知道的所有语言中,垃圾(如果语言有的话)在方法结束时被收集。我假设 Java 也是如此。这意味着理论上我在 someMethod() 中创建的线程在 someMethod() 结束之前不会被收集。如果我们假设 while 循环运行了很长时间,应用程序就会耗尽内存并崩溃。

我的问题:这是真的吗?如果是这样,如何避免?

最佳答案

首先,在 Java 中,GC 是不确定的。当对象不再被引用时,它适合在下一次 GC 运行时被收集,但它不是强制的。即使调用 System.gc() 也只是对 GC 系统的一个建议。

其次,重要的是引用。在循环的每个实例中,您都覆盖了对线程对象的引用。如果线程已经完成,则无需退出方法来收集它们(当然,当线程运行时它们不会被收集,即使您的代码没有对它的引用)。退出创建对象的方法的问题无关紧要。

关于Java线程垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470637/

相关文章:

java - G1 垃圾收集器日志分析器

c# - 在 C# 中正确处理 COM 互操作对象,尤其是 MS Office 应用程序

objective-c - 如何在Objective-C中的原子属性的ivar上创建手动锁定?

c++ - 我如何知道一个线程是否在 Windows CE 下挂起

java - 无法运行 eclipse

java - 解析器在java中解析未知的XML Schema

c++ - boost::condition::timed_wait 的使用示例

java - Tenured 已满,Eden 为空 : can objects be moved to Eden?

java - 使用 XSLT 转换时 XML 数字签名验证失败

java - 使用 SpringData 和 QueryDSL-JPA 查询映射值