【问题标题】:MATLAB Java referencing problemMATLAB Java 引用问题
【发布时间】:2009-01-08 16:34:49
【问题描述】:

我有一个 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等 - 没有任何帮助

有什么想法吗?

【问题讨论】:

    标签: java matlab reference garbage-collection


    【解决方案1】:

    最新的 MATLAB 面向对象编程格式我还没有完全涉足,但我可以尝试给你一些想法......

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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


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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          HTH。 丹

          【讨论】:

            猜你喜欢
            • 2011-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多