在ImageJ / Fiji中自动释放未使用的内存

时间:2014-04-07 12:11:11

标签: imagej

我在Windows上使用Fiji / ImageJ并遇到以下问题:当我关闭文件时,不会释放为该文件分配的内存。 ImageJ保留分配的内存,并在打开其他文件时重用它。

所以这不是严格意义上的内存泄漏,但仍然非常烦人,尤其是在处理大文件时。是否有手动或(最好)自动方式在图像关闭后触发垃圾收集?

编辑:

示例:我使用大文件和Windows任务管理器来检查内存分配。

  1. 干净启动:ImageJ中12123MB为9278K,任务管理器中使用3.56GB / 16GB。
  2. 打开大型原始文件:任务管理器中的5928MB 12123MB,9.41 / 16GB
  3. 关闭大文件:12253MB的9253K,任务管理器中的9.43 / 16GB GB。 Fiji-win64.exe仍在任务管理器中使用6419188K内存。
  4. 关闭斐济:任务管理器中3.28 GB / 16GB。
  5. 我的问题是我通常会用一些文件和窗口打开斐济。然后我打开一些大文件并最终关闭它们,但ImageJ仍保留我的记忆。然后我开始执行一个内存饥饿的工作,当内存开始交换时,我很快耗尽了内存,整个系统都挂了。

3 个答案:

答案 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在导入大堆栈,重复几次,关闭它并运行垃圾收集器几次时的内存使用情况图:

ImageJ memory usage

请参阅此usefull article,了解gcs在返回内存方面的行为方式。

答案 1 :(得分:2)

在许多情况下,Java 从不将内存释放回系统,因此Windows任务管理器将始终报告Java进程使用的不断增长的RAM,直到JVM关闭。也就是说,有些文章表明,可以导致Java在某些条件下向操作系统返回空闲内存;见:

答案 2 :(得分:1)

在ImageJ / Fiji中,您可以通过Edit > Options > Memory & Threads...更改分配给Java的内存量。您还可以通过单击状态栏 手动触发垃圾收集器。

ImageJ mailing list上已多次讨论过该问题,例如here