首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何记录和绘制Java应用程序的对象生存期?

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

Stack Overflow用户
提问于 2011-06-09 20:58:27
回答 1查看 662关注 0票数 3

我们想要调优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应用程序的平均对象生命周期图?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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/)查看它:

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

祝好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6293117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档