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

问题描述 投票:-1回答:1

请参阅ThreadPoolExecutor的Worker类

      private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {

        final Thread thread;

        Runnable firstTask;

        volatile long completedTasks;


        Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }

        /** Delegates main run loop to outer runWorker  */
        public void run() {
            runWorker(this);
        }
    }

这是ThreadPoolExecutor类中的一些代码段

    private boolean addWorker(Runnable firstTask, boolean core) {
        boolean workerStarted = false;
        boolean workerAdded = false;
        Worker w = null;
        try {
            w = new Worker(firstTask);
            final Thread t = w.thread;
            ...
        }
    }

我通过Google了解到Thread是一个gc root,worker依赖于线程对象,而线程也依赖于worker。当线程运行时,如果工作人员将被回收,我知道,只有当对象相对于gc root无法访问时才会被标记,工作人员如何确定应该标记工作人员进行回收。否则,在线程运行时工作程序将不会被回收?

java garbage-collection
1个回答
1
投票

在JVM的生命周期中只有一个垃圾收集器。

考虑阅读此Java Garbage Collection Basics以获取有关GC的更多信息。

更新:

你写: “工作者依赖于线程对象,线程也取决于工作者”。

那么如果你可以在任何时候到达它们(这意味着对象仍然可以使用),GC如何能够移除它们中的任何一个?

对象将保留在内存中,直到它们无法访问。

因此,在您的情况下,只有当线程和工作程序从根目录无法访问时,它们才会被垃圾收集。

© www.soinside.com 2019 - 2024. All rights reserved.