我在 Windows 上使用 Fiji/ImageJ 并遇到以下问题:当我关闭文件时,为该文件分配的内存未释放。 ImageJ 保留分配的内存,并在打开其他文件时重用它。
所以这并不是严格意义上的内存泄漏,但仍然非常烦人,尤其是在处理大文件时。是否有手动或(最好)自动方式在图像关闭后触发垃圾收集?
编辑:
示例:我使用大文件和 Windows 任务管理器来检查内存分配。
- 干净启动:ImageJ 中使用了 9278K(共 12123MB),任务管理器中使用了 3.56GB/16GB。
- 在任务管理器中打开大型原始文件:12123MB 中的 5928MB、9.41/16GB
- 在任务管理器中关闭大文件:9253K/12123MB、9.43/16GB GB。 Fiji-win64.exe在任务管理器中仍然使用6419188K内存。
- 关闭斐济:任务管理器中的 3.28 GB/16GB。
我的问题是,我通常总是让斐济保持开放状态,只保留一些文件和窗口。然后我打开一些大文件并最终关闭它们,但 ImageJ 仍然保留我的内存。然后我开始执行一项内存消耗很大的作业,很快就耗尽了内存,并且当 Windows 开始交换内容时整个系统挂起。
最佳答案
java是否将未使用的内存返回给操作系统取决于所使用的垃圾收集器。有些实现确实会返回它,而在某些实现中,堆只会不断增长。默认情况下使用哪种垃圾收集器在不同的 JRE 版本中有所不同,并且也取决于系统。
当 java 启动时,您可以通过命令行参数强制使用垃圾收集器。要将 ImageJ 使用的 gc 更改为返回未使用内存的 gc 之一,请编辑 ImageJ 安装目录中的 ImageJ.cfg
文件,并在第三行添加 -XX:+UseParNewGC
。
对于斐济,运行斐济启动器,并将 -XX:+UseParNewGC
添加到命令行参数,即 ImageJ-win64.exe -XX:+UseParNewGC --
在我的 64 位 java 8 系统上,这会导致内存被释放回操作系统。这是 ImageJ 在导入大堆栈、复制几次、关闭它并运行垃圾收集器几次时的内存使用情况的图表:
查看此usefull article关于不同的 gc 在返回内存方面的行为。
关于imagej - 自动释放ImageJ/Fiji中未使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912063/