Java垃圾回收(2)
并行清理
今天,我們介紹了并行GC的工作原理。 具體來說,這是在Eden上運行Parallel Scavenge收集器,在Tenured一代中運行Parallel Mark and Sweep收集器的組合。 您可以通過傳遞-XX:+ UseParallelOldGC來獲得此選項,盡管它是某些計算機類型的默認選項。
如果您還沒有讀過我的第一本有關垃圾收集的博客文章,因為這沒有概述。
伊甸園和幸存者空間
在平行的掃氣收集器中,使用稱為半球GC的方法收集伊甸園和幸存者空間。 對象最初是在Eden中分配的,一旦Eden接近全1 ,就會觸發gc的Eden空間。 這樣可以識別活動物體并將其復制到活動的“幸存者空間” 2中 。 然后,它將整個Eden空間視為一個空閑的,連續的內存塊,可以再次分配到該內存塊中。
在這種情況下,分配過程就像切碎切達干酪一樣結束。 每個塊都被連續切開,然后旁邊的切片將被“吞噬”。 這樣做的好處是分配只需要添加指針即可。
切達干酪一塊,準備分配。
為了識別有生命的物體,進行物體圖的搜索。 搜索從一組“根”對象開始,這些對象是可以保證存在的對象,例如,每個線程都是一個根對象。 然后,搜索將找到由根集指向的對象,并向外擴展直到找到所有活動對象。 這是一個非常好的繪畫作品,由Michael Triana提供
在并行清除的上下文中,并行表示收集是由同時運行的多個線程完成的。 這不應與增量GC混淆,增量式GC的收集器與程序同時運行或交錯運行。 通過更好地使用現代多核CPU,并行收集可提高整體GC吞吐量。 通過為每個線程提供一組要標記的根以及對象表的一部分來實現并行性。
有兩個幸存者空間,但是在任何時間點只有一個處于活動狀態。 它們的收集方式與伊甸園相同。 這個想法是,當物體從伊甸園提升時,它們會被復制到活躍的幸存者空間中。 然后,當需要疏散空間時,將它們復制到非活動幸存者空間。 一旦活動幸存者空間被完全撤離,則非活動空間變為活動狀態,而活動空間變為非活動狀態。 這是通過將指針翻轉到幸存者空間的開頭來實現的,這意味著可以釋放幸存者空間中的所有死對象,而只需分配給單個指針即可。
年輕一代的設計和時間權衡
由于這僅涉及復制活動對象并且指針更改,因此收集伊甸園和幸存者空間所花費的時間與活動對象的數量成比例。 這是非常重要的,因為由于世代的假設,我們知道大多數對象都死于年輕,因此釋放與它們相關聯的內存沒有GC成本。
幸存空間的設計受到這樣一種想法的啟發:年輕時收集對象比收集長期使用的空間要便宜。 在幾次GC運行中,以半球方式繼續收集對象有助于整體吞吐量。
最后,伊甸園被組織成一個連續的空間,這使得對象分配便宜。 AC程序可能會重新使用“ malloc”命令來分配一塊內存,這涉及遍歷內存中的可用空間列表,以嘗試找到足夠大的空間。 當您使用競技場分配器并連續分配時,您需要做的就是檢查是否有足夠的可用空間,然后將指針增加該對象的大小。
平行標記和掃掠
在一定數量的收藏中幸存下來的對象就進入了租用空間。 他們生存所需的次數稱為“任職期限”。 使用稱為標記和清除的算法,保有權集合的工作方式與Eden有所不同。 每個對象都有一個與之關聯的標記位。 標記最初全部設置為false,并且在圖形搜索過程中到達對象時將其設置為true。
標識活動對象的圖形搜索類似于為年輕一代描述的搜索。 區別在于,它不是復制活動對象,而是對其進行標記。 之后,它可以遍歷對象表并釋放所有不存在的對象。 該過程由多個線程并行完成,每個線程都搜索堆的一個區域。
不幸的是,刪除不活動對象的過程使使用期空間看起來像瑞士奶酪。 您會在對象所在的位置獲得一些已使用的內存,以及對象之前所在的位置之間的差距。 這種碎片化對應用程序性能沒有幫助,因為它使分配大于Kong大小的對象成為不可能。
Mark and Sweep之后的奶酪。
為了減少Swiss Cheese的問題,并行標記/掃描將堆壓縮到較小的位置,以嘗試在占位空間的開始處連續分配活動對象。 刪除后,它搜索租用空間的區域,以識別占用率低和占用率高的區域。 來自占用率較低區域的活動對象向下移至占用率較高的區域。 這些自然位于上一個壓縮階段的內存較低端。 在此階段中,對象的移動實際上是由分配給目標區域而不是源區域的線程執行的。
低入住率的奶酪。
摘要
- 并行Scavenge將堆拆分為4個空間:伊甸園,兩個幸存者空間和終身使用空間。
- 并行Scavenge使用并行復制收集器到收集器Eden和Survivor Spaces。
- 租用空間使用了不同的算法。 這會標記所有活動對象,刪除不活動的對象,然后壓縮空間/
- 并行Scavenge具有良好的吞吐量,但是在運行時會暫停整個程序。
在第三部分中,我將介紹CMS或Concurrent-Mark-Sweep收集器的工作方式。 希望對乳制品過敏的人更容易閱讀這篇文章。
翻譯自: https://www.javacodegeeks.com/2013/06/garbage-collection-in-java-2.html
總結
以上是生活随笔為你收集整理的Java垃圾回收(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring MVC:会话高级
- 下一篇: 怎么连接两个电脑上网方式(两台电脑内网怎