java - MAT 空间与 TaskManager 空间

标签 java heap-memory mat

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

我的程序应该分析日志文件,日志文件非常大。它们的大小约为 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/

相关文章:

java - 增加 2gig+ XML 文件的 JAVA 堆空间

c++ - 如何获取 OpenCV getGaussianKernel 返回的 Mat 的实际核值?

java - java中的内存不足错误

java - 如何为应用程序上的用户制作一次性 "I agree" Activity 屏幕?

javascript - 如何在 Selenium WebDriver 中使用 JavascriptExecuter 设置属性值

java - 如何指定可执行 Spring Boot Jar 中存在的 WireMock 映射和文件的路径?

Android native 堆检查 DDMS

c++ - 从C++ OpenCV中的findNonZero函数仅复制Mat的行索引

c++ - 如何将 mat 转换为 array2d<rgb_pixel>?

java - 对数字字符串的 ArrayList 进行排序