簡體   English   中英

是否收集了Java Thread Garbage

[英]Java Thread Garbage collected or not

這個問題發布在某個網站上。 我沒有在那里找到正確的答案,所以我再次在這里發布。

public class TestThread {
    public static void main(String[] s) {
        // anonymous class extends Thread
        Thread t = new Thread() {
            public void run() {
                // infinite loop
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    // as long as this line printed out, you know it is alive.
                    System.out.println("thread is running...");
                }
            }
        };
        t.start(); // Line A
        t = null; // Line B
        // no more references for Thread t
        // another infinite loop
        while (true) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
            System.gc();
            System.out.println("Executed System.gc()");
        } // The program will run forever until you use ^C to stop it
    }
}

我的查詢不是關於停止線程。 讓我重新解釋一下我的問題。 A行(見上面的代碼)啟動一個新線程; 和B行使線程引用為null。 因此,JVM現在有一個沒有引用的線程對象(處於運行狀態)(在線B中為t = null)。 所以我的問題是,為什么這個線程(主線程中沒有引用)繼續運行直到主線程運行。 根據我的理解,線程對象應該在B行后進行垃圾收集。我嘗試運行此代碼5分鍾以上,請求Java運行時運行GC,但線程不會停止。

希望這次代碼和問題都清楚。

正在運行的線程被認為是所謂的垃圾收集根,並且是阻止垃圾收集的東西之一。 當垃圾收集器確定您的對象是否“ 可訪問 ”時,它總是使用垃圾收集器根集合作為參考點。

考慮一下,為什么你的主線程沒有被垃圾收集,也沒有人引用那個。

如上所述,根據定義,運行線程對GC免疫。 GC通過掃描“根”開始工作,這些“根”被認為總是可以到達的; 根包括全局變量(Java-talk中的“靜態字段”)和所有正在運行的線程的堆棧(可以想象正在運行的線程的堆棧引用相應的Thread實例)。

但是,您可以將線程設置為“守護程序”線程(請參閱Thread.setDaemon(boolean) )。 守護程序線程不會比非守護程序線程更多地進行垃圾收集,但是當所有正在運行的線程都是守護程序時,JVM會退出。 想象一下的一種方法是每個線程在終止時檢查是否還有一些非守護進程正在運行的線程; 如果沒有,則終止線程強制執行System.exit()調用,該調用將退出JVM(終止正在運行的守護程序線程)。 這不是與GC相關的問題; 在某種程度上,線程是手動分配的。 但是,這就是JVM可以容忍半流氓線程的方式。 這通常用於Timer實例。

JVM引用了所有正在運行的線程。

沒有線程(或它引用的東西)在它仍在運行時將被垃圾收集。

線程不是垃圾收集,因為有對您無法看到的線程的引用。 例如,運行時系統中有引用。

創建線程時,它將添加到當前線程組。 您可以獲取當前線程組中的線程列表,這是另一種獲取對它的引用的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM