我正在使用Matlab 2012b连接到我导入数据的另一个程序(Imaris)。通信实际上是通过java作为接口发生的。我遇到的问题是数据不会从Java内存中删除并随着时间的推移而堆积,直到Matlab最终崩溃。 “clear Java”不起作用并产生以下警告:“Ice / ConnectionRefusedException类的对象存在 - 不清除”
我发现真正清除Java内存的唯一解决方案是重启Matlab,在我的情况下这不是一个选项。
在网上搜索时,我发现很多人都遇到了同样的问题。 (http://www.mathworks.de/matlabcentral/newsreader/view_thread/283708)
但是我没有找到答案如何解决这个问题。有人知道解决方案吗?
答案 0 :(得分:1)
如果你从清晰的java中收到消息,表明存在一个类的对象,并且清除所有没有删除它们,那么某个地方的东西会引用该对象。这通常发生在回调,监听器等,或者当您将对象的引用添加到匿名函数句柄等中时。
clear命令从工作空间中删除对象的引用,但由于回调中存在匿名(或其他)引用,因此对象不能被垃圾收集,因此保留在内存中(并且可能是孤立的)< / p>
当我懒得写出好的析构函数时,我看到了很多东西
答案 1 :(得分:0)
您可以尝试调用垃圾收集器,但是不能保证他的实际执行会因为您不调用收集器而提出请求。
从matlab命令行运行,或从你的m代码运行(通过评论更正)
java.lang.System.gc()
答案 2 :(得分:0)
clear java
似乎重置了整个Java虚拟机。作为开发人员的保护,当您在内存中存在可能被此操作破坏的Java对象时,Matlab将不会执行此操作。
理想情况下,您可以找出Matlab项目(通常是工作空间中的变量或某些持久性作用域),它是类Ice/ConnectionRefusedException
的一个实例,并清除它。对于您有权访问的变量(例如在工作空间中),您可以只运行clear variablename
,或者对于在某些其他函数中保持为持久性的变量,您可以运行clear functionname
。
然后尝试再次呼叫clear java
,就像你一直在做的那样。
尽管如此,有时很难追踪违规物体所在的位置。我已经知道重启Matlab作为故障安全重启;当然,如果你想使用一些最近获得的数据,这是行不通的。
答案 3 :(得分:-1)
您需要设置静态java。因为你没有关闭matlab。您只能处理十几个文件,因为permgen空间只有4 MB。加载十次imarislib.jar
。
您应该将路径添加到javaaddpath.txt
并将其复制到prefdir。
然后删除所有扩展名中javaaddpath
的所有行,无论是imaris嵌入还是您编写它。