MAT空间与TaskManager空间

时间:2013-02-20 09:03:08

标签: java heap mat

在网上搜索了一段时间后,我决定请求你帮忙解决我的问题。

我的程序应该分析非常大的日志文件。它们大约100mb到2gb。我想使用像FileChannel这样的NIO类来读取文件。

我不想将文件保存在内存中,但我想立即处理这些行。代码有效。

现在我的问题:我用Eclipse MAT插件分析了内存使用情况,并说它保存了大约18mb的数据(适合)。但Windows中的TaskManager表示JVM使用了大约180mb。

你能告诉我为什么这是吗?

我不想用FileChannel保存数据读取,我只是想处理它。我之后关闭了频道 - 我认为每个数据都会被删除吗?

我希望你们可以帮助我在MAT中显示已用空间之间的差异,并在TaskManager中显示使用的空间。

1 个答案:

答案 0 :(得分:1)

MAT只会显示程序主动引用的对象。 JVM使用的内存多于:

  • 自己的代码
  • 非对象数据(类,编译的字节码e.t.c。)
  • 当前未使用但已分配的堆空间。

最后一个案例可能是最重要的案例。根据计算机上的物理内存量,JVM将set a default maximum size for its heap。为了提高性能,它将通过最小垃圾收集活动继续使用最多的内存量。这意味着不再引用的对象将保留在内存中,而不是立即进行垃圾回收,从而增加了所使用的内存总量。

因此,JVM通常释放它作为其堆的一部分分配回系统的任何内存。这将显示为OS监视实用程序中过多的已用内存。

具有高对象分配/解除分配率的应用程序将更糟糕 - 我有一个使用1.8GB内存的应用程序,而实际上需要不到100MB。但是,将最大堆大小减小到120 MB会将执行时间增加几乎一个数量级。