如何在使用触发器的JProfiler脱机模式下进行性能分析时自动获取保留的内存

时间:2014-03-26 15:06:04

标签: java jprofiler

我有一个大型,内存密集型,基于Java的Web应用程序,它具有许多不同的功能,这需要我很长时间来分析。我没有用不同的测试数据手动分析整个应用程序中的每个功能,而是认为更有效的方法是在离线模式下运行JProfiler并设置触发器来为我捕获数据。测试团队将正常使用该软件,随着时间的推移,JProfiler将捕获内存密集的热点,我们可以使用它们来提高我们的应用程序效率。

但是,如果我设置一个触发器来获取堆的快照,那么它只会给我浅内存 - 每个类的内存统计信息,不包括任何引用的对象包含的内容。但是知道String或char []的实例消耗了多少内存对我没用。我真正想知道的是我的类的保留内存 - 每个实例的浅层大小的内存加上它包含的所有类。换句话说,对于我的软件中的每个类,我想知道当它的所有实例都被垃圾收集时将释放多少内存。

所以基本上我有几个问题:

1)JProfiler可以通过触发快照而不记录内存来计算保留的内存吗?看来你必须实际执行“记录记忆”动作来计算保留的记忆,但我可能会遗漏一些东西。

2)如果我必须记录内存来计算保留的内存信息,那么我的下一个想法就是设置一个触发器来记录整个内存达到一定阈值时的信息。但是这又引出了两个问题:如何设置触发器来停止录制并拍摄快照?因为我们已经超过触发器中指定的阈值,所以录音是否会错过最重要的内存信息?

上面的第2个让我相信配置文件的最佳方法是触发快照而不记录和计算保留的内存 - 只有浅层内存。但是,如果浅存储器显示我的大部分内存使用都在char [](它确实如此),那么如何从中获取有用的信息呢?这如何帮助我跟踪应用程序的内存密集区域?

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

  

1)JProfiler可以通过触发来计算保留的内存   没有记录内存的快照?看来你必须这样做   实际上执行"记录内存"计算保留的行动   记忆,但我可能会遗漏一些东西。

你实际上需要"触发堆转储"动作,然后堆walker将可用。 "开始录制"动作与"分配数据"已启用实时视图的记录数据(只有浅尺寸可用),但它也为"分配"提供了数据。堆walker的视图,因此您可以分析对象的分配位置。

  

并且不会记录错过最重要的记忆信息   既然我们已超过触发器中指定的阈值?

堆转储在触发触发器时捕获整个堆,因此您应该看到所有感兴趣的对象。