Matlab图内存未释放

时间:2017-12-14 20:52:50

标签: linux matlab ubuntu memory memory-management

我在Ubuntu GNOME 16.04.3上运行Matlab R2016b。每次我创建一个新的情节(即图形),我都可以看到Matlab的虚拟内存分配增长。如果我长时间使用Matlab,虚拟内存分配与常驻内存分配相结合,最终会达到我的RAM限制并开始进入交换空间,系统会大大减慢。当我关闭数字时,内存不会被释放。要清楚,以下命令都不会减少分配给Matlab的虚拟驻留内存:

clear all;  % clear all variables
close all;  % close all the figures
pack;       % Tell matlab to consolidate its memory
java.lang.Runtime.getRuntime.gc; % Run java garbage collection

有没有人有办法阻止Matlab最终消耗所有可用内存?我从来没有注意到Matlab在我的苹果电脑上这样做。一旦数字关闭,为什么Linux / Ubuntu不清理内存?

我没有遇到像java.lang.OutOfMemoryError这样的错误,但是一旦分配了RAM并开始使用Swap,系统会变得很慢。

2 个答案:

答案 0 :(得分:0)

过去,我的Matlab应用程序中也出现了这个问题。最常见的症状是在重新绘制/刷新绘图或界面时出现以下异常:java.lang​.OutOfMemo​ryError: Java heap space

经过几天的研究,我想出了一个小Java实用程序形式的解决方案。在源代码下面:

package mutilities;

import java.awt.Dimension;
import javax.swing.RepaintManager;

public final class Environment
{   
    public static void CleanMemoryHeap()
    {
        try
        {
            final RepaintManager rm = RepaintManager.currentManager(null);
            final Dimension localDimension = rm.getDoubleBufferMaximumSize();

            rm.setDoubleBufferMaximumSize(new Dimension(0, 0));
            rm.setDoubleBufferMaximumSize(localDimension);

            System.gc();
        }
        catch (Exception e) { }
    }

    // other utility methods...
}

一旦编译成一个小的jar包,你可以在需要清理一些内存时从Matlab调用它,如下所示:

% you need to javaaddpath before
import('mutilities.*');
Environment.CleanMemoryHeap();

我通常在我的GUIDE应用程序的构造函数中调用它:

function Construct(this)
    warning('off','all');

    % this is how I called my jar package
    javaaddpath(fullfile(pwd(),'MatlabUtilities.jar'));

    import('mutilities.*');
    Environment.CleanMemoryHeap();

    % ...
end

当然,您也可以在Matlab环境中运行相同的代码,而无需将其编译为jar包,因为它具有完全的互操作性。

在旁注中,对于Garbage Collector的问题,请注意,即使Runtime.getRuntime().gc()System.gc()相同,因为后者在内部调用前者,System.gc()是一种类方法,因此使用起来更方便。

答案 1 :(得分:0)

这个问题似乎与if not isinstance(x, (list, tuple)): x = [x] joined = ','.join(map(str,x)) 实现及其与Matlab的交互有关。更新/升级jogl包(详细描述on SuperUser)后,内存分配错误消失了;内存似乎被正确释放。