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