Pregunta

Tengo una clase de MATLAB que contiene una referencia a un objeto java

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

y después de usarlo (usando clear, scope exit o explícitamente configurando myClass = 0;) el objeto java aún está vivo, incluso después de llamar a Runtime.gc.

Veo en el volcado que el objeto todavía está en el montón de JVM para el proceso MATLAB (usando jmap -histo pID) y, por lo tanto, asumo que MATLAB sigue haciendo referencia al objeto, a pesar de llamar para borrar, borrar JAVA, borrar clases , etc. - nada ayuda

¿Alguna idea?

¿Fue útil?

Solución 2

La solución gnovice sugerida parece funcionar, agregando al destructor la línea

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

Causó que el objeto no estuviera presente en el montón JVM de MATLAB.


Parece un error en MATLAB que causa la referencia de los objetos JAVA en clases MCOS sin referencia.

Otros consejos

El nuevo formato de programación orientado a objetos para MATLAB sigue siendo algo que aún no he aprovechado con ambos pies, pero puedo intentar y darte algunas ideas ...

Supongo que está creando una " clase de valor " a diferencia de una " clase de manejo " (Puede consultar más acerca de estos aquí ). Cuando se hacen copias de clases de valor, todos los contenidos se copian. Si tiene una copia errante del objeto flotando en algún lugar, entonces todavía existe un identificador para el objeto Java existente.

Si tuviera que construir su clase a partir de la clase de manejador, podría destruir explícitamente el objeto Java dentro del destructor de la clase (es decir, el método DELETE sobrecargado).

Sólo un par de ideas al azar. Espero que sean útiles.

No estoy seguro de si esto lo solucionará, pero intente realizar la asignación en el constructor, no en el bloque de propiedades. Además, podría ser útil mencionar la versión exacta de Matlab que estás usando.

Intente echar un vistazo al aspecto onCleanup de la POO. Creo que Loren hizo un blog sobre esto hace unos 3 meses.

HTH. Dan

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top