我在Netbeans中有一个项目,我正在分析(使用Java 7)。我正在寻找的是,在垃圾收集时,来自伊甸园空间的内存将进入幸存者空间,以及是否有任何内存溢出到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]
任何人都知道找出我要找的信息的方法吗?
谢谢!
答案 0 :(得分:10)
以下是一些有用的GC标记:
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintClassHistogram
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+ PrintTenuringDistribution应该可以为您提供所需内容。
答案 1 :(得分: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
答案 2 :(得分:5)
简单解决方案是使用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秒,并将物体从伊甸园空间(E)提升到旧空间(O),从而使旧空间利用率从9.49%增加到9.51%。在收集之前,幸存者空间利用率为12.44%,但在此收集后,其利用率仅为7.74%。
更多重量级选项是分析器,例如带有GC监控的JVisualVM,或带有Java 7u40的新Java Mission Control。
另外,请考虑以下GC选项:-XX:+PrintTenuringDistribution
,-XX:MaxTenuringThreshold
。
答案 3 :(得分:1)
使用-XX:+PrintGCDetails
标志可以打印更多详细信息。