Java 如果垃圾收集器没有';你没有删除它们吗?

Java 如果垃圾收集器没有';你没有删除它们吗?,java,garbage-collection,Java,Garbage Collection,如果一个对象正在等待垃圾收集,但包含一个线程,该线程在上次对该对象的引用被更改时正在运行,那么该线程是否仍在运行,代码是否仍在执行?那么,您可能会有一堆应该删除的重影对象,但它们会对您的代码产生影响吗?你如何预防这种情况?有没有办法让一个对象知道它是否正在等待被收集?一个线程在完成之前不会被垃圾收集,因此如果你的线程从未完成,它们将无法用于垃圾收集。正如fge在注释中所指出的,线程通常会引用封闭对象,这当然会防止线程被垃圾收集 至于知道一个对象是否正在被收集的过程中,answer提供了一些关于您

如果一个对象正在等待垃圾收集,但包含一个线程,该线程在上次对该对象的引用被更改时正在运行,那么该线程是否仍在运行,代码是否仍在执行?那么,您可能会有一堆应该删除的重影对象,但它们会对您的代码产生影响吗?你如何预防这种情况?有没有办法让一个对象知道它是否正在等待被收集?

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

至于知道一个对象是否正在被收集的过程中,answer提供了一些关于您可以(和不能)做什么的详细信息


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

线程将一直运行到完成,无论可能创建线程并持有对其引用的对象是否仍处于活动状态,当前可访问或有资格进行垃圾收集


如果希望将线程绑定到对象的生存期,则可能应该实现
java.lang.AutoCloseable
,并要求线程在
close()

中终止自身,并且所讨论的线程很可能会引用封闭的对象实例,因此,事实上,无论如何,该对象都不是为gc选择的……线程对象不需要被引用就可以处于活动状态。他们必须死才能获得gc的资格。“如何防止这种情况”-->不要在他们内部运行线程;让它们返回一个
可调用的
可运行的
,您自己计划在
执行器服务中执行它