3

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

我们的调优工作基于 Sun/Oracle 的“使用 5.0 JVM 调优垃圾收集”白皮书中的信息。在第 3 节(http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html#1.1.%20Generations%7Coutline)中,他们讨论了生成大小并在对象生命周期图上展示了一个示例。几乎是我们试​​图为我们的应用程序实现的目标。

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

有没有人成功地绘制了 Java 应用程序的平均对象生命周期?

4

1 回答 1

2

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

A. 在 jconsole 中,您可以查看您是否经常过早地溢出到旧代(这意味着即使在 gc 之后,伊甸园太大而无法容纳幸存者)。如果是这种情况,请检查您的年轻大小和幸存者比率,并尝试调整它们以使其不会溢出。

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

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

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

祝你好运。

于 2011-07-17T10:22:52.593 回答