0

我正在尝试分析/分析核心 JAVA 应用程序。

我将 JConsole 与Eclipse MAT一起使用。

我在 Perm-Gen 图表中观察到以下内容(在 Windows XP 机器上以 1 小时的持续时间记录的数据):

代码缓存:

  • 录制开始时:7MB
  • 1 小时后:10.5 MB
  • 图形看起来像:斜线略微上升,间隔增加。

内存池 Perm-Gen(Shared-rw):

  • 录制开始时:7MB
  • 1 小时后:7 MB
  • 图形看起来像:平行于 X 轴。

内存池 Perm-Gen(Shared-r0):

  • 录制开始时:5.5MB
  • 1 小时后:5.5MB
  • 图形看起来像:平行于 X 轴。

内存池:

  • 录制开始时:21MB
  • 1 小时后:22.5 MB
  • 图表看起来像:斜线略微上升/下降间隔增加。

我的问题是,

  • 对于上述每个类别,可以推断出 Perm-Gen 空间的这种行为是什么?
  • 寻找上述每个类别的理想行为应该是什么?

这里的理想行为是指一种状态,它代表:

  • 应用程序执行得最好。
  • 应用程序没有任何与内存相关的问题。
  • 无需改进代码即可提高资源利用率。

以上问题也适用于堆空间分析。

以下是补充说明:

  • 确实应该在与生产环境相同的环境中进行分析。但如果我能理解这里的真正目标是什么,那真的很有帮助。截至目前,我正在尝试学习相同的内容。然后在未来,我会尝试在生产中做到这一点。

  • 此外,我正在尝试比较两个代码库(一个重构的和一个旧的)。我想知道通过重构(作为定量数据)获得的好处的程度。我认为如果我在同一平台上记录结果,比较将成立(无论 Production 或 Development )。

更新 1:

  • 我进一步连续运行了 8 个多小时的应用程序。
  • 我使用 GCViewer:1.31 来获取 GC 信息。
  • 我附上了从 GCViewer 收集的数据。
  • 我观察到每 30 秒就会发生一次 FULL GC 事件。由此得出结论,许多对象都是log-living.
  • 我需要更多信息。我真的不确定如何正确和完整地解释这些细节。

请看一下附件。请提供输入。

在此处输入图像描述

4

1 回答 1

1

几个建议:

1) 抛弃 JConsole。VisualVM 包含在 JDK 中,并且在各个方面都非常出色(并且包括桥接模式,因此您甚至可以使用旧插件,如果这就是让您继续使用 JConsole 的全部)。

2) 开启 GC 登录。你至少需要这些标志:

-Xloggc:(用于更全面的 GC 日志记录)-XX:+PrintGCDetails(用于更详细的输出)-XX:+PrintTenuringDistribution(显示 JVM 假定的任期阈值)

找一个工具来分析日志——你需要注意对象的工作集以及 PermGen,即使后者是你的主要关注点。GCViewer 是免费的,或者有商业工具(完全公开——我为 jClarity 工作,它为此目的生产 Censum 工具)。

3) 你需要跑超过 1 小时。许多应用程序在很长一段时间内都不稳定。

4)再次查看您的数字,这看起来并没有什么不寻常/问题。你为什么要调整这部分 JVM?系统的哪个方面表明这是一个严重的问题并且需要解决?你是如何确定这一点的,这个问题是如何表现出来的?

于 2013-08-07T15:19:50.670 回答