Java垃圾回收(1)
這是有關垃圾收集(GC)的系列文章中的第一篇。 我希望能夠涵蓋整個系列過程中的理論知識以及熱點虛擬機中的所有主要收集器。 這篇文章僅說明什么是垃圾回收,以及不同回收器共有的元素。
我為什么要在乎?
您的Java虛擬機可以為您管理內存-這非常方便-但默認情況下可能未對它進行優(yōu)化調整。 通過了解垃圾收集背后的一些理論,您可以更輕松地調整收集器。 一個普遍關心的問題是收集器的效率,也就是說,您的程序花了多少時間執(zhí)行程序代碼而不是收集垃圾。 另一個常見問題是應用程序暫停的時間長。
關于垃圾收集還有很多傳聞和民間傳說,因此更詳細地了解算法確實有助于避免陷入常見的陷阱和陷阱。 此外,對于任何對如何應用和使用計算機科學原理感興趣的人,JVM內部都是一件很棒的事情。
停止世界是什么意思?
您的程序(或GC-Speak中的mutator)將在運行時分配對象。 在某個時候,需要收集堆,并且熱點中的所有收集器都會暫停您的應用程序。 “世界停止”一詞用于表示所有增變器的線程都已暫停。
可以實現(xiàn)不需要暫停的垃圾回收器。 Azul已在其Zing虛擬機中實現(xiàn)了有效的不間斷收集器。 我不會介紹它是如何工作的,但是如果您想了解更多信息,會有一張非常有趣的白皮書 。
年輕/弱世代假說
簡而言之: 大多數(shù)分配的對象都死于年輕 1 。 通過對1980年代一大批程序的內存分配和活動模式進行實證分析,證明了這一概念。 研究人員發(fā)現(xiàn),不僅大多數(shù)物體死于年輕,而且一旦它們活到一定年齡,它們就會活很長一段時間。 下圖取自SUN / Oracle研究,以直方圖的形式查看了對象的壽命。
堆的組織方式如何?
年輕的世代假設催生了世代垃圾收集的思想,在世代垃圾收集中,堆被分為幾個區(qū)域,每個區(qū)域中對象的放置與它們的年齡相對應。 以上這些垃圾收集器( G1除外)共有的一個要素是將堆組織到不同空間的方式。
最初分配對象時(如果適合)將它們存儲在Eden空間中。 如果對象在集合中幸存下來,那么它將最終到達幸存者空間。 如果它能夠存活幾次(您的使用期限閾值),則該對象最終將出現(xiàn)在使用期限的空間中。 收集器收集這些空間的算法的細節(jié)各不相同,因此我將在以后的博客文章中單獨介紹它們。
這種劃分是有益的,因為它允許您在不同的空間上使用不同的算法。 如果大多數(shù)對象都已失效,則某些GC算法效率更高;如果大多數(shù)對象都處于活動狀態(tài),則某些GC算法效率更高。 由于世代相傳的假設,通常是到了在伊甸園收集大多數(shù)物體的時候,幸存者空間已經(jīng)死了,而保有權的大多數(shù)物體還是活著的。
還有永久性的-永久的一代。 這是一個特殊的世代,其中包含與Java語言本身相關的對象。 例如,此處包含有關已加載類的信息。 從歷史上看,被插入或為常量的字符串也保存在這里。 永久代已被刪除,轉而支持元空間 。
多個收藏家
熱點虛擬機實際上具有各種不同的垃圾收集器。 每個都有不同的性能特征集合,并且更(或更少)適合于不同的任務。 我將要研究的關鍵垃圾收集器是:
- 并行清理 (PS):最近發(fā)布的JVM中的默認收集器。 為了收集而停止運行,但是并行收集(即使用多個線程)。
- 并發(fā)標記掃描 (CMS):此收集器具有多個階段,其中一些階段使世界停滯不前,但在該階段的多個階段也與程序同時運行。
- 增量并發(fā)標記掃描 (iCMS):CMS的一種變體,旨在降低暫停時間。 有時可以做到這一點!
- 垃圾優(yōu)先 (G1):一種新型的收集器,最近變得更加穩(wěn)定,并且使用量正在緩慢增加。
結論
我已經(jīng)對垃圾收集提出了一些介紹性的觀點,在下一篇文章中,我將介紹Parallel Scavenge收集器-它是當前的默認收集器。 我還想提供我的雇主鏈接,該雇主擁有我們認為非常有用的GC日志分析器 。
翻譯自: https://www.javacodegeeks.com/2013/06/garbage-collection-in-java-1.html
總結
以上是生活随笔為你收集整理的Java垃圾回收(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理光gx200(理光gx200拍摄作品)
- 下一篇: 少锁定Java对象池