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 Compiler SDK, имеют типичных конструкторов Java как описано в com.mathworks.toolbox.javabuilder
Javadoc.
При создании объектов MATLAB всегда присваивайте их имена. Создать 5x5 массив ячеек:
MWCellArray myCA = new MWCellArray(5, 5);
Объект Java myCA
обертка, которая указывает на 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:
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);