如果垃圾回收器没有删除未引用对象,它们仍然可以运行吗?

3

如果一个对象等待垃圾回收,但包含一个线程在最后一个对该对象的引用更改时正在运行,那么该线程仍然会运行,代码仍然会执行吗?因此,您可能会有一堆应该删除但对代码产生影响的幽灵对象。如何防止这种情况发生?对象是否有办法告诉自己是否等待被回收?


线程对象不需要被引用就能存活。它们必须死亡才能成为垃圾回收的候选对象。 - Bhesh Gurung
2
“你如何防止这种情况发生” --> 不要在线程内运行它们;使它们返回一个CallableRunnable,然后在ExecutorService中安排它们的执行;) - fge
2个回答

5
线程在完成之前不会被垃圾回收,因此如果您的线程从未结束,它们将无法进行垃圾回收。正如fge在评论中所指出的那样,往往情况下线程将引用封闭对象,这当然会阻止线程被垃圾回收。
至于如何知道对象是否正在被回收,答案详细介绍了您可以(和不能)做什么。
除此之外,您可以使用system.gc()建议jvm运行垃圾回收,但不能保证jvm会运行垃圾回收。

2
很可能,相关的线程将引用封闭对象实例,因此实际上该对象不会被选为垃圾回收... - fge

0
线程将一直运行直到完成,不管创建该线程并持有对它的引用的对象是否仍处于活动状态、当前是否可访问或是否符合垃圾回收条件。
如果您希望线程与对象的生命周期绑定,您可以实现 java.lang.AutoCloseable,并要求线程在 close() 中终止自身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接