Компилятор 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 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:
объект 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);