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循环运行很长时间,应用程序将耗尽内存并崩溃.
我的问题:这是真的吗?如果是这样,该怎么做才能避免呢?
首先,在Java中,GC是非确定性的.当不再引用该对象时,它适合在下一次GC运行中收集,但不是强制要求的.甚至打电话System.gc()只是对GC系统的建议.
其次,重要的是参考.在循环的每个实例中,您都会覆盖对线程对象的引用.如果线程已经完成,则无需退出方法来收集它们(当然,在线程运行时,即使您的代码没有引用它,也不会收集它们).退出创建对象的方法的问题不相关.
| 归档时间: |
|
| 查看次数: |
8552 次 |
| 最近记录: |