如果一个对象正在等待被垃圾收集,但是包含一个在最后一次引用该对象时运行的线程,那么该线程是否仍会运行并且代码是否仍会执行?那么你是否可能有一堆应该被删除的鬼对象,但是对你的代码有影响?你怎么防止这种情况?对象是否有办法判断是否等待收集?
答案 0 :(得分:5)
线程在完成之前不会被垃圾收集,所以如果你的线程永远不会完成,它们将无法用于垃圾收集。正如注释中的fge所指出的那样,线程通常会引用封闭对象,这当然会阻止线程被垃圾回收。
至于知道对象是否正在被收集的路上,this回答有一些关于你能做什么(和不能做)的很好的细节。
除此之外,您可以建议jvm使用system.gc()运行垃圾收集,但不能保证jvm将运行垃圾收集器。
答案 1 :(得分:0)
线程将一直运行直到完成,无论是否可能创建线程并保存对它的引用的对象仍然存在,当前是可访问的还是有资格进行垃圾回收。
如果您希望线程与对象的生命周期相关联,您可能应该实现java.lang.AutoCloseable
,并要求线程在close()
中终止。