MATLAB Java引用问题

时间:2009-01-08 16:34:49

标签: java matlab reference garbage-collection

我有一个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,清除类等等 - 没什么帮助

有什么想法吗?

4 个答案:

答案 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。 丹