最近我發現它在我的java應用程序中有一個頻繁的年輕gc。由於我有一個1600M的年輕一代,並且每10秒就做一次年輕的gc,我認爲有太多不必要的物體會導致這些gcs。如何確定Java應用程序的年輕gc的原因
我知道我可以使用jmap做一個heapdump來找出導致完整gc的原因。但我怎樣才能找出年輕的gen(因爲一個堆轉儲應該清潔年輕的gen和年輕的gen始終是變化的)
而另一個問題:請問jstat -gcutil會增加gc頻率嗎?
最近我發現它在我的java應用程序中有一個頻繁的年輕gc。由於我有一個1600M的年輕一代,並且每10秒就做一次年輕的gc,我認爲有太多不必要的物體會導致這些gcs。如何確定Java應用程序的年輕gc的原因
我知道我可以使用jmap做一個heapdump來找出導致完整gc的原因。但我怎樣才能找出年輕的gen(因爲一個堆轉儲應該清潔年輕的gen和年輕的gen始終是變化的)
而另一個問題:請問jstat -gcutil會增加gc頻率嗎?
選項1 - SJK's hh command 它使用jmap發作。如果你用--dead-young運行它,它會執行下面的操作。
選項2 - Java Mission Control 它是爪哇8 JDK的一部分。它可以在TLAB分配失敗時對對象分配進行採樣。雖然不完全準確,但在實踐中檢測垃圾點非常有用。
jstat -gc
不執行GC,它通過內存映射文件使用信息。 JVM將一些指標轉儲到該文件,然後jstat
對其進行輪詢。
嗨阿列克謝,我試過sjk的......。它打印出像jmap -histo這樣的東西。 java.lang.Integer/java.lang.String。我其實找到了原因,但這還不夠深入。我想繼續跟蹤這些對象以找出誰創建了它們。但是我沒有發現關於堆轉儲的選項。我能做些什麼來找出發起人? – Alexis
我還發現有太多的StackElementTrace,這意味着有很多異常發生。但是我沒有在我的日誌文件中發現任何日誌,所以有機會找到誰創建這些異常? – Alexis
@Alexis正如我所說,sjk只是jmap的一個奇妙的包裝。嘗試Java Mission Control,它可以跟蹤對象創建的熱點。 –
一般來說,看到頻繁的年輕gc是正常的。因爲年輕的GC很快,所以很難成爲性能問題的根源。 建議你可以啓用日誌記錄GC,例如: -XX:+ PrintGCDateStamps -XX:+ PrintGCDetails -XX:+ PrintHeapAtGC -Xloggc: 並使用GC分析工具,如:HTTP://www.tagtraum.com/ gcviewer.html,檢查GC使用的時間。然後你會看到年輕的GC是否是問題。 –