在网上搜索了一段时间后,我决定向你寻求帮助来解决我的问题。
我的程序应该分析日志文件,它真的很大。它们大约是100mb到2 2gb。我想使用像FileChannel这样的NIO类来读取文件。
我不想将文件保存在内存中,但我想立即处理这些行。代码起作用了。
现在我的问题是:我用Eclipse MAT插件分析了内存使用情况,结果显示节省了大约18mb的数据(这是合适的)。但Windows中的TaskManager表示,JVM使用了大约180mb。
你能告诉我为什么会这样吗?
我不想用FileChannel保存读取的数据,我只想处理它。之后我会关闭频道--我以为所有的数据都会被删除?
我希望你们能帮助我区分已用空间显示在MAT和已用空间显示在TaskManager之间的区别。
发布于 2013-02-20 17:09:47
MAT将只显示程序主动引用的对象。JVM使用的内存比这多:
类自己的code
最后一个案例可能是最大的案例。根据计算机上有多少物理内存,JVM将被set a default maximum size for its heap。为了提高性能,它将以最少的垃圾收集活动来使用高达该数量的内存。这意味着不再被引用的对象将保留在内存中,而不是立即被垃圾回收,从而增加了使用的内存总量。
因此,JVM通常不会释放它作为堆的一部分分配给系统的任何内存。这将在操作系统监控实用程序中显示为过多的已用内存。
具有高对象分配/释放比率的应用程序将会更糟--我有一个应用程序,它使用1.8 be的内存,而实际需要的内存少于100MB。但是,将最大堆大小减少到120MB,会将执行时间增加几乎一个数量级。
https://stackoverflow.com/questions/14975860
复制相似问题