gpt4 book ai didi

Java线程垃圾回收

转载 作者:搜寻专家 更新时间:2023-11-01 01:17:57 25 4
gpt4 key购买 nike

当线程中的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com