Проблема со ссылкой на MATLAB Java
-
05-07-2019 - |
Вопрос
У меня есть класс 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