2

我有一个 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 本身仍在引用该对象——尽管调用了 clear、clear JAVA、clear classes 等。 - 没有任何帮助

有任何想法吗?

4

4 回答 4

1

MATLAB 最新的面向对象编程格式仍然是我尚未涉足的领域,但我可以尝试给你一些想法......

我猜您正在创建一个“值类”而不是“句柄类”(您可以在此处查看有关这些的更多信息)。制作值类的副本时,会复制所有内容。如果您有一个对象的错误副本在某处浮动,那么仍然存在 Java 对象的句柄。

如果您要从句柄类构建您的类,则可以在类析构函数中显式销毁 Java 对象(即重载的 DELETE 方法)。

只是一些随机的想法。希望他们有帮助。

于 2009-01-08T18:02:28.740 回答
1

建议的解决方法 gnovice 似乎有效 - 将行添加到析构函数

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

导致对象不存在于 MATLAB 的 JVM 堆中。


它看起来像 MATLAB 中的一个错误,导致在未引用的 MCOS 类中引用 JAVA 对象。

于 2009-01-10T16:25:11.253 回答
0

我不确定这是否会解决它,但请尝试在构造函数中进行分配,而不是在属性块中。此外,提及您正在使用的确切 Matlab 版本可能会有所帮助。

于 2009-01-08T17:16:53.920 回答
0

尝试查看 OOP 的 onCleanup 方面。我认为 Loren 大约在 3 个月前写了一篇关于它的博客。

HTH。担

于 2009-01-08T22:51:15.100 回答