首頁>Program>source

AFAIK当GC執行其操作時,VM会阻塞所有正在執行的執行緒-或至少在壓縮堆時.在CLR和JVM (Production versions as of January 2010)的現代實現中就是這種情况 ? 由於我了解基本的工作原理,請不要提供有關GC的基本鏈接.

我假設是全域性鎖定,因為發生壓縮時,引用可能在移動期間無效,並且似乎最簡單的是仅鎖定整个堆(即,通過阻塞所有執行緒間接进行).我可以想象有更強大的機製,但是KISS经常占上风.

如果我不正確,可以通過對用於最小化阻塞的策略的簡單說明来迴答我的問题.如果我的假設正確,請對以下两个問题提供一些见解:

  1. 如果確實如此,那麼像JBOSS和Glassfish這樣的重量級企業引擎如何保持始终如一的高TPS率? 我在JBOSS上进行了一些谷歌搜尋,希望能在APACHE上找到適合於web處理的記憶體分配器之類的东西.

  2. 面對NUMA式的體系結構(可能不久的將来),這听起来像是一场灾难,除非程序受執行緒和記憶體分配的CPU約束。

最新回復
  • 9天前
    1 #

    答案是,這取決於所使用的垃圾收集演算法.在某些情况下,在GC期間停止所有執行緒是正確的.在其他情况下,在正常執行緒執行時繼續进行垃圾迴收是不正確的.要了解GC如何實現這一目標,您需要對垃圾收集器的理論和術語有详尽的了解,並需要對特定的收集器有所了解.簡直是不能接受簡單的解釋。

    哦,是的,值得指出的是,许多現代收藏家本身並没有壓實階段.而是通過將活動物件複製到新的"空間"並在完成後將旧的"空間"归零来进行工作。

    If I am incorrect my question would be answered by a simple explanation of the strategy used to minimise blocking.

    如果您真的想了解垃圾收集器的工作方式,我建議:

      "Garbage Collection: Algorithms for Automatic Dynamic Memory Management" by Richard Jones.

      "The Garbage Collection Handbook: The Art of Automatic Memory Management" by Richard Jones, Antony Hosking and Eliot Moss

    ...並且要註意,要對生产垃圾收集器的內部进行準確,详细的公開描述並不容易. (尽管在Hotspot GC的情况下,您可以查看源代碼...)

    EDIT: 迴應OP的評論...

    "It seems it is as I thought -- there is no getting around the "stop the world" part."

    這取決於.對於Java 6 Concurrent Collector,在標記根(包括堆棧)期間会有两个暂停,然後並行进行標記/複製其他物件.對於其他型別的並發收集器,在收集器執行時会使用讀取或寫入屏障,以捕获收集器和應用程式執行緒否則会相互干扰的情况.我現在没有[Jones]的副本,但我還記得,可以使" stop the world"間隔可以忽略不計...以更昂贵的指標操作和/或不收集所有指標為代價

  • 9天前
    2 #

    您是正確的,垃圾收集器將不得不暂停所有應用程式執行緒.通過使用並發收集器,sun JVM可以减少此暂停時間,该並發收集器可以在不停止應用程式的情况下執行一些工作,但是它必须暂停應用程式執行緒。

    請參见http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc和http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6. html#cms,以获取有關sun JVM如何在最新JVM中管理垃圾收集的详细資訊。

    對於web應用程式,我认為這不是問题.由於使用者請求應在短於1秒的時間內完成,因此分配给服務的任何臨時物件都不應退出年轻一代(只要它的大小合適)就可以非常有效地對其进行清理.其他具有较长生命週期的資料(例如使用者会话)將停留更长的時間,並可能影响花费在重大GC事件上的時間。

    在高TPS應用程式上,一種常见的策略是使用会话亲缘關係和負載平衡在相同或單独的硬體上執行應用程式服務器的多个例項.通過這樣做,可以使每个JVM的單个堆大小保持较小,這减少了執行主要收集時GC的暂停時間.通常,資料庫成為瓶颈,而不是應用程式或JVM。

    您可能会發現,与J2EE中特定於web的記憶體分配器概念最接近的是由框架和應用程式服務器執行的物件/例項池.例如,在JBOSS中,您具有EJB池和資料庫連線池.但是,這些物件通常是由於较高的建立成本而不是垃圾收集開銷而被合並的。

  • 9天前
    3 #

    我相信IBM已经进行了一些研究来提高多核系統中的GC效能,其中包括减少或消除工作量. "一切都停止"的問题。

    例如 看到: 服務器並行,增量和並發GC(pdf)

    或Google之類的"並發垃圾收集ibm"

  • 9天前
    4 #

    AFAIK when a GC is doing its thing the VM blocks all running threads -- or at least when it is compacting the heap. Is this the case in modern implementions of the CLR and the JVM (Production versions as of January 2010) ?

    Sun的Hotspot JVM和Microsoft的CLR都具有並發GC,它们仅在短期階段停止執行(以获取可訪問所有實時資料的全域性根的自洽快照),而不是整个收集週期.我不確定它们的壓縮實現方式,但是這種情况很少發生。

    If this is indeed the behaviour, how do heavyweight enterprise engines like JBOSS and Glassfish maintain a consistantly high TPS rate?

    這些引擎的等待時間比停止世界所需的時間长几个數量級.同樣,延迟被引用為例如第95个百分位數,這意味着延迟將仅在所引用時間跨度的95%以下.因此,壓縮不太可能影响加引號的延迟。

  • 9天前
    5 #

    Java有许多可用的GC演算法,並非所有演算法都阻塞了所有正在執行的執行緒.例如,您可以使用-XX:+ UseConcMarkSweepGC,它与應用程式同時執行(用於收集终身代)。

  • asp.net mvc:如何在ASP MVC中自定義HtmlValidationMessageFor
  • objective c:setStatusBarOrientation:animated:在iOS 6中不起作用