【发布时间】:2014-03-26 15:06:04
【问题描述】:
我有一个大型、内存密集型、基于 Java 的 Web 应用程序,它具有许多不同的功能,这将花费我很长时间来分析。与其使用不同的测试数据手动分析整个应用程序中的每个功能,我认为更省时的方法是在离线模式下运行 JProfiler 并设置触发器来为我捕获数据。测试团队将正常使用该软件,并且随着时间的推移,JProfiler 将捕获内存密集型热点,我们可以使用这些热点来提高我们的应用程序的效率。
但是,如果我设置一个触发器来只获取堆的快照,那么它只会给我 浅内存 - 每个类的内存统计信息,不包括它的任何引用对象包含。但是知道 String 或 char[] 的实例消耗了多少内存对我没有用处。我真正想知道的是我的类的保留内存——每个实例的浅层大小加上它包含的所有类的内存。换句话说,对于我软件中的每个类,我想知道当它的所有实例都被垃圾回收时将释放多少内存。
所以基本上我有几个问题:
1) JProfiler 可以通过只触发快照而不记录内存来计算保留内存吗?看来您必须实际执行“记录内存”操作才能计算保留的内存,但我可能会遗漏一些东西。
2)如果我必须记录内存来计算保留的内存信息,那么我接下来的想法是设置一个触发器,在整体内存达到某个阈值时记录信息。但这又引发了两个问题:我将如何设置触发器来停止录制并拍摄快照?由于我们已经超过了触发器中指定的阈值,因此记录不会错过最重要的内存信息吗?
上面的第 2 点让我相信,最好的分析方法是触发快照,而不需要任何记录和计算保留的内存——只有浅内存。但是,如果浅层内存显示我的大部分内存使用都在 char[] 中(确实如此),我如何从中获取有用的信息?这如何帮助我跟踪应用程序的内存密集型区域?
非常感谢任何帮助
【问题讨论】: