У меня есть класс 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 все еще ссылается на объект, несмотря на вызовы очистки, очистки JAVA, очистки классов и т. д. - ничего не помогает
Любые идеи?




Я не уверен, что это исправит, но попробуйте сделать назначение в конструкторе, а не в блоке свойств. Кроме того, было бы полезно указать точную версию Matlab, которую вы используете.
Новейший формат объектно-ориентированного программирования для MATLAB - это то, к чему я еще не прыгнул обеими ногами, но я могу попытаться дать вам несколько идей ...
Я предполагаю, что вы создаете «класс значений», а не «класс дескрипторов» (вы можете узнать больше об этих здесь). При создании копий классов значений копируется все содержимое. Если у вас есть ошибочная копия объекта, плавающая где-то, значит, дескриптор объекта Java все еще существует.
Если бы вы вместо этого создавали свой класс из класса дескриптора, вы могли бы явно уничтожить объект Java в деструкторе класса (т.е. перегруженном методе DELETE).
Всего лишь пара случайных идей. Надеюсь, они будут вам полезны.
Попробуйте взглянуть на аспект onCleanup ООП. Я думаю, что Лорен вела об этом блог около 3 месяцев назад.
HTH. Дэн
Обходной путь, предложенный gnovice, похоже, работает - добавление к деструктору строки
function delete( obj )
...
jObject = 0;
end
Заставил объект не присутствовать в куче JVM MATLAB.
Это похоже на ошибку в MATLAB, которая вызывает ссылку на объекты JAVA в классах MCOS, на которые нет ссылок.