Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象依赖于gc根对象,例如线程字段,;这个对象的gc是什么?;_Java_Garbage Collection - Fatal编程技术网

Java 对象依赖于gc根对象,例如线程字段,;这个对象的gc是什么?;

Java 对象依赖于gc根对象,例如线程字段,;这个对象的gc是什么?;,java,garbage-collection,Java,Garbage Collection,请参阅ThreadPoolExecutor的工作类 私有最终类工作者 扩展AbstractQueuedSynchronizer 实现可运行 { 终螺纹; 可运行的第一个任务; 易变的长时间完成的任务; 工作者(可运行的第一个任务){ setState(-1);//在运行worker之前禁止中断 this.firstTask=firstTask; this.thread=getThreadFactory().newThread(this); } /**将主运行循环委托给外部runWorker*/

请参阅ThreadPoolExecutor的工作类

私有最终类工作者
扩展AbstractQueuedSynchronizer
实现可运行
{
终螺纹;
可运行的第一个任务;
易变的长时间完成的任务;
工作者(可运行的第一个任务){
setState(-1);//在运行worker之前禁止中断
this.firstTask=firstTask;
this.thread=getThreadFactory().newThread(this);
}
/**将主运行循环委托给外部runWorker*/
公开募捐{
runWorker(这个);
}
}
这是ThreadPoolExecutor类中的一些代码段

private boolean addWorker(可运行的第一个任务,布尔核心){
布尔workerStarted=false;
布尔workerAdded=false;
Worker w=null;
试一试{
w=新工人(第一个任务);
终螺纹t=w螺纹;
...
}
}

我通过Google了解到线程是一个gc根,worker依赖于Thread对象,线程也依赖于worker。当线程运行时,如果worker将被回收,我知道,仅当对象相对于gc根不可访问时才被标记,那么worker如何确定应该将worker标记为回收。否则,线程运行时将不会回收工作线程?

在JVM的生存期内只有一个垃圾收集器

考虑阅读本文以获得更多关于GC的信息

更新:

你写:
“辅助线程依赖于线程对象,线程也依赖于辅助线程”

那么,如果您可以随时访问它们(这意味着这些对象仍然可以使用),GC如何删除它们中的任何一个呢

对象将保留在内存中,直到无法访问为止


因此,在您的情况下,只有当线程和辅助线程都无法从根目录访问时,才会对它们进行垃圾收集。

请内联发布相关代码。辅助线程是可运行的,线程包含可运行的。可运行也包含此线程。涉及线程,我不知道辅助进程或线程是如何gc的?“辅助进程如何确定…”?没有。GC有。你的问题的其余部分毫无意义。我只是想知道工作对象的回收是否取决于线程对象的死亡或运行?对不起,我重新编辑了我的问题,你当前的答案找不到我想要的答案@王星宇 你需要考虑强大的可能性,你想要的答案不是你要得到的答案。当然,如果它是两个普通的物体。说到线程,我想知道从属线程对象会发生什么情况,或者如果工作线程被回收,它是否会死亡。当然,这是工作人员被回收的前提,或者线程的活动状态不允许工作人员回收?线程也是一个普通对象。“如果工人被回收,它是否会死亡”——它可能会死亡,也可能不会死亡。这完全取决于回收Worker后线程对象是否仍然可以访问。JVM为您处理这些引用解析,所以您不必担心。@Pavel Smirnov所以实际上,这个线程也被用作gc的普通对象,而不会使简单的问题复杂化。我想我明白了。但是,我第一次使用堆栈溢出,我如何确定您的答案?