¿Cómo evitar el bloqueo de MATLAB al abrir demasiadas figuras?
A veces comienzo un script de MATLAB y me doy cuenta demasiado tarde de que generará demasiadas cifras. Eventualmente obtengo una
Exception en el hilo "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
que se puede reproducir fácilmente en mi máquina usando
for i=1:inf
figure;
end
Llego a alrededor de ~ 90 cifras antes de que falle con la configuración estándar Preferences / Java Heap Memory) de 128 MB de almacenamiento dinámico de Java, mientras que duplicar el almacenamiento dinámico a 256 MB me da alrededor de 200 cifras.
¿Ves alguna forma deevita el mensaje de error de Java? Si no hay suficiente memoria para otra figura, me gustaría que mi script seadich en lugar de bloquearse.
al vez podría tener un contenedor parafigure
¿cuál (de alguna manera?) comprueba cuánto almacenamiento dinámico de Java está disponible y cuál se niega a abrir una nueva figura si no queda suficiente espacio?
Actualiza
Usando las respuestas a continuación, obtengo un buen gráfico de la cantidad de memoria libre que Java tiene:
Esto fue producido 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
Supongo que el aumento al principio significa que la recolección de basura solo hace un cierto esfuerzo cada vez que lo llamo.
Update 2 - mi solución
Utilizando la ayuda que obtuve aquí, implementé la siguiente solución comofigure.m
que se sobrecarga y llama al incorporadofigure
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