0

在网上搜索了一段时间后,我决定向您寻求帮助以解决我的问题。

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

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

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

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

我不想保存使用 FileChannel 读取的数据,我只想处理它。之后我将关闭频道 - 我以为所有数据都会被删除?

我希望你们能帮助我了解 MAT 中显示的已用空间和 TaskManager 中显示的已用空间之间的区别。

4

1 回答 1

1

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

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

最后一种情况可能是最重要的一种。根据计算机上有多少物理内存,JVM 将为它的 heap 设置一个默认的最大大小。为了提高性能,它将继续使用最多该数量的内存,而垃圾收集活动最少。这意味着不再引用的对象将保留在内存中,而不是立即被垃圾回收,从而增加了使用的内存总量。

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

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

于 2013-02-20T09:09:47.243 回答