【发布时间】:2012-07-13 12:35:24
【问题描述】:
当线程内的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 循环运行了很长时间,应用程序就会耗尽内存并崩溃。
我的问题:这是真的吗?如果有,如何避免?
【问题讨论】:
-
在我知道的所有语言中,当方法结束时会收集垃圾(如果该语言有的话)。指出一种语言!您误认为带有自动引用计数的垃圾收集和类似 C++ 的堆栈分配对象的析构函数。 Java 不会在堆栈上分配任何对象(按设计,但技术上可以通过 EA [转义分析] 或 ED [转义检测]) 因此该语句充其量是不正确的(在最坏的情况下是非常错误的)跨度>
标签: java multithreading garbage-collection