gpt4 book ai didi

java - MAT 空间与 TaskManager 空间

转载 作者:行者123 更新时间:2023-12-01 14:50:06 25 4
gpt4 key购买 nike

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

我的程序应该分析日志文件,日志文件非常大。它们的大小约为 100mb 至 2gb。我想使用 NIO 类(如 FileChannel)读取文件。

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

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

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

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

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

最佳答案

MAT 将仅显示程序主动引用的对象。 JVM 使用的内存比这个多:

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

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

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

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

关于java - MAT 空间与 TaskManager 空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com