我在Windows上使用Fiji / ImageJ并遇到以下问题:当我关闭文件时,不会释放为该文件分配的内存。 ImageJ保留分配的内存,并在打开其他文件时重用它。
所以这不是严格意义上的内存泄漏,但仍然非常烦人,尤其是在处理大文件时。是否有手动或(最好)自动方式在图像关闭后触发垃圾收集?
编辑:
示例:我使用大文件和Windows任务管理器来检查内存分配。
我的问题是我通常会用一些文件和窗口打开斐济。然后我打开一些大文件并最终关闭它们,但ImageJ仍保留我的记忆。然后我开始执行一个内存饥饿的工作,当内存开始交换时,我很快耗尽了内存,整个系统都挂了。
答案 0 :(得分:5)
java是否将未使用的内存返回给OS取决于使用的垃圾收集器。一些实现确实返回它,而在某些实现中,堆只会继续增长。默认情况下使用哪个垃圾收集器在各种JRE版本中有所不同,并且还取决于系统。
启动java时,可以强制命令行参数使用垃圾收集器。要将ImageJ的已用gc更改为返回未使用内存的gcs之一,请在ImageJ安装目录中编辑ImageJ.cfg
文件,然后在第三行添加-XX:+UseParNewGC
。
对斐济来说,运行斐济发射器并将-XX:+UseParNewGC
添加到命令行参数,即ImageJ-win64.exe -XX:+UseParNewGC --
在我的64位java 8系统上,这会导致内存被释放回操作系统。这是ImageJ在导入大堆栈,重复几次,关闭它并运行垃圾收集器几次时的内存使用情况图:
请参阅此usefull article,了解gcs在返回内存方面的行为方式。
答案 1 :(得分:2)
在许多情况下,Java 从不将内存释放回系统,因此Windows任务管理器将始终报告Java进程使用的不断增长的RAM,直到JVM关闭。也就是说,有些文章表明,可以导致Java在某些条件下向操作系统返回空闲内存;见:
答案 2 :(得分:1)
在ImageJ / Fiji中,您可以通过Edit > Options > Memory & Threads...更改分配给Java的内存量。您还可以通过单击状态栏 手动触发垃圾收集器。
ImageJ mailing list上已多次讨论过该问题,例如here