Иногда я запускаю скрипт MATLAB и слишком поздно осознаю, что он будет выводить слишком много цифр.В конце концов я получаю исключение
в потоке "AWT-EventQueue-0" java.lang.OutOfMemoryError: пространство кучи Java
, которое можно легко воспроизвести на моем компьютере с помощью
for i=1:inf
figure;
end
Я получаю около 90 цифр, прежде чем он падает, со стандартной настройкой ( Предпочтения / Память кучи Java ) 128 МБ кучи Java, при этом удвоение кучи до 256 МБ даетмне около 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