Как избежать сбоя MATLAB при открытии слишком большого количества фигур?

Иногда я запускаю сценарий MATLAB и слишком поздно понимаю, что он будет выводить слишком много цифр. В конце концов я получаю исключение

в потоке "AWT-EventQueue-0" java.lang.OutOfMemoryError: Пространство кучи Java

, которое можно легко воспроизвести на моем компьютере с помощью

for i=1:inf
  figure;
end

. Я получаю около ~ 90 цифр, прежде чем произойдет сбой при стандартной настройке ( Preferences / Java Heap Memory ) размером 128 МБ Java heap , а удвоение кучи до 256 МБ дает мне около 200 цифр.

Видите ли вы способ избежать сообщения об ошибке Java? Если не хватает памяти для другого рисунка, я бы хотел, чтобы моему сценарию сообщали скорее чем крах.

Может быть, я мог бы иметь обертку для рисунка , который (каким-то образом?) Проверяет доступность кучи Java и отказывается открывать новый рисунок, если осталось недостаточно места?

Обновление

Используя ответы ниже, я получаю красивый график того, сколько свободной памяти у Java:

figure;plot(freeMem/1E6,'x');ylabel('java.lang.Runtime.getRuntime.freeMemory [MB]');xlabel('number of empty figures created');

Это было произведено с использованием

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

15
задан Jonas Heidelberg 20 June 2011 в 08:44
поделиться