簡體   English   中英

Java線程和垃圾回收

[英]Java Threads and Garbage Collection

我已經在無數地方閱讀到運行線程是垃圾回收根(即它們駐留在堆棧上,GC會識別它們並跟蹤它們以確定它們中的對象是否仍然可以訪問)。 此外,GC根本身將永遠不會被垃圾回收。

我的困惑在這里:如果從一個線程中分配的對象在線程停止之前永遠不會被垃圾回收,那么,在唯一線程是主線程的單線程程序中,又如何垃圾回收呢?

顯然我在這里缺少什么。

對象是在堆中,而不管是由哪個線程創建的。

通過引用可以達到對象。 其中一些引用可以在一個或多個線程的調用堆棧上。

如果沒有更多引用,則可以收集對象,無論分配線程是否仍在運行。

例如,下面的線程反復分配新的StringBuilder對象。 在對foo()的調用期間,線程在其調用堆棧上具有對StringBuilder對象的引用。 foo()返回時,沒有對StringBuilder對象的進一步引用。 因此,對象不再可達,並有資格進行垃圾回收。

Thread thread = new Thread( new Runnable() {
    @Override
    public void run() {
        while ( true ) {
            foo();
        }
    }

    public void foo() {
        StringBuilder strBuilder = new StringBuilder("This new object is allocated on the heap.");
        System.out.println( strBuilder );
    }
});

thread.run();

首先,線程(堆棧)在運行時只是GC的根。 當線程終止時,它不再是GC根。

我的困惑在這里:如果從一個線程中分配的對象在線程停止之前永遠不會被垃圾回收,那么,在唯一線程是主線程的單線程程序中,又如何垃圾回收呢?

您的前提不正確。

哪個線程分配對象都沒有關系。 重要的是線程分配的對象是否仍然可以訪問 如果它變得不可訪問(例如,如果您沒有將對象的引用放入局部變量中)...則可以對其進行收集。

暫無
暫無

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

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