Вопрос

У меня есть класс MATLAB, который содержит ссылку на объект java

classdef MyClass
  properties
    j = myJavaClass
  end
  methods
...
  end
end

и после того, как я использую его (используя clear, scope exit или явно установив MyClass = 0;) объект java все еще активен - даже после вызова Runtime.gc.

Я вижу в дампе, что объект все еще находится в куче JVM для процесса MATLAB (используя jmap -histo pID), и поэтому я предполагаю, что сам MATLAB все еще ссылается на объект - несмотря на вызовы clear, clear JAVA, clear classes и т.д.- ничего не помогает

Есть какие-нибудь идеи?

Это было полезно?

Решение 2

Предложенный gnovice обходной путь, похоже, работает - добавление в деструктор строки

function delete( obj )
  ...
  jObject = 0;
end

Привело к отсутствию объекта в куче JVM MATLAB.


Это похоже на ошибку в MATLAB, которая вызывает ссылку на объекты JAVA в классах MCOS без ссылок.

Другие советы

Новейший формат объектно-ориентированного программирования для MATLAB - это то, что я до сих пор не осознал обеими ногами, но я могу попытаться дать вам несколько идей ...

Я предполагаю, что вы создаете " класс значений " в отличие от «класса ручки» (Подробнее об этих здесь можно узнать здесь ). Когда создаются копии классов значений, все содержимое копируется. Если у вас есть ошибочная копия объекта, плавающего где-то, то все еще есть дескриптор существующего объекта Java.

Если бы вместо этого вы собирали свой класс из класса handle, вы могли бы явно уничтожить объект Java в деструкторе класса (то есть перегруженном методе DELETE).

Просто пара случайных идей. Надеюсь, они полезны.

Я не уверен, что это исправит это, но попробуйте выполнить присваивание в конструкторе, а не в блоке свойств. Также может быть полезно упомянуть точную версию Matlab, которую вы используете.

Попробуйте взглянуть на аспект onCleanup ООП.Я думаю, что Лорен вела блог об этом около 3 месяцев назад.

ХТХ.Dan

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top