Java MAT空间与TaskManager空间

Java MAT空间与TaskManager空间,java,heap,mat,Java,Heap,Mat,在网上搜索了一段时间后,我决定请你帮我解决这个问题 我的程序应该分析日志文件,它们非常大。它们的容量约为100mb到2gb。我想使用像FileChannel这样的NIO类来读取文件 我不想将文件保存在内存中,但我想立即处理这些行。代码是有效的 现在我的问题是:我分析了EclipseMat插件的内存使用情况,它说大约保存了18mb的数据(这很合适)。但是Windows中的TaskManager表示JVM使用了大约180mb的内存 你能告诉我这是为什么吗 我不想用FileChannel保存读取的数据

在网上搜索了一段时间后,我决定请你帮我解决这个问题

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

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

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

你能告诉我这是为什么吗

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


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

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

  • 它自己的代码
  • 非对象数据(类、编译字节码e.t.c.)
  • 当前未使用但已分配的堆空间
最后一个案例可能是最主要的案例。取决于计算机上有多少物理内存,JVM将运行。为了提高性能,它将以最小的垃圾收集活动继续使用最多该数量的内存。这意味着不再被引用的对象将保留在内存中,而不是立即被垃圾收集,从而增加了使用的内存总量

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


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

感谢您的快速回答。因此,TaskManager中使用了多少空间并不重要(以防我有足够的内存)?如果程序即将耗尽内存,JVM将运行垃圾收集器?好的,谢谢。我尝试使用-Xmx50m参数启动应用程序,TaskMgr中的空间减少了。这回答了我的问题!