ときどき 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