Java垃圾回收监控

7
我在Netbeans中有一个使用Java 7的项目需要进行性能分析。我希望能够知道,在垃圾回收时,有多少内存从伊甸园区进入幸存者区,是否有内存溢出到老年代。此外,我还想知道老年代空间随时间增长的大小变化情况。
我打印了GC统计信息,但只得到了类似下面这样的信息:
2339.967: [GC 2339.967: [ParNew: 66213K->4522K(69376K), 0.0161101 secs] 284589K->223320K(369484K), 0.0161685 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
2344.543: [GC 2344.543: [ParNew: 66218K->4520K(69376K), 0.0161084 secs] 285016K->223739K(369484K), 0.0161647 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 
2349.118: [GC 2349.118: [ParNew: 66216K->4519K(69376K), 0.0159046 secs] 285435K->224159K(369484K), 0.0159587 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 

有人知道找到我需要的信息的方法吗?

谢谢!


4
使用具有GC监控插件的VisualVM。 - Boris the Spider
请参见Q/A:http://stackoverflow.com/q/13924565/772000 - Aleš
3
除非你想花钱购买像JProfiler这样昂贵的分析工具(如果符合该类别,它们有免费的开源许可证),否则JVisualVM是最好的选择。JVisualVM永远都是免费的(就像啤酒一样)。 - SnakeDoc
@SnakeDoc 也是非常有用的信息。谢谢! - BarryBostwick
@SnakeDoc,因为您需要更多细节?因为visuagc是更好的监控堆工具?因为它是免费的,只需要下载一次即可? - Marko Topolnik
显示剩余5条评论
4个回答

13

以下是一些有用的垃圾回收标志:

-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps
-XX:+PrintClassHistogram
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime

-XX:+PrintTenuringDistribution应该可以给你想要的东西。


点赞。这是一个有用的回答。对于那些没有在评论中给出理由就进行负评的人,这并不礼貌。 - Piotr Kołaczkowski

6

一个简单的解决方案是使用jstat,这将显示所有不同内存区域(Eden、Survivor空间)在所有代中的占用情况。

例如使用:jstat -gcutil -t <pid> <interval> <number_of_samples>

示例输出:

jstat -gcutil 21891 250 7
  S0     S1     E      O      P     YGC    YGCT    FGC    FGCT     GCT
 12.44   0.00  27.20   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  62.16   9.49  96.70    78    0.176     5    0.495    0.672
 12.44   0.00  83.97   9.49  96.70    78    0.176     5    0.495    0.672
  0.00   7.74   0.00   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  23.37   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  43.82   9.51  96.70    79    0.177     5    0.495    0.673
  0.00   7.74  58.11   9.51  96.71    79    0.177     5    0.495    0.673

说明:
此示例的输出显示,在第3个和第4个样本之间发生了年轻代收集。这次收集花费了0.001秒,并将对象从eden空间(E)提升到老年代(O),导致老年代利用率从9.49%增加到9.51%。在收集之前,survivor空间使用率为12.44%,但在此收集之后,仅使用7.74%。
更重量级的选项是分析器,例如带有GC监视的JVisualVM,或者具有Java 7u40的新Java Mission Control。
此外,请考虑以下GC选项:-XX:+PrintTenuringDistribution-XX:MaxTenuringThreshold

因为您正在使用默认的Gravatar ;-P - SnakeDoc

6

1

使用-XX:+PrintGCDetails标志以启用打印更多详细信息。


为什么要踩票?你的问题中没有提到在哪里使用这个标志。输出建议你只使用了“-verbose:gc”标志。 - Piotr Kołaczkowski

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