Java线程垃圾收集

Tim*_* S. 4 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我所知的所有语言中,当方法结束时收集垃圾(如果语言有).我认为Java也是如此.这意味着理论上我创建的线程someMethod()直到someMethod()结束才被收集.如果我们假设while循环运行很长时间,应用程序将耗尽内存并崩溃.

我的问题:这是真的吗?如果是这样,该怎么做才能避免呢?

SJu*_*n76 7

首先,在Java中,GC是非确定性的.当不再引用该对象时,它适合在下一次GC运行中收集,但不是强制要求的.甚至打电话System.gc()只是对GC系统的建议.

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