解释VisualVM分析会话的结果

时间:2010-05-11 16:25:58

标签: java profiling heap visualvm

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

  1. 如果我使用System.in.read()在开头暂停应用程序,则进程分配的内存会持续增长。那是为什么?
  2. 当应用程序运行时,VisualVM监视器中使用的堆空间总是大约为80mb。但是,在分析内存使用情况时,我总共得到大约10mb。任何人都能解释这种差异吗?
  3. 感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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