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

标签 imagej

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

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

编辑:

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

  1. 干净启动:ImageJ 中使用了 9278K(共 12123MB),任务管理器中使用了 3.56GB/16GB。
  2. 在任务管理器中打开大型原始文件:12123MB 中的 5928MB、9.41/16GB
  3. 在任务管理器中关闭大文件:9253K/12123MB、9.43/16GB GB。 Fiji-win64.exe在任务管理器中仍然使用6419188K内存。
  4. 关闭斐济:任务管理器中的 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 在导入大堆栈、复制几次、关闭它并运行垃圾收集器几次时的内存使用情况的图表:

ImageJ memory usage

查看此usefull article关于不同的 gc 在返回内存方面的行为。

关于imagej - 自动释放ImageJ/Fiji中未使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912063/

相关文章:

java - putPixel 与 ImageJ

java - fork 点和山脊终点

java - 我的 ImageJ 插件代码有什么问题?

java - ImageJ - 即使遇到错误如何继续批处理

java - 使用 ImageJ 调整和裁剪图像

javascript - ImageJ Javascript 脚本中的文件打开对话框

java - 使用 saveAs 时让 ImageJ 自动覆盖

java - ImageJ - 在不保存文件的情况下转换图像格式

java - 调用 ImageJ 工具栏