3

如果一个对象正在等待垃圾回收,但包含一个在对该对象的最后一个引用发生更改时正在运行的线程,那么该线程是否仍会运行并且代码是否仍会执行?那么,您是否可能有一堆应该删除但对您的代码产生影响的幽灵对象?你如何防止这种情况发生?有没有办法让一个对象判断它是否正在等待收集?

4

2 回答 2

5

线程在完成之前不会被垃圾收集,因此如果您的线程从未完成,它们将无法用于垃圾收集。正如 fge 在评论中所指出的,线程通常会引用封闭对象,这当然会阻止线程被垃圾收集。

至于知道一个对象是否正在被收集,这个答案有一些关于你可以(和不能)做什么的很好的细节。

除此之外,您可以建议 jvm 使用 system.gc() 运行垃圾收集器,但不能保证 jvm 会运行垃圾收集器。

于 2013-06-08T19:08:14.853 回答
0

线程将运行直到完成,无论创建线程并持有对它的引用的对象是否仍然存在、当前可访问或有资格进行垃圾回收。

如果您希望线程与对象的生命周期相关联,您或许应该实现java.lang.AutoCloseable,并要求线程在close().

于 2013-06-08T19:12:29.273 回答