MATLAB problema de referencia de Java
-
05-07-2019 - |
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?
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