jvm gc,gc算法_GC解释:算法
jvm gc,gc算法
如前一篇文章中所述,HotSpot JVM中有四個可用的垃圾收集器。 它們之間有一些顯著差異,但是用于完成實際工作的算法背后的實際概念非常相似。 在這篇簡短的文章中,我將嘗試解釋三種基本算法:
- 打標
- 打標緊湊
- 標記復制
GC根
在進入細節之前,請確保我們對什么是GC根有一個共識。 這些是可以從堆外部直接訪問的對象。 例如:
- 活動線程
- 靜態變量
- 局部變量(可通過線程堆棧訪問)
- JNI參考
標記
討論的所有算法都具有相同的標記階段。 標記階段是從GC根開始遍歷整個對象圖。 當GC訪問該對象時,它將其標記為可訪問并因此處于活動狀態。 從GC根無法訪問的所有對象都是垃圾。 標記需要暫停(STW)暫停,因為正在運行的應用程序線程可能會干擾。 STW暫停的時間長短主要取決于訪問對象的數量。
打標
在標記階段之后,我們擁有了已訪問(可通過GC根訪問)和未訪問對象占用的內存空間。 掃描階段將釋放包含無法訪問對象的內存片段。 這很簡單,但是由于死對象不一定彼此相鄰,因此最終導致內存碎片化。 這本身還不錯,但是嘗試將太大的對象放入內存中可能導致OutOfMemoryError 。
打標緊湊
該算法解決了內存碎片的問題。 標記所有活動對象后,它們將移到內存空間的開頭。 這有助于避免由于內存碎片過多而導致的OutOfMemoryError ,但是壓縮堆并不是免費的。 復制對象和更新對它們的所有引用都需要時間,并且所有操作都在STW暫停期間發生。
標記復制
標記復制算法將所有活動對象復制到新的內存區域。 先前占用的區域被認為是空閑的。 下次執行標記復制時,所有活動對象都移回到上一個存儲區。 您可以想象,這當然會導致內存壓縮。 不幸的是,它需要額外的額外區域,該區域必須足夠大以適合任何給定時間點的所有活動對象。
翻譯自: https://www.javacodegeeks.com/2017/09/gc-explained-algorithms.html
jvm gc,gc算法
總結
以上是生活随笔為你收集整理的jvm gc,gc算法_GC解释:算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需求澄清_澄清字符串的格式!
- 下一篇: linux系统备份与还原(linux 系