【问题标题】:Suspicion of a java memory leak in the decompression of MHA volumes in MatlabMatlab解压MHA卷时出现java内存泄漏的嫌疑
【发布时间】:2013-09-13 13:13:46
【问题描述】:

我有许多存储为.mha 文件的卷,我通常使用名为mha_read_volume 的函数在Matlab 中打开这些文件,您可以在Matlab Central 上找到该函数。我的问题是这个函数随机抛出一个内存不足的错误消息,与使用一些java库解压缩这些图像有关。

罪魁祸首似乎在这里:

function M = zlib_decompress(Z,DataType)
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z);
b=java.util.zip.InflaterInputStream(a);
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
M=typecast(c.toByteArray,DataType);

我怀疑内存泄漏,但我不知道如何处理此代码来解决问题。

这是错误信息:

??? Java exception occurred:
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.io.ByteArrayOutputStream.toByteArray(Unknown Source)

Error in ==> mha_read_volume>zlib_decompress at 87
M=typecast(c.toByteArray,DataType);

Error in ==> mha_read_volume at 74
        V = zlib_decompress(Z,DataType);

【问题讨论】:

  • 您使用的平台是否没有足够的内存?
  • 这个问题真的很随机​​:有时我启动Matlab,它不会打开任何文件,有时它可以打开50个文件。每次我打开一个卷时,我都会将它分配给同一个变量,因此所需的内存大致保持不变,并且应该远低于我的系统规格。
  • 嗯......我不会有太多帮助;祝你好运!
  • 我很不幸:1)Matlab 网站正在维护中,所以我必须链接到 Google 缓存,并且 2)我无法重现该问题,这很烦人,因为它通常经常发生.

标签: java matlab image-processing out-of-memory inflate


【解决方案1】:

当作业结束时关闭流以释放内存很重要。即使出现异常,也要使用try/catch to ensure resources are freed

因此您应该调用c.close b.close a.close 以便能够循环处理大量文件。

备注(与您的情况无关):如果java.util.zip.InflaterInputStream 流未关闭,Java 8 会泄漏本机内存。原因是通过对 zlib 的 Hotspot 调用替换了纯 Java 实现。

【讨论】:

    【解决方案2】:

    如果您读取的文件很大(它们的未压缩版本),这不一定是内存泄漏。 您可以在 matlab 首选项中调整 matlab 使用的 java 堆空间。 通常它被设置为 128 MB 的一个相当小的值 - 增加它,看看问题是否仍然存在。

    要检查是否是内存泄漏,只需尝试以下操作:

    for i=1:1000 % adjust loop-number to your needs
    m = zlib_decompress(...)
    end
    

    如果有泄漏,一旦你的堆空间再次满了,这应该会出错。 如果不是 - 您的内存占用量应保持在一定范围内。

    【讨论】:

    • 谢谢。问题是如果我关闭 Matlab 并重试,我设法打开文件,并重复该过程直到它工作,所以这真的很奇怪。
    【解决方案3】:

    我可能会迟到回答这个问题,但是这个内存问题可以通过在 Matlab 工作区的当前目录中添加文件 java.opts 来解决,您可以在其中指定 Matlab 使用的内存:

    http://de.mathworks.com/matlabcentral/answers/92813-how-do-i-increase-the-heap-space-for-the-java-vm-in-matlab-6-0-r12-and-later-versions

    【讨论】:

    • 感谢您的回复。永远不会太迟。但是,我没有得到答案。是不是里面写着“.opts java cmd”的文本文件?
    猜你喜欢
    • 2013-11-18
    • 2017-06-25
    • 2016-06-26
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多