我在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,系统会变得很慢。
答案 0 :(得分:0)
过去,我的Matlab应用程序中也出现了这个问题。最常见的症状是在重新绘制/刷新绘图或界面时出现以下异常:java.lang.OutOfMemoryError: 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)后,内存分配错误消失了;内存似乎被正确释放。