我在Windows上使用斐济/ImageJ,遇到了以下问题:当我关闭一个文件时,分配给该文件的内存不会释放。ImageJ保存分配的内存,并在打开其他文件时重用它。
因此,这并不是严格意义上的内存泄漏,但仍然非常恼人,特别是在处理大型文件时。在图像关闭后是否有手动或(最好)自动方式触发垃圾收集?
编辑:
示例:我使用一个大型文件和windows任务管理器来检查内存分配。
我的问题是,我通常总是打开斐济的几个文件和窗口。然后我打开一些大文件并最终关闭它们,但是ImageJ仍然保留着我的内存。然后我开始执行一个内存不足的作业,当窗口开始交换东西时,我的内存很快就用完了,整个系统就会停止工作。
发布于 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的行为,请参见此有用的文章。
发布于 2014-04-07 20:57:55
在许多情况下,Java从不将内存释放回系统,因此将始终报告Java进程使用的RAM数量不断增加,直到JVM关闭为止。尽管如此,一些文章建议您可以让Java在某些条件下将空闲内存还给操作系统;请参见:
发布于 2014-04-07 13:46:30
在ImageJ/斐济中,您可以通过http://imagej.nih.gov/ij/docs/guide/146-27.html#sub%3aMemory-&-Threads...更改分配给Java的内存数量。您还可以通过单击状态栏手动触发垃圾收集器。
这个问题在ImageJ邮件列表上也曾多次讨论过,例如这里。
https://stackoverflow.com/questions/22912063
复制相似问题