清除Java内存

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

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

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

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

如果你从清晰的java中得到消息,那里有一个类的对象存在,并且清除所有都没有删除它们,那么某个地方的某些东西会引用该对象。 这通常发生在回调,监听器等,或者当您将对象的引用添加到匿名函数句柄等中时。

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

当我懒得写出好的析构函数时,我看到了很多

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

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

然后尝试再次调用clear java ,就像你一直在做的那样。

也就是说,有时很难找到违规物品所在的位置。 我已经知道重启Matlab作为故障安全重启; 当然,如果你想使用一些最近获得的数据,这是行不通的。

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

从matlab命令行运行,或从你的m代码运行(更正了感谢评论)

 java.lang.System.gc() 

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

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