2011-09-02 128 views
5

當使用以下參數時,Sun JVM將詳細的GC日誌輸出到StdOut。詳細的Java GC日誌

-verbose:gc 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 

但是,我不希望在StdOut中的輸出,我真的不需要每個GC的詳細信息。是否有可能以編程方式訪問用於這些日誌的數據?我希望能夠登錄到我自己的日誌文件分配/收集的內存量,理想情況下隨着時間的推移平均對象大小。

回答

4

您需要添加

-Xloggc:log_file_name 

此文件被重新初始化每個JVM啓動時間,所​​以不要忘了將它移動到安全的地方,如果你想保持它進行分析。

的許多命令行選項的Java理解的完整列表,可以發現here的Java 6

+0

感謝。我希望有一個API,以便我可以在運行時訪問這些數據,並且每隔5分鐘寫一次關於分配,收集和升級的數據量的統計數據。 – mchr

+0

有關垃圾收集的大量信息通過JMX提供,打開'jconsole'並查看JVM公開的不同mbeans。在這裏關於JMX和GC也有幾個問題。如果你懂德語,這篇文章和相關的代碼包含一些有趣的想法http://www.torsten-horn.de/techdocs/jmx-gc.htm – fvu

+2

從JVM 1.6.0_34開始,你可以讓Java旋轉日誌。 '-XX:+ UseGCLogFileRotation -XX:NumberOfGCLogFiles = <文件數> -XX:GCLogFileSize = ' 注意需要所有三個選項。其他技巧在這裏:http://jyates.github.io/2012/11/05/rolling-java-gc-logs.html –

0

您可以使用內存池和GC而不是JMX豆。他們的優勢是你可以得到專櫃,這可以在免費的時間表上查詢。缺點是,它們對於各種VM供應商,版本和GC設置有所不同。

例如

java.lang:type=GarbageCollector,name=Copy 
    CollectionCount, ColletionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=GarbageCollector,name=MarkSweepCompact 
    CollectionCount, CollectionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=Memory 
    HeapMemoryUsage[1].commited,init,max,used 
+0

JMX的CollectionTime值是否可靠?當我將它們與從gc.log中添加的時間進行比較時,我發現JMX值大量少計GC中花費的時間。 –