4

我正在使用 Matlab 2012b 连接到我从中导入数据的另一个程序 (Imaris)。通信实际上是通过 java 作为接口发生的。我遇到的问题是数据没有从 Java 内存中删除,并且随着时间的推移堆积起来,直到 Matlab 最终崩溃。“清除 Java”不起作用并产生以下警告:“Ice/ConnectionRefusedException 类的对象存在 - 未清除”

我发现真正清除 Java 内存的唯一解决方案是重新启动 Matlab,在我的情况下这不是一个选项。

在网上搜索时,我发现不少人遇到了同样的问题。(http://www.mathworks.de/matlabcentral/newsreader/view_thread/283708

但是我没有找到如何解决问题的答案。有人知道解决方案吗?

4

4 回答 4

1

如果您从 clear java 返回消息,表明存在一个类的对象,并且 clear all 没有删除它们,那么某处的某处有对该对象的引用。这通常会发生在回调、侦听器等,或者当您将对象的引用添加到匿名函数句柄等时。

clear 命令从工作空间中删除对对象的引用,但由于回调中存在匿名(或其他)引用,因此对象不能被垃圾收集,因此保留在内存中(并且可能是孤立的)

当我懒于编写好的析构函数时,我经常看到这一点

于 2014-03-09T15:30:03.540 回答
0

clear java似乎重置了整个 Java 虚拟机。作为对开发人员的保护,当内存中有 Java 对象会被此操作破坏时,Matlab 不会执行此操作。

理想情况下,您可以找出 Matlab 项(通常是一个变量,在工作区或某个持久范围内)是该类的一个实例Ice/ConnectionRefusedException,并清除它。对于您可以访问的变量(例如在工作区中),您可以只运行 run clear variablename,或者对于在某些其他函数中作为持久性保存的变量,您可以运行clear functionname.

然后尝试再次呼叫clear java,就像您一直在做的那样。

也就是说,有时很难找到违规对象所在的位置。众所周知,我会重新启动 Matlab 作为故障安全重启;当然,如果您想处理一些最近获得的数据,那是行不通的。

于 2013-03-11T18:03:11.943 回答
0

您可以尝试调用垃圾收集器,但不能保证他会实际执行,因为您不调用收集器,而是提出请求。

从 matlab 命令行或您的 m 代码运行(由于评论而更正)

java.lang.System.gc()
于 2013-03-11T16:31:32.183 回答
0

你需要设置静态java。因为你不关闭matlab。您只能处理十几个文件,因为 permgen 空间只有 4 MB。加载十次imarislib.jar

您应该添加路径javaaddpath.txt并将其复制到 prefdir。然后删除所有javaaddpath扩展名中的所有行,无论是imaris嵌入它还是您编写它。

于 2017-03-13T17:29:13.880 回答