我正在尝试分析/分析核心 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
. - 我需要更多信息。我真的不确定如何正确和完整地解释这些细节。
请看一下附件。请提供输入。