¿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

Respuestas a la pregunta(3)

Su respuesta a la pregunta