如何记录和绘制Java应用程序的对象生存期



我们希望调整Java应用程序的内存生成池大小。为了做到这一点,我们需要首先了解堆是如何使用的。本质上,我们需要知道JVM堆中每个对象的数量、大小和生存期。在我们收集了这些数据后,我们应该能够为我们的年轻一代和终身制人才库找到更合适的规模。

我们的调优工作基于Sun/Oracle的"tuning Garbage Collection with the 5.0 JVM"白皮书中的信息。在第3节中(http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.%20Generations%7Coutline)他们讨论了生成大小,并在对象生存期图上展示了一个示例。这几乎是我们为应用程序所要达到的目标。

到目前为止,我们已经能够在内存中记录给定类的实例数量及其各自的大小。然而,我无法找到提取平均实例寿命的方法。现在我们正在研究jProfiler,但到目前为止还没有成功。

有人成功地绘制了Java应用程序的平均对象寿命图吗?

要调整GC,通常不需要每个对象的生存期,而是需要对池进行良好的实时概述。我通常做的第一件事是使用visualgc查看各种池,visualgc是jvm stat的一部分(http://java.sun.com/performance/jvmstat/)。然后我继续检查潜在的内存泄漏。这是迄今为止我遇到的最好的方式。

A。在jconsole中,你可以看到你是否总是过早地涌入旧一代(这意味着埃登太大了,即使在gc之后也无法容纳幸存者)。如果是这种情况,请检查你的年轻体型和幸存者比例,并尝试调整它们,使其不会溢出。

B。此外,在"正常"操作期间,最好在visualgc中查看幸存者世代的直方图,并确保世代在变老之前是空的。

如果它们确实以这种方式溢出,您可能会发生内存泄漏。然后我会用jconsole转储内存,并用MAT查看它(http://www.eclipse.org/mat/):

  1. 启动jconsole.exe并在HotSpotDiagnostic MBean上调用操作dumpHeap()(确保文件名以.hprof结尾)
  2. 打开MAP中的转储,看看你是否识别出任何类型的对象占用了比你预期的更多的空间

祝你好运。

相关内容

最新更新