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

hth*_*hms 3 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.

我的问题是我通常会用一些文件和窗口打开斐济.然后我打开一些大文件并最终关闭它们,但ImageJ仍保留我的记忆.然后我开始执行一个内存饥饿的工作,我很快耗尽内存,当Windows开始交换东西时整个系统挂起.

Jos*_*vec 5

java是否将未使用的内存返回给OS取决于使用的垃圾收集器.一些实现确实返回它,而在某些实现中,堆只会继续增长.默认情况下使用哪个垃圾收集器在各种JRE版本中有所不同,并且还取决于系统.

启动java时,可以强制命令行参数使用垃圾收集器.要将ImageJ的已用gc更改为返回未使用内存的gcs之一,请ImageJ.cfg在ImageJ安装目录和第三行add中编辑文件-XX:+UseParNewGC.

对于斐济来说,运行斐济发射器并-XX:+UseParNewGC加入命令行参数,即ImageJ-win64.exe -XX:+UseParNewGC --

在我的64位Java 8系统上,这会导致内存被释放回操作系统.这是ImageJ在导入大堆栈,重复几次,关闭它并运行垃圾收集器几次时的内存使用情况图:

ImageJ内存使用情况

请参阅这篇有用的文章,了解不同gcs在返回内存方面的行为方式.