有时我会启动一个MATLAB脚本,并且意识到太晚了,它会输出太多的数字.最终我得到了
Exception in thread “AWT-EventQueue-0” java.lang.OutOfMemoryError: Java heap space
这可以很容易地在我的机器上复制使用
for i=1:inf
figure;
end
在达到128 MB Java堆的标准设置(Preferences / Java Heap Memory)崩溃之前,我会收到大约90个数字,而把堆叠倍数增加到256 MB可以让我大概有200个数字.
你有没有办法避免Java错误信息?如果没有足够的内存用于另一个数字,我希望我的脚本被告知而不是崩溃.
也许我可以有一个图形的包装器(哪里?)检查有多少Java堆可用,哪些拒绝打开一个新的数字,如果没有足够的空间?
更新
使用下面的答案,我得到一个很好的图表,多少空闲的内存Java有:
这是使用
for i=1:inf
java.lang.Runtime.getRuntime.gc
fprintf('%3.0f: %1.0f Byte free\n',i,java.lang.Runtime.getRuntime.freeMemory);
figure;
end
我认为开始的增加意味着垃圾收集只会在我每次打电话时做出一定的努力?
更新2 – 我的解决方案
使用我在这里的帮助,我实现了以下解决方案作为一个figure.m,它重载并调用build-in图形命令:
function varargout=figure(varargin)
memcutoff = 10E6; % keep at least this amount of bytes free
memkeyboard= 3E6; % if memory drops below this, interrupt execution and go to keyboard mode
global refuse_new_figures
if refuse_new_figures
warning('jb:fig:lowjavamem2','Java WAS memory low -> refusing to create a new figure. To reset, type "global refuse_new_figures ; refuse_new_figures = [];"');
return
end
freemem=java.lang.Runtime.getRuntime.freeMemory;
if freemem < memcutoff
fprintf('Free memory is low (%1.0f Bytes) -> running garbace collector...\n',freemem);
java.lang.Runtime.getRuntime.gc
end
freemem=java.lang.Runtime.getRuntime.freeMemory;
% fprintf('Free memory is %1.0f Bytes.\n',freemem);
if freemem < memkeyboard
warning('jb:fig:lowjavamem','Java memory very low -> going into interactive mode. Good luck!');
keyboard;
end
if freemem < memcutoff
warning('jb:fig:lowjavamem','Java memory low -> refusing to create a new figure!');
refuse_new_figures=true;
else
if nargin > 0
if nargout > 0
varargout{1}=builtin('figure',varargin{:});
else
builtin('figure',varargin{:});
end
else
if nargout > 0
varargout{1}=builtin('figure');
else
builtin('figure');
end
end
end