【问题标题】:clear Java memory清除 Java 内存
【发布时间】:2013-03-11 16:09:38
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否需要认真调试才能在生产中可靠地工作,或者只是找到一种解决方法来清除内存不足的交互式会话?
  • 我也有同样的担忧。一个当然可以“静音”警告,但正确的用法是正确处理它们。

标签: java matlab


【解决方案1】:

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

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

当我懒于编写好的析构函数时,我经常看到这种情况

【讨论】:

  • 我想我遇到了同样的问题。 stackoverflow.com/questions/29521014/…你能解释一下“好的析构函数”的目的是什么吗?
  • 对我来说,一个“好的析构函数”显式释放了类已经(或可能已经?!)创建的任何东西......在上面的例子中,如果我在构造函数中创建一个监听器,我应该也在析构函数中明确清除它
【解决方案2】:

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

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

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

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

【讨论】:

  • clear java 表示clear all,清除所有 Matlab 函数,因此您可能不需要单独 clear 它们。但是您也可以clear classesclear java 不会这样做,并且会处理方法中的静态变量或持久性。此外,您可以使用close force all 关闭数字,因为 Java 引用可能隐藏在应用数据或数字回调中。
【解决方案3】:

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

从 matlab 命令行或 m 代码运行(感谢 cmets 更正)

java.lang.System.gc()

【讨论】:

  • 对我来说它会触发错误The class java.lang.Runtime has no property or method named 'gc'...
  • 我想你的意思是java.lang.System.gc
  • 它不是静态方法,所以不能这样称呼它。更像java.lang.Runtime.getRuntime().gc();。或者 Edric 的建议。
  • 不管怎样,不要打扰。当内存不足时,JVM 会自动调用垃圾收集器,就像您在这里一样。调用System.gc() 无法取回原本不存在的内存。调用gc() 仅用于平滑由于垃圾收集运行而导致的暂停或尝试调整其时间以提高效率。不是你想在这里做的。
  • 谢谢,这对我有用:clear java; java.lang.System.gc();
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2014-01-13
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多