2014-10-07 59 views
8

我有一個關於GC根的問題。我讀到GC的根源是「Live thread」。那是什麼意思? 我總是有印象,每個線程都有它自己的堆棧,堆棧的局部變量是線程的GC根,現在我很困惑。線程表示具有哪些其他類型的對象引用,它們不在幀堆棧或本地堆棧上?作爲GC根的線程

其他問題是年輕一代收集使用GC根,還是隻爲主要算法?

感謝

更新: 好難過,所以要保持它的簡單:我讀過這篇短文:yourkit.com/docs/java/help/gc_roots.jsp,有一個「主題」選項, GC根,究竟是什麼意思,該線程是GC根?什麼樣的對象被Thread GC根引用,它沒有被堆棧引用?爲什麼這兩個類別不同?

+1

你的問題很混亂。 1)當然,只有活動的線程纔算GC根源。 2)什麼是「線索表示」? 3)靜態變量是非堆棧GC根。 4)每個GC變體都考慮了GC根源;它不可能*不*考慮到它們。 – 2014-10-07 09:36:13

+0

對不起,爲了保持簡單:我讀過這篇簡短的文章:http://www.yourkit.com/docs/java/help/gc_roots.jsp,並且有一個「Thread」選項作爲GC根,究竟是什麼這是否意味着該線程是GC根?什麼樣的對象被Thread GC根引用,它沒有被堆棧引用?爲什麼這兩個類別不同? – alobodzk 2014-10-07 09:57:05

+0

@MarkoTopolnik我不認爲靜態變量是根,否則類加載器將永遠不會卸載。 – 2014-10-07 09:59:03

回答

3

我讀到GC根的一個是「Live thread」。那是什麼意思?

活動線程是一個已啓動且尚未終止的線程。

什麼其他類型的對象引用不在線程堆棧或本地堆棧上線程表示具有?

無。

當他們說一個(活)線程是一個GC根時,它們的意思是(實際上)所有線程的堆棧幀中的值。

(「幀棧」和「本地棧」是同一回事。)

......究竟這是否意味着線程是一個GC根?

這意味着線程的堆棧是一個GC根,並且所有線程的堆棧幀中所有活動變量的內容都是可到達的。

這些東西都是有效的說相同的東西

+0

感謝您的澄清! – alobodzk 2014-10-09 14:01:23

+0

我懷疑yourkit的分類是任意的。這些區別肯定意味着*某事*。 – 2014-10-11 17:57:46

+0

幀堆棧用於解釋代碼,本地堆棧由解釋器本身和JIT編譯代碼使用。 – 2014-10-11 18:24:06

0

想象一下,當方法退出對象消失時(引用超出範圍並且任何堆分配的內存符合GC標準),將使用java線程對象local new'ed。如果使用相同的方法啓動線程,則現在該線程對象的實時時間以及它引用的任何內容都與活動線程的運行時間相關聯。在線程退出之前,仍然從正在運行的線程引用的內存不符合GC的要求,並且該線程被稱爲GC根目錄。

線程可以通過堆棧或堆以兩種不同的方式分配內存。堆棧存儲不是GC'ed,但在當前堆棧幀解開時回收。當您在代碼中使用「新」時,堆存儲通常會被分配(請注意,新並不總意味着堆存儲參見「轉義分析」)。堆是GC'ed。

瞭解更多關於GC根的一個好方法是將正在運行的Java應用程序的堆轉儲並加載到Visual VM或Eclipse MAT中,從那裏您應該能夠檢查GC根。

年輕一代的收集將使用GC根源,GC根不符合GC的條件,但根據給定的算法討論會更好。

0

JVM對其線程進行分區,其中一些專門用於垃圾收集,一些用於其他內部JVM任務,另一些用於執行用戶提供的可執行程序部分。

在這種情況下,可達意味着用戶執行線程可以訪問。這包括綁定從public static void main(String[] args)運行的第一個線程以及從該線程啓動的所有線程,減去無法訪問或完成的線程。