【发布时间】:2013-08-06 09:53:43
【问题描述】:
我正在尝试分析/分析核心 JAVA 应用程序。
我正在使用带有Eclipse MAT 的JConsole。
我在 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 空间的这种行为是什么?
- 查找上述每个类别的理想行为应该是什么?
这里的理想行为是指一种状态,它代表:
- 应用程序正在执行最好的。
- 应用程序没有任何与内存相关的问题。
- 无需改进代码即可即兴发挥资源利用率。
上述问题也适用于堆空间分析。
以下是补充说明:
确实应该在与生产环境相同的环境中进行分析。但如果我能理解这里的真正目标是什么,那真的很有帮助。截至目前,我正在尝试学习相同的内容。然后在未来,我会尝试在生产中做到这一点。
另外,我正在尝试比较两个代码库(一个重构的和一个旧的)。我想知道通过重构(作为定量数据)获得的好处的程度。我认为如果我在同一平台上记录结果,比较将成立(无论生产或开发)。
更新1:
- 我进一步连续运行了超过 8 个小时的应用程序。
- 我使用 GCViewer:1.31 来获取 GC 信息。
- 我附上了从 GCViewer 收集的数据。
- 我观察到每 30 秒发生一次 FULL GC 事件。由此得出结论,很多对象都是
log-living。 - 我需要更多信息。我真的不确定如何正确和完整地解释这些细节。
请看附件。请提供意见。
【问题讨论】:
-
这段代码你的生产环境是什么?如果答案不是“Windows XP”,那么您就是在浪费时间。
-
同意。确实应该在与生产环境相同的环境中进行分析。但如果我能理解这里的真正目标是什么,那真的很有帮助。截至目前,我正在尝试学习相同的内容。然后在未来,我会尝试在生产中做到这一点。
-
我想补充一点,我正在尝试比较两个代码库(一个重构的和一个旧的)。我想知道通过分解为定量数据所获得的好处的程度。我认为如果我在同一个平台上记录结果,比较将成立(无论 Production 或 Development )。
-
分析也应该在开发方面进行。记忆行为受设置和平台可能的影响,这可能会产生灾难性的影响,这是真的。但是本地分析可能已经显示了哪些对象的寿命很长,更不用说速度瓶颈了。
-
还有几件事:
标签: java eclipse performance memory permgen