A veces empiezo una secuencia de comandos MATLAB y me doy cuenta demasiado tarde de que saldrá demasiadas cifras. Con el tiempo me sale unCómo evitar la caída de MATLAB al abrir demasiadas figuras?
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
que puede ser fácilmente reproducido en mi máquina utilizando
for i=1:inf
figure;
end
llego a alrededor de ~ 90 cifras antes de que se estrelle con el ajuste estándar (Preferences/Java Heap Memory) de 128 montón MB Java, mientras que doblar el Heap a 256 MB me da alrededor de 200 figuras.
¿Ves alguna forma de evitar el mensaje de error de Java? Si no hay suficiente memoria para otra figura, me gustaría que mi secuencia de comandos fuera en en lugar de bloquearse.
Tal vez podría tener un contenedor para figure
que (de alguna manera?) Comprueba cuánto montón de Java está disponible y que se niega a abrir una nueva figura si no hay suficiente espacio disponible?
actualización
Usando las respuestas a continuación, aparece un gráfico agradable para saber cómo tiene mucha memoria libre de Java:
Esta fue producida 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
I supongamos que el aumento en el comienzo significa que la recolección de basura solo hace un cierto esfuerzo e ¿Cuánto tiempo lo llamo?
Actualización 2 - mi solución
Usando la ayuda que llegué aquí, me implementa la siguiente solución como figure.m
que sobrecarga y llama a la acumulación en el figure
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
Nice update. Yo votaría esto por segunda vez si pudiera. Me pregunto si el aumento podría deberse a que Java asigna más memoria. – Jonas