0

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

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

谢谢你的帮助。

4

2 回答 2

1

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

于 2012-01-10T12:44:24.820 回答
0

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

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

于 2010-05-11T16:37:53.637 回答