说我上课
public class OuterClass
{
public static WorkerClass worker;
}
在主题1中
执行以下命令
Outerclass.worker.doLongRunningOperation();
在执行doLongRunningOperation
时,在线程2 中执行
Outerclass.worker = new WokerClass();
线程1中doLongRunningOperation
会发生什么?
线程1引用的worker
对象是否仅在doLongRunningOperation
完成后才被垃圾收集,或者是否会突然终止到垃圾收集worker
对象。
编辑:
我认为它应该是GC' ed,因为它不再被引用。但是doLongRunningOperation
会发生什么?它会被突然终止吗?
答案 0 :(得分:2)
Java垃圾收集器(GC)从一组GC 根开始回收非可跟踪的对象。也就是说,如果对象A被对象B引用,对象B被对象C引用,而对象C被 root 引用,那么对象A,B和C都是安全的。垃圾收集器。
那根源是什么?我不知道完整的答案,但我知道根集包含每个正在运行的线程中的每个局部变量和参数。
因此,如果线程1中的某些局部变量或参数仍然具有对原始WorkerClass
实例的引用,则该实例将继续存在。
原始的WorkerClass实例只有在任何线程中的任何本地或arg未被任何线程或任何可跟踪对象中的任何字段引用时才会被回收。当发生这种情况时,对您的程序来说无关紧要,因为您的程序将无法再访问该对象。
PS,“参数和本地”包括作为Java实现一部分的隐藏变量,它包含隐式变量,例如this
引用每个对象方法。只要对其进行任何方法调用(例如,WorkerClass
)仍处于活动状态,就无法回收原始doLongRunningOperation
实例。