【发布时间】:2011-09-06 06:34:55
【问题描述】:
有时我启动一个 MATLAB 脚本并意识到它会输出太多的数字为时已晚。最终我得到一个
线程“AWT-EventQueue-0”java.lang.OutOfMemoryError 中的异常:Java 堆空间
可以在我的机器上轻松复制
for i=1:inf
figure;
end
在 128 MB Java 堆的标准设置 (Preferences / Java Heap Memory) 崩溃之前,我得到了大约 90 个数字,而将堆加倍到 256 MB 给了我大约 200 个数字。
你有什么办法避免 Java 错误消息吗?告诉 而不是崩溃。
也许我可以有一个 figure 的包装器,它(不知何故?)检查有多少 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,它重载并调用内置 figure 命令:
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
【问题讨论】:
-
不错的更新。如果可以的话,我会第二次投票赞成。我想知道增加是否可能是由于 Java 分配了更多内存。
标签: java matlab heap-memory jvm-crash