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

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

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

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

Чтобы избежать этой ситуации:

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

  • Всегда утилизируйте объекты MATLAB, используя их dispose() способ.

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

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

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

MWCellArray myCA = new MWCellArray(5, 5);

Объект Java myCA - обертка, указывающая на mxCellArray 5x5 объект в MATLAB Runtime. myCA может быть добавлен в другие массивы MATLAB или манипулирован в вашем приложении Java. Когда вы закончите с myCAможно очистить mxCellArray 5x5 использование 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 Runtime. Когда вы распоряжаетесь data, все ресурсы для него очищены. Однако анонимный объект, созданный new MWNumericArray(k * 1.13) только что отмечен для удаления JVM. Однако, поскольку обертка Java потребляет крошечное количество пространства, сборщик мусора, вероятно, оставит его вокруг. Поскольку JVM никогда не очищает объект, MATLAB Runtime никогда не очищает выделенные ресурсы.

set() объекта MATLAB методы принимают собственные типы 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 Runtime mxArray объект, он также удален.

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

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

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

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