2015-08-25 21 views
1

最近我發現它在我的java應用程序中有一個頻繁的年輕gc。由於我有一個1600M的年輕一代,並且每10秒就做一次年輕的gc,我認爲有太多不必要的物體會導致這些gcs。如何確定Java應用程序的年輕gc的原因

我知道我可以使用jmap做一個heapdump來找出導致完整gc的原因。但我怎樣才能找出年輕的gen(因爲一個堆轉儲應該清潔年輕的gen和年輕的gen始終是變化的)

而另一個問題:請問jstat -gcutil會增加gc頻率嗎?

+0

一般來說,看到頻繁的年輕gc是正常的。因爲年輕的GC很快,所以很難成爲性能問題的根源。 建議你可以啓用日誌記錄GC,例如: -XX:+ PrintGCDateStamps -XX:+ PrintGCDetails -XX:+ PrintHeapAtGC -Xloggc: 並使用GC分析工具,如:HTTP://www.tagtraum.com/ gcviewer.html,檢查GC使用的時間。然後你會看到年輕的GC是否是問題。 –

回答

1

選項1 - SJK's hh command 它使用jmap發作。如果你用--dead-young運行它,它會執行下面的操作。

  • 執行全GC
  • 等待10秒(新鮮垃圾生產)
  • 採取堆直方圖而不GC
  • 立即採取執行GC和取直方圖(如JMAP --live)
  • 比較兩個直方圖和返回差異 - 在過去10秒內創建並收集的對象。

選項2 - Java Mission Control 它是爪哇8 JDK的一部分。它可以在TLAB分配失敗時對對象分配進行採樣。雖然不完全準確,但在實踐中檢測垃圾點非常有用。

jstat -gc不執行GC,它通過內存映射文件使用信息。 JVM將一些指標轉儲到該文件,然後jstat對其進行輪詢。

+0

嗨阿列克謝,我試過sjk的......。它打印出像jmap -histo這樣的東西。 java.lang.Integer/java.lang.String。我其實找到了原因,但這還不夠深入。我想繼續跟蹤這些對象以找出誰創建了它們。但是我沒有發現關於堆轉儲的選項。我能做些什麼來找出發起人? – Alexis

+0

我還發現有太多的StackElementTrace,這意味着有很多異常發生。但是我沒有在我的日誌文件中發現任何日誌,所以有機會找到誰創建這些異常? – Alexis

+0

@Alexis正如我所說,sjk只是jmap的一個奇妙的包裝。嘗試Java Mission Control,它可以跟蹤對象創建的熱點。 –

相關問題