在网上搜索了一段时间后,我决定请求你帮忙解决我的问题。
我的程序应该分析非常大的日志文件。它们大约100mb到2gb。我想使用像FileChannel这样的NIO类来读取文件。
我不想将文件保存在内存中,但我想立即处理这些行。代码有效。
现在我的问题:我用Eclipse MAT插件分析了内存使用情况,并说它保存了大约18mb的数据(适合)。但Windows中的TaskManager表示JVM使用了大约180mb。
你能告诉我为什么这是吗?
我不想用FileChannel保存数据读取,我只是想处理它。我之后关闭了频道 - 我认为每个数据都会被删除吗?
我希望你们可以帮助我在MAT中显示已用空间之间的差异,并在TaskManager中显示使用的空间。
答案 0 :(得分:1)
MAT只会显示程序主动引用的对象。 JVM使用的内存多于:
最后一个案例可能是最重要的案例。根据计算机上的物理内存量,JVM将set a default maximum size for its heap。为了提高性能,它将通过最小垃圾收集活动继续使用最多的内存量。这意味着不再引用的对象将保留在内存中,而不是立即进行垃圾回收,从而增加了所使用的内存总量。
因此,JVM通常不释放它作为其堆的一部分分配回系统的任何内存。这将显示为OS监视实用程序中过多的已用内存。
具有高对象分配/解除分配率的应用程序将更糟糕 - 我有一个使用1.8GB内存的应用程序,而实际上需要不到100MB。但是,将最大堆大小减小到120 MB会将执行时间增加几乎一个数量级。