exponenta event banner

Управление ресурсами MATLAB

Почему необходимо управлять ресурсами MATLAB

Компилятор MATLAB ® SDK™ использует оболочку Java Native Interface (JNI), соединяющую приложение Java ® с C++ MATLAB Runtime. В результате большая часть ресурсов, потребляемых компонентами SDK компилятора MATLAB приложения Java, создается средой выполнения MATLAB. Ресурсы, созданные средой выполнения MATLAB, не видны JVM™. Сборщик мусора JVM не может эффективно управлять ресурсами, которые он не может видеть.

Все классы Java SDK компилятора MATLAB содержат крючки, освобождающие ресурсы MATLAB, когда JVM собирает объекты-оболочки. Однако сбор мусора JVM ненадежен, поскольку JVM видит только маленький объект-обертку. Сборщик мусора может решить, что не стоит тратить циклы ЦП на фактическое удаление объекта-оболочки. До удаления объекта-оболочки Java ресурсы, выделенные во время выполнения MATLAB, также не удаляются. Такое поведение может привести к условиям, которые выглядят как утечки памяти и быстро потребляют ресурсы.

Во избежание этой ситуации:

  • Никогда не создавать анонимные объекты MATLAB.

  • Всегда удалять объекты MATLAB с помощью их dispose() способ.

Создание объектов MATLAB

Все объекты MATLAB, поддерживаемые MATLAB Compiler SDK, имеют стандартные Java-конструкторы, как описано в com.mathworks.toolbox.javabuilder Javadoc.

При создании объектов MATLAB всегда присваивайте им имена. Для создания массива ячеек 5x5:

MWCellArray myCA = new MWCellArray(5, 5);

Объект Java myCA является оберткой, указывающей на 5x5 mxCellArray в среде выполнения MATLAB. myCA можно добавить в другие массивы MATLAB или управлять ими в приложении Java. Когда вы закончите с myCA, вы можете очистить 5x5 mxCellArray использование объекта dispose() способ.

Семантика API позволяет создавать анонимные объекты MATLAB и хранить их в именованных объектах MATLAB, но никогда не следует делать этого на практике. Управление ресурсами MATLAB, созданными анонимным объектом MATLAB, невозможно.

Следующий код создает массив MATLAB, данные и заполняет его анонимным объектом MATLAB:

MWStructArray data = new MWStructArray(1, KMAX, FIELDS);
data.set(FIELDS[0], k + 1, new MWNumericArray(k * 1.13));

Создаются два объекта MATLAB. Оба объекта имеют оболочку Java и объект массива MATLAB во время выполнения MATLAB. Когда вы распоряжаетесь data, все ресурсы для него очищены. Однако анонимный объект, созданный new MWNumericArray(k * 1.13) только что помечен для удаления JVM. Однако, поскольку оболочка Java занимает небольшое количество места, сборщик мусора, скорее всего, оставит его вокруг. Поскольку JVM никогда не очищает объект-оболочку, среда выполнения MATLAB никогда не очищает выделенные ресурсы.

Объект MATLAB set() методы принимают собственные типы Java:

MWStructArray data = new MWStructArray(1, KMAX, FIELDS);
data.set(FIELDS[0], k + 1, k * 1.13);

В этом случае создается только один объект MATLAB. Когда его dispose() вызывается метод, все очищенные ресурсы.

Распоряжение объектами MATLAB

Существует два способа очистки объектов MATLAB:

  • объект dispose() метод

  • статическое MWArray.disposeArray() метод

Оба метода освобождают все ресурсы, связанные с объектом MATLAB. Объект оболочки Java удаляется. Если нет других ссылок на среду выполнения MATLAB mxArray объект также удаляется.

Следующий код распоряжается объектом MATLAB, используя его dispose() способ.

MWCellArray myCA = new MWCellArray(5, 5);
...
myCA.dispose();

Следующий код распоряжается объектом MATLAB с помощью MWArray.disposeArray() способ.

MWCellArray myCA = new MWCellArray(5, 5);
...
MWArray.disposeArray(myCA);