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

Posted

技术标签:

【中文标题】如何在 JProfiler 离线模式下使用触发器进行分析时自动获取保留的内存【英文标题】:How to automatically get retained memory while profiling in JProfiler offline mode with triggers 【发布时间】:2014-03-26 15:06:04 【问题描述】:

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

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

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

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

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

上面的第 2 点让我相信,最好的分析方法是触发快照,而不需要任何记录和计算保留的内存——只有浅内存。但是,如果浅层内存显示我的大部分内存使用都在 char[] 中(确实如此),我如何从中获取有用的信息?这如何帮助我跟踪应用程序的内存密集型区域?

非常感谢任何帮助

【问题讨论】:

【参考方案1】:

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

您实际上需要“触发堆转储”操作,然后堆遍历器将可用。启用“分配数据”的“开始记录”操作记录实时视图的数据(只有浅大小可用),但它也为堆遍历器的“分配”视图提供数据,因此您可以分析对象的位置已分配。

而且录音不会错过最重要的记忆信息 因为我们已经超过了触发器中指定的阈值?

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

【讨论】:

以上是关于如何在 JProfiler 离线模式下使用触发器进行分析时自动获取保留的内存的主要内容,如果未能解决你的问题,请参考以下文章

JProfiler 可以在没有 GUI 的情况下运行吗?

JVM_使用JProfiler进行内存分析01(17)

如何使用 jprofiler9 分析 Java 服务器应用程序?

如何在离线模式下使用 Cordova Geolocation 插件

如何在离线模式下使用 WorldWind Android 应用程序

使用 jpexport 时出错(导出 jprofiler .jps 文件)