簡體   English   中英

多少個Java垃圾收集器對象?

[英]how many Java Garbage Collector objects?

誰能告訴我,如果我們並行執行兩個線程來調用垃圾收集器,那么會創建多少個gc對象?

總是只有一個垃圾收集器,在其自己的Thread中運行

正如其他人指出的那樣,有一個垃圾收集器。
您不必關心垃圾收集器對象的數量
或有關垃圾收集器的任何詳細信息。 這是什么
在JVM /系統級別。 您只關心何時調用垃圾
顯式收集(如果您想這樣做)。

(這是對OP的評論的回應,該評論揭示了其問題根源的誤解的本質。請參見引用的文字...)

是的,運行時是單例,但是當我們調用Runtime.gc()時,...

正確

...在內部的jvm中,它將創建一個垃圾垃圾線程(守護進程線程)。

不正確。 它不會創建新的GC線程。 而是使現有的GC線程喚醒並進行垃圾回收。 此外:

  • 在垃圾收集器完成之前,調用gc()的線程不會返回。

  • 根據已配置的垃圾收集器,垃圾收集器可能會在開始收集之前凍結所有其他應用程序線程。

...但是在這種情況下,當我們一次在兩個不同的線程中調用gc時,將創建多少個GC對象?

沒有。 如果兩個方法同時調用gc() ,則GC將在現有GC線程上運行一次。 將GC視為在任何時間點運行或休眠的“引擎”。 如果當前正在休眠,則調用gc() 通常會導致GC開始運行。

(實際上,我在簡化一些事情。CMS和G1的復雜之處在於gc()通常與應用程序線程並行運行。另一種可能性是gc()調用將被簡單地忽略。最后,GC典型有多種模式;例如,年輕一代收藏和完整收藏。調用gc()將啟動完整收藏。)

...但是我們說GC是守護程序線程

是(有點),

GC可能有多個線程。 通常有一個主GC線程和另一個用於處理終結的線程。 對於某些類型的GC,某些任務是使用線程池並行執行的。

而且gc()具有本地實現

對於主流JVM,可以。 (但作為反例,盡管使用Unsafe方法等,在JNode中還是用Java實現的。)

那什么是GC?

它是進行垃圾收集的“東西”。 實際情況是特定於JVM的,並且取決於JVM選項等。

暫無
暫無

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

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