6

我在 Netbeans 中有一个正在分析的项目(使用 Java 7)。我正在寻找的是,在垃圾收集时,有多少来自 Eden 空间的内存进入 Survivor 空间,以及是否有任何内存溢出到 Tenured 空间。最重要的是,我正在寻找 Tenured 空间如何随着时间的推移而增长。

我打印 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

4 回答 4

12

以下是一些有用的 GC 标志:

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

-XX:+PrintTenuringDistribution 应该给你你正在寻找的东西。

于 2013-09-25T18:36:48.413 回答
6

一个简单的解决方案是使用jstat,这显示了所有代中所有不同内存区域(伊甸园、幸存者空间)的占用情况。

使用例如 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) 提升到 old 空间 (O),导致 old 空间利用率从 9.49% 提高到 9.51%。在收集之前,幸存者空间的利用率为 12.44%,但在此收集之后,它的利用率仅为 7.74%。

更重量级的选项是分析器,例如带有 GC 监控的 JVisualVM,或带有 Java 7u40 的新 Java Mission Control。

此外,请考虑以下 GC 选项:-XX:+PrintTenuringDistribution, -XX:MaxTenuringThreshold.

于 2013-09-25T18:36:06.487 回答
6

Oracle 的 JDK 现在是标准的,jvisualvm它是一个免费的分析器。它会告诉你是什么消耗了内存、cpu、线程、网络时间、数据库访问等等。是的,它甚至还显示了 GC 时间和一堆关于 GC 的其他好处。

最好的部分,它是免费的!(如果您有 Oracle JDK,它可能已经安装在您的系统上)

http://www.youtube.com/watch?v=dUQqmnmCBbg

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html

于 2013-09-25T18:38:06.637 回答
1

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

于 2013-09-25T18:28:49.097 回答