您认为有关垃圾收集的7件事-完全错了
關于Java垃圾收集的最大誤解是什么,它的真實情況如何?
小時候,我的父母曾經告訴我,如果我學習不好,我將成為垃圾收集者。 他們所知道的很少,垃圾回收實際上很棒。 也許這就是為什么即使在Java世界中,許多開發人員也會誤解GC算法:它們如何工作,GC如何影響其應用程序以及您可以對此做些什么。 這就是為什么我們求助 Java性能調優專家Haim Yadid并將Java性能調優指南放到Takipi博客上的原因。
新帖:關于垃圾回收的7件事您以為您知道-完全錯了http://t.co/3QJLJuKCRq pic.twitter.com/aqQEF0zTkK
— Takipi(@takipid) 2015年4月6日
出于對性能調整指南的興趣,在此后續文章中,我們決定收集一些有關垃圾回收的流行觀點,并向您展示為什么它們是完全錯誤的。 以下是前7名:
1.只有一個垃圾收集器
不,并且4也不是正確的答案。 HotSpot JVM總共有4個垃圾收集器: 串行,并行/吞吐量。 CMS,并在塊G1上新建一個孩子 。 但是,還有更多,還有非標準的垃圾收集器,還有更多冒險的實現,例如Shenandoah或其他JVM使用的收集器(例如C4, Azul的不間斷收集器)。 HotSpot的默認值是并行/吞吐量收集器,通常這不是您的應用程序的最佳選擇。 例如,CMS和G1收集器將導致較少的GC暫停。 但是當出現暫停時,其持續時間很可能會比Parallel收集器引起的持續時間更長。 另一方面,對于相同大小的堆,并行收集器通常可實現更高的吞吐量。
總結:根據您的要求選擇合適的垃圾收集器:可接受的GC暫停頻率和持續時間。
2.并行=并發
垃圾回收周期可以是STW(世界停止運行)并導致GC暫停,也可以并發執行而無需停止應用程序。 當我們更進一步時,GC算法本身可以是串行(單線程)或并行(多線程)的。 這就是為什么當我們提到并發GC時,它不一定意味著它是并行完成的;反之,當我們提到串行GC時,它并不一定意味著它會引起暫停。 在垃圾回收世界中,Concurrent和Parallel是兩個絕對不同的術語,其中Concurrent是指GC周期,而Parallel是指GC算法本身。
要點:垃圾回收是一個兩步游戲,調用GC周期的方式及其進行業務的方式是兩件不同的事情。
3. G1解決了所有問題
G1收集器是Java 7中引入的,并且經過了許多更改和修改,是JVM垃圾收集器的最新添加。 主要優點是,它解決了CMS收集器常見的碎片問題:GC循環釋放舊一代的內存,使之看起來像瑞士奶酪,直到片刻JVM無法處理并不得不停止并停止運行。處理碎片。 但這還不是故事的結局,在某些情況下其他收藏家的表現可能優于G1。 這完全取決于您的要求。
要點:沒有所有GC問題的奇跡解決方案,需要進行實驗以幫助您為JVM選擇正確的收集器。
4.平均交易時間是最重要的指標
如果僅監視服務器中的平均交易時間,那么您會錯過異常值。 人們對系統用戶的破壞性知之甚少。 例如,通常需要100毫秒以下的事務可能會受到GC暫停的影響,并且需要一分鐘才能完成。 如果您只查看平均交易時間,那么除了用戶以外的任何人都不會注意到。 現在,針對1%或以上的用戶考慮這種情況,您會發現僅查看平均值時,容易被忽略的情況。 有關與延遲相關的更多問題以及解決方法,請點擊此處查看Gil Tene的博客。
要點:密切注意異常值,了解系統在第99個百分位數( 不是1% )上的表現。
5.降低新的對象分配率將改善GC行為
我們可以將系統中的對象大致分為三類:長期存在的對象,通常對它們我們無能為力,導致最大問題的中期存在的對象,以及通常會被釋放并長期釋放的短暫存在的對象分配Swift,因此它們在下一個GC周期中就消失了。 中度對象是那些注重其分配率可以帶來積極結果的對象。 集中精力于短期和長期的對象通常不會被證明是有效的,而控制中等壽命的對象通常是一項艱巨的任務。
要點:并不是唯一的對象分配速率會限制您的服務器,而是造成所有麻煩的對象類型。
6.調整可以解決所有問題
如果您的應用程序需要保持經常更改的大型狀態,那么調整JVM的堆并不會帶來太多好處。 GC長時間停頓是不可避免的。 可以在體系結構更改方面提出解決方案,在此方面,要確保具有影響響應時間的關鍵過程/瓶頸的流程不會包含大狀態。 大型狀態和響應能力不能很好地結合在一起:將其分解為不同的流程將是解決之道。
總結:并非所有問題都可以通過調整JVM標志來解決,有時您只需要回到繪圖板上即可。
7. GC日志會導致大量開銷
這是完全不正確的,尤其是默認的日志設置。 數據非常有價值,并且Java 7引入了掛鉤來控制它們的大小,并確保它們不會用完您的所有硬盤驅動器。 如果您不收集GC日志數據,那么您將失去了解JVM垃圾回收在生產中的行為的唯一途徑。 可接受的GC開銷通常有5%的上限,要知道系統會暫停什么樣的收費GC并采取最小化措施,這是一個微不足道的代價。
總結:竭盡所能,在生產中從系統中獲取最多的數據。 那里是一個完全不同的世界。
結論
我們希望這些內容能幫助您更好地理解垃圾回收在Java中的實際工作方式。 您是否在應用程序中認識到其中一些問題? 您是否發現其他常見的垃圾回收錯誤? 在下面的評論部分讓我們知道。
翻譯自: https://www.javacodegeeks.com/2015/04/7-things-you-thought-you-knew-about-garbage-collection-and-are-totally-wrong.html
總結
以上是生活随笔為你收集整理的您认为有关垃圾收集的7件事-完全错了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑的滚动屏幕快捷键(电脑左右滚动快捷键
- 下一篇: linux内存进程按使用大小排序(lin