簡體   English   中英

Java垃圾收集“真實”時間比“用戶”+“系統”大得多

[英]Java garbage collection “real” time is much bigger than “user” +“system”

這就是使用詳細gc啟用的完整gc的樣子 -

13463.547: [Full GC [PSYoungGen: 323053K->0K(325952K)]
           [PSOldGen: 653170K->331738K(655360K)] 976224K->331738K(981312K)
           [PSPermGen: 238715K->238715K(264448K)], 385.4631490 secs]
           [Times: user=2.19 sys=1.35, real=385.50 secs]

實時如何比user + sys大得多?

我的第一個想法是垃圾收集器正在等待資源,但是這個資源似乎不是IO或CPU,因為“頂部”輸出在gc發生時不顯示任何cpu或內存問題。

要進行完整集合,您需要停止所有線程。 (它叫停止世界收藏的原因之一)

停止所有線程可能需要很長時間,尤其是如果你有數千個線程。 每個線程必須達到“安全點”才能阻止它。

這種行為通常意味着你有太多的線程。 您可能還會考慮ConcurrenntMarkSweep收集器或新的G1收集器,它不需要經常停止應用程序。

嘗試閱讀本文(白皮書中包含更多鏈接): Java 1.5 GC Internals
我猜大多數事情仍然適用於Java的1.6 VM,它提供了一個很好的洞察GC的工作方式。
另外,請閱讀: 調整JVM的1.6堆空間
(還有另一個白皮書鏈接與說明性的基准,但我找不到它:(:/
我會試着看看它是否會彈出某個地方,但我猜它位於Oracle網站的某個地方)

一般來說,不要變得怪異。 根據一些基本原理嘗試並嘗試不同的選項,看看它是如何工作的。 除非你的性能提升超過10%並且你的應用程序很重要,否則不要混淆很多細節。
原因很簡單:僅在幾個LOC中進行簡單的代碼重寫可能會顯着改變GC的行為。
慢慢來,玩得開心! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM