新一代JVM垃圾回收算法出爐
你對新一代JVM垃圾回收算法是否了解,這里和大家分享一下,傳統的分代JVM垃圾回收方式確實也考慮了實時性要求而提供了并發回收器,支持***暫停時間的設置,但是受限于分代JVM垃圾回收的內存劃分模型,其效果也不是很理想,于是就誕生了新一代JVM垃圾回收算法。
新一代JVM垃圾回收算法
JVM垃圾回收的瓶頸
傳統分代JVM垃圾回收方式,已經在一定程度上把JVM垃圾回收給應用帶來的負擔降到了最小,把應用的吞吐量推到了一個極限。但是他無法解決的一個問題,就是FullGC所帶來的應用暫停。在一些對實時性要求很高的應用場景下,GC暫停所帶來的請求堆積和請求失敗是無法接受的。這類應用可能要求請求的返回時間在幾百甚至幾十毫秒以內,如果分代JVM垃圾回收方式要達到這個指標,只能把***堆的設置限制在一個相對較小范圍內,但是這樣有限制了應用本身的處理能力,同樣也是不可接收的。
分代JVM垃圾回收方式確實也考慮了實時性要求而提供了并發回收器,支持***暫停時間的設置,但是受限于分代JVM垃圾回收的內存劃分模型,其效果也不是很理想。
為了達到實時性的要求(其實Java語言最初的設計也是在嵌入式系統上的),一種新JVM垃圾回收方式呼之欲出,它既支持短的暫停時間,又支持大的內存空間分配。可以很好的解決傳統分代方式帶來的問題。
增量收集的演進
增量收集的方式在理論上可以解決傳統分代方式帶來的問題。增量收集把對堆空間劃分成一系列內存塊,使用時,先使用其中一部分(不會全部用完),垃圾收集時把之前用掉的部分中的存活對象再放到后面沒有用的空間中,這樣可以實現一直邊使用邊收集的效果,避免了傳統分代方式整個使用完了再暫停的回收的情況。
當然,傳統分代收集方式也提供了并發收集,但是他有一個很致命的地方,就是把整個堆做為一個內存塊,這樣一方面會造成碎片(無法壓縮),另一方面他的每次收集都是對整個堆的收集,無法進行選擇,在暫停時間的控制上還是很弱。而增量方式,通過內存空間的分塊,恰恰可以解決上面問題。
【編輯推薦】