详细的Java GC日志记录

5
当使用以下参数时,Sun JVM将详细输出GC日志到StdOut。
 -verbose:gc
 -XX:+PrintGCTimeStamps
 -XX:+PrintGCDetails

然而,我不希望在标准输出中获得输出,我也不需要每个GC的详细信息。是否可以以编程方式访问用于这些日志的数据?我想能够记录到自己的日志文件中分配/收集的内存量,并且理想情况下还能随时间记录平均对象大小。

2个回答

4

你需要添加

-Xloggc:log_file_name

每次JVM启动时都会重新初始化此文件,因此如果您想保留它以进行分析,请不要忘记将其移动到安全位置。

Java理解的许多命令行选项的完整列表可以在这里找到(适用于Java 6)。


谢谢。我希望有一个API,这样我就可以在运行时访问这些数据,并每5分钟写入有关分配、收集和提升数据量的统计信息。 - mchr
许多有关垃圾回收的信息都可以通过JMX获得,打开jconsole并查看JVM公开的不同MBean。在SO上有几个关于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
- Dan Pritts

0

您可以使用JMX Beans来代替内存池和GC。它们的优点是您可以在自由时间表上查询计数器。缺点是,它们因不同的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

JMX中的CollectionTime值可靠吗?当我将它们与从gc.log中累加的时间进行比较时,我发现JMX值严重低估了在GC中花费的时间。 - Ian Rose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接