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

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 и Java и JVM, смотрите Взаимодействие Между MATLAB Compiler SDK и JVM.

Назовите объекты MATLAB для обслуживания ресурса

Все объекты MATLAB, поддержанные MATLAB Compiler SDK, имеют типичных конструкторов Java как описано в документации API Java в matlabroot/help/toolbox/javabuilder/MWArrayAPI.

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

MWCellArray myCA = new MWCellArray(5, 5);

Объект Java myCA обертка, которая указывает на mxCellArray 5 на 5 объект в MATLAB Runtime. myCA может добавляться к другим массивам MATLAB или управляться в вашем приложении Java. Когда вы закончены с myCA, можно очистить mxCellArray 5 на 5 при помощи 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 удален. Если нет никаких других ссылок на mxArray MATLAB Runtime объект, это также удалено.

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

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

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

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

Похожие темы