【问题标题】:cleaning problem using java classes in matlab在matlab中使用java类清理问题
【发布时间】:2011-04-26 00:03:28
【问题描述】:

我正在用 matlab ui 编写一个 java 应用程序。 为此,我在 matlab 中使用 java 对象,如下所述: http://www.mathworks.com/help/techdoc/matlab_external/f4873.html

我想做的是创建一个这样的matlab函数:

function [] = foo 
  o = javaObject('myObject',parameters...);
  o.memberfunction(parameters...);

我希望 foo 的行为与 java 中的 main 函数完全相同。 因此,希望在 foo 运行结束时清理所有内容,包括静态类字段。

出现问题的例子:

first run foo:
static fields are set to some values V
second run foo:
static fields are still set to values V 

我尝试清除实例 o 但这并没有解决任何问题(经过一段时间(相当长的时间),而 matlab 确实清除了实例但显然没有清除类字段)。

【问题讨论】:

    标签: java matlab garbage-collection static-members system.exit


    【解决方案1】:

    如果您使用的是 Swing,您应该能够通过以编程方式关闭主窗口并设置 JFrame.DISPOSE_ON_CLOSE 来破坏 GUI。但是静态成员的目的是在这种情况下坚持下去。静力学的目的是什么?为什么它们不是您的应用或主窗口的实例变量?

    【讨论】:

    • 它们不是实例变量,因为它们是为所有实例共享的。我知道我可以只给所有实例一个指向同一个实例的引用成员,但我认为这意味着传递一个对实例的公共引用(在构造函数中),因此内存的分配不在该类的上下文中,并且抽象/调制目的我需要它在类上下文中。我编辑了我的帖子,以便更好地了解我的应用程序的行为方式以及为什么我在理论上应该能够使用静态字段。
    • 嗯,foo 完成后可以退出 Matlab。
    【解决方案2】:

    “clear java”命令可能会执行您想要的操作。它将卸载它已加载的所有 Java 类。

    在 Java 中,它不会退出导致清除静态数据的 main() 方法;当所有非守护线程都退出时,它是 JVM 准备关闭。 main() 执行只是这些线程之一。

    将它们转换为实例变量可能会更好。或者更确切地说,获取所有这些静态数据,将它们打包到另一个类中,并让所有实例都携带对该类的单个共享对象的引用。

    【讨论】:

    • 如果我理解正确的话,如果不结束matlab线程就不可能清除静态变量?在所有情况下,java clear都没有帮助我:(。另外因为我隐藏了gui而不是破坏它,我还有一个正在运行的线程(在eclipse中我需要手动退出,而在matlab中我猜它永远不会结束,只要matlab 已打开?)这是否会导致即使在调用 java clear 后仍保持静态设置?无论如何,有没有办法在不导致 matlab 退出的情况下结束此线程(调用 system.exit)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多