我有一个MATLAB类,其中包含对java对象的引用
classdef MyClass
properties
j = myJavaClass
end
methods
...
end
end
在我使用它之后(使用clear,scope exit或显式设置myClass = 0;)java对象仍然存活 - 即使在调用Runtime.gc之后。
我在转储中看到对象仍然在MATLAB进程的JVM堆中(使用jmap -histo pID),因此我假设MATLAB本身仍在引用该对象 - 尽管要求清除,清除JAVA,清除类等等 - 没什么帮助
有什么想法吗?
答案 0 :(得分:1)
MATLAB最新的面向对象编程格式仍然是我尚未用双脚跳过的东西,但我可以试着给你一些想法......
我猜你正在创建一个“值类”而不是“句柄类”(你可以查看更多关于这些here的内容)。制作值类的副本时,将复制所有内容。如果你有一个漂浮在某处的对象的错误副本,那么现有的Java对象仍然存在句柄。
如果您要改为使用句柄类构建类,则可以显式销毁类析构函数中的Java对象(即重载的DELETE方法)。
只是一些随意的想法。希望他们有所帮助。
答案 1 :(得分:1)
建议的解决方法gnovice似乎工作 - 向析构函数添加行
function delete( obj )
...
jObject = 0;
end
导致该对象不存在于MATLAB的JVM堆中。
它看起来像MATLAB中的一个错误,导致在未引用的MCOS类中引用JAVA对象。
答案 2 :(得分:0)
我不确定这是否会解决它,但尝试在构造函数中进行赋值,而不是在属性块中。此外,提及您正在使用的确切Matlab版本可能会有所帮助。
答案 3 :(得分:0)
尝试查看OOP的onCleanup方面。我认为Loren大约在3个月前做了一个博客。
HTH。 丹