Como evitar falhas do MATLAB ao abrir muitas figuras?
s vezes, inicio um script do MATLAB e percebo tarde demais que ele produzirá números demais. Eventualmente, recebo um
Exceção no encadeamento "AWT-EventQueue-0" java.lang.OutOfMemoryError: espaço de heap Java
que pode ser facilmente reproduzido na minha máquina usando
for i=1:inf
figure;
end
Chego a cerca de ~ 90 dígitos antes de falhar com a configuração padrão Preferences / Java Heap Memory) de heap Java de 128 MB, enquanto duplicar o heap para 256 MB me dá cerca de 200 número
Você vê alguma maneira deevita a mensagem de erro do Java? Se não houver memória suficiente para outra figura, gostaria que meu script fosseconto em vez de travar.
Talvez eu pudesse ter um invólucro parafigure
que (de alguma forma?) verifica a quantidade de heap Java disponível e que se recusa a abrir uma nova figura se não houver espaço suficient
Atualiza
Usando as respostas abaixo, recebo um bom gráfico sobre a quantidade de memória Java livre disponível:
Este foi produzido usando
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
Suponho que o aumento no início signifique que a coleta de lixo só faz um certo esforço toda vez que eu o chamo?
Update 2 - minha solução
Usando a ajuda que recebi aqui, implementei a seguinte solução como umfigure.m
que sobrecarrega e chama o build-infigure
comando:
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