解释 VisualVM 分析会话的结果

Posted

技术标签:

【中文标题】解释 VisualVM 分析会话的结果【英文标题】:Interpreting the results of a VisualVM profiling session 【发布时间】:2010-05-11 16:25:58 【问题描述】:

我有一个应用程序,它在 Mac OS X 上使用 this jdbc-driver 将一些数据(80k 元组中大约 15mb)写入 SQLite 数据库。这是使用事务完成的,其中最大的一个包含大约 45k 插入桌子。在分析应用程序时,有几件事情看起来很奇怪:

    如果我在开始时使用System.in.read() 暂停应用程序,进程分配的内存会一直缓慢增长。这是为什么呢? 当应用程序运行时,在 VisualVM 监视器中使用的堆空间总是在 80mb 左右。但是,在分析内存使用情况时,我总共得到大约 10mb。谁能解释一下这个区别?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

内存使用中的拼图模式是由于通过 RMI 传输的分析结果。这确实是非常令人困惑和烦人的,以过滤您的程序的实际内存分配。请参阅VisualVM profiling is polluting results 了解如何过滤这些:-)

【讨论】:

我想你的意思是"sawtooth," 不是"jigsaw." 请在***.com/questions/20112666/…回答我的问题 不,锯齿模式是分配内存,直到达到触发另一个 GC 周期的阈值。您链接到的问题观察到应用程序使内存使用量达到峰值,因为它向 VisualVM 发送大量数据,这将使峰值变得更陡峭和更快,但是即使您监视未发送大量数据的应用程序也会出现锯齿模式到 VisualVM。【参考方案2】:

关于您的第一个问题,您在多长时间内观察到缓慢增长。当 Java 进程中的内存使用处于静止状态时,您通常会看到锯齿模式的发展。您是否看到任何 GC 发生在同一时间片中?如果不是,那就有更多的证据支持这个想法。

对于第二个问题,如果没有更多信息,真的很难确定。您通常会期望应用程序在打开分析时会有所不同,因为时间窗口发生变化,应用程序必须花时间报告数据执行其正常工作等。这可能是在打开分析时开,更多的内存分配发生,因为您的代码现在被检测,这会触发 GC 降低堆使用率。关闭分析后尝试在您的应用程序中执行 System.gc() 并告诉我们您的堆使用情况报告。

【讨论】:

无论有没有分析,应用程序总是会遇到内存不足的错误,所以我猜高堆使用率是正确的。 好的,所以下一步是进行堆转储并解释结果。您可以使用 VisualVM 或 JConsole 执行此操作。使用 Eclipse MAT 或 HPjmeter 打开生成的堆转储文件,查看内存中保存的内容。 请在***.com/questions/20112666/…回答我的问题

以上是关于解释 VisualVM 分析会话的结果的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机原理垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )

Visual VM:如何解释 Self Time 与 Self Time (CPU)

VisualVM 分析正在污染结果

Java Visual VM 倾斜 CPU

visualvm 插件 visual gc 使用介绍

Java VisualVM添加Visual GC插件