我们想要调优Java应用程序的内存生成池大小。为此,我们首先需要了解堆是如何使用的。本质上,我们需要知道JVM堆中每个对象的数量、大小和生命周期。在我们收集了这些数据之后,我们应该能够找到更适合我们的年轻和终身代池的大小。
我们的调优工作基于Sun/Oracle的"Tuning垃圾收集with the 5.0 JVM“白皮书中的信息。在第3节(http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.%20Generations%7Coutline)中,他们讨论了生成大小,并在对象生存期图上显示了一个示例。这几乎就是我们试图为我们的应用程序实现的。
到目前为止,我们已经能够在内存中记录给定类的实例数量及其各自的大小。然而,我无法找到一种方法来提取平均实例寿命。现在我们正在研究jProfiler,但到目前为止还没有成功。
有没有人成功地绘制了Java应用程序的平均对象生命周期图?
发布于 2011-07-17 18:22:53
要调优GC,您通常不需要每个对象的生命周期,但需要一个很好的池的实时概览。我通常做的第一件事是使用visualgc查看各种池,这是jvmstat (http://java.sun.com/performance/jvmstat/)的一部分。然后,我继续检查潜在的内存泄漏。这是迄今为止我遇到的最好的方式。
答:在jconsole中,你可以看到你是否不断地过早地溢出到旧的gen中(这意味着即使在gc之后,伊甸园也太大了,放不下幸存者)。如果是这种情况,请检查您的幼体大小和存活比率,并尝试调整它们,使其不会溢出。
此外,在“正常”操作期间,最好在visualgc中查看幸存者世代的直方图,并确保世代在变得太老之前是空的。
如果它们确实以这种方式溢出,您可能会有内存泄漏。然后我会使用jconsole转储内存,并使用MAT (http://www.eclipse.org/mat/)查看它:
祝好运。
https://stackoverflow.com/questions/6293117
复制相似问题