Управляйте ресурсами MATLAB

Почему Потребность Ресурсов MATLAB быть Управляемым

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

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

Избегать этой ситуации:

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

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

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

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

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

MWCellArray myCA = new MWCellArray(5, 5);

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

Объект 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 Runtime mxArray, он также удален.

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

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

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

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