2017-10-10 85 views
1

我有一個使用Tomcat Webserver構建的Java應用程序。 使用Java任務控制我知道在壓力下,GC非常佔優勢。每個GC週期中,CPU都非常高。 我想知道的是,每個GC循環都在做什麼,特別是我想知道它正在推廣哪個對象,以及哪個對象正在釋放。對於被釋放的對象,我想知道,不僅是它們是什麼類型,而且它們是在哪裏創建的。只知道我有很多字節[]或字符串,顯然沒有幫助,因爲有很多地方可以創建這些地方,但只有少數地方在我的控制之下並占主導地位。Java GC很高,如何找出哪些對象是GCed

有沒有人知道這樣做的工具或方法。

在此先感謝。

+0

您是否使用了[Flight recording](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr005.html)? – nullpointer

+0

是的,飛行記錄儀是我發現GC導致CPU峯值的原因。但是,JFR不會提供我需要/描述的信息。或者至少我不知道如何獲取該信息 –

+0

GC日誌以及您的JFR配置文件可以很好地瞭解原因。 – nullpointer

回答

1

您需要記錄對象分配,而不是收集的內容。漸近式收集和分配是相同的,但後者可以提供更多的信息。

各種java概要分析解決方案提供此類功能。

2

選項1 - 使用Java Flight Recorder allocation profiling option。我明白你對死對象感興趣,但訣竅是大多數新對象很快就會死掉。

選項2 - SJK死對象直方圖。 SJK只需要很少的堆直方圖(與jmap -histo相同)並報告差異。它有選擇計算死亡和年輕的死亡人口。