首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动释放ImageJ /斐济中的未使用内存

自动释放ImageJ /斐济中的未使用内存
EN

Stack Overflow用户
提问于 2014-04-07 12:11:10
回答 3查看 11.4K关注 0票数 3

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

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

编辑:

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

  1. 干净启动:在ImageJ中使用12123 in的9278 K,在任务管理器中使用3.56GB/16 in。
  2. 打开大的原始文件:5928 of的12123 of,9.41/16 of的任务管理器
  3. 关闭大文件:12123 GB的9253 K,任务管理器中的9.43/16 GB。斐济-win64.exe仍然在任务管理器中使用6419188K内存。
  4. 关闭斐济: 3.28 GB /16 GB的任务管理器。

我的问题是,我通常总是打开斐济的几个文件和窗口。然后我打开一些大文件并最终关闭它们,但是ImageJ仍然保留着我的内存。然后我开始执行一个内存不足的作业,当窗口开始交换东西时,我的内存很快就用完了,整个系统就会停止工作。

EN

回答 3

Stack Overflow用户

发布于 2014-04-08 12:59:50

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

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

对于斐济,运行斐济启动程序,将-XX:+UseParNewGC添加到命令行参数,即ImageJ-win64.exe -XX:+UseParNewGC --

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

有关返回内存的不同gcs的行为,请参见此有用的文章

票数 6
EN

Stack Overflow用户

发布于 2014-04-07 20:57:55

在许多情况下,Java从不将内存释放回系统,因此将始终报告Java进程使用的RAM数量不断增加,直到JVM关闭为止。尽管如此,一些文章建议您可以让Java在某些条件下将空闲内存还给操作系统;请参见:

票数 2
EN

Stack Overflow用户

发布于 2014-04-07 13:46:30

在ImageJ/斐济中,您可以通过http://imagej.nih.gov/ij/docs/guide/146-27.html#sub%3aMemory-&-Threads...更改分配给Java的内存数量。您还可以通过单击状态栏手动触发垃圾收集器。

这个问题在ImageJ邮件列表上也曾多次讨论过,例如这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22912063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档