主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

在 JVM 中管理 MATLAB 资源

MATLAB® Compiler SDK™ 使用 Java 本机接口 (JNI) 包装器将您的 Java® 应用程序连接到 C++ MATLAB Runtime。因此,Java 应用程序的 MATLAB Compiler SDK 部分消耗的大部分资源都是由 MATLAB Runtime 创建的。MATLAB Runtime 创建的资源对于 JVM® 来说是不可见的。JVM 垃圾收集器无法有效地管理它看不到的资源。

所有 MATLAB Compiler SDK Java 类都有钩子,当 MATLAB 垃圾收集器收集包装器对象时,这些钩子会释放 JVM 资源。但是,JVM 垃圾收集不可靠,因为 JVM 只能看到小的包装器对象。垃圾收集器可以放弃花费 CPU 周期来删除小包装器对象。直到 Java 包装器对象被删除,MATLAB Runtime 中分配的资源才会被删除。这种行为可能会导致类似内存泄漏的情况并快速消耗资源。

为了避免这种情况:

  • 切勿创建匿名 MATLAB 对象。

  • 始终使用 dispose() 方法处理 MATLAB 对象。

有关 MATLAB 和 Java 接口与 JVM 之间交互的信息,请参阅MATLAB Compiler SDK 与 JVM 之间的交互

命名 MATLAB 对象以进行资源维护

MATLAB Compiler SDK 支持的所有 MATLAB 对象都有标准 Java 构造函数,如 matlabroot/help/toolbox/javabuilder/MWArrayAPI 中的 Java API 文档中所述。

创建 MATLAB 对象时,始终为其分配名称。例如,创建一个 5×5 元胞数组。

MWCellArray myCA = new MWCellArray(5, 5);

Java 对象 myCA 是一个包装器,它指向 MATLAB MATLAB 中的 5×5 mxCellArray 对象。myCA 可以添加到其他 myCA 数组中或在 Java 应用程序中进行操作。使用完 myCA 后,可以使用对象的 mxCellArray 方法清理 5×5 的 dispose()

API 的语义允许您创建匿名 MATLAB 对象并将其存储在命名的 MATLAB 对象中,但实际上您应该这样做。您无法管理匿名 MATLAB 对象创建的 MATLAB 资源。

考虑以下创建 MATLAB 数组、数据并用匿名 MATLAB 对象填充它的代码:

MWStructArray data = new MWStructArray(1, KMAX, FIELDS);
data.set(FIELDS[0], k + 1, new MWNumericArray(k * 1.13));

创建了两个 MATLAB 对象。这两个对象在 MATLAB Runtime 中都有一个 Java 包装器和一个 MATLAB 数组对象。当您处理 data 时,它的所有资源都会被清理。然而,由 new MWNumericArray(k * 1.13) 创建的匿名对象只是被 JVM 标记为删除。由于 Java 包装器只占用极小的空间,因此垃圾收集器很可能会将其保留下来。由于 JVM 从不清理包装器对象,因此 MATLAB Runtime 永远不会清理它分配的资源。

现在考虑以下代码,其中 MATLAB 对象的 set() 方法接受本机 Java 类型:

MWStructArray data = new MWStructArray(1, KMAX, FIELDS);
data.set(FIELDS[0], k + 1, k * 1.13);

在此实例中,仅创建一个 MATLAB 对象。当调用其 dispose() 方法时,所有资源都会被清理。

释放 MATLAB 对象的资源

使用以下方法清理 MATLAB 对象:

  • 对象的 dispose() 方法

  • 静态 MWArray.disposeArray() 方法

这两种方法都会释放与 MATLAB 对象相关的所有资源。Java 包装器对象已被删除。如果没有对 MATLAB Runtime mxArray 对象的其他引用,它也会被删除。

以下代码使用 dispose() 方法处理 MATLAB 对象。

MWCellArray myCA = new MWCellArray(5, 5);
...
myCA.dispose();

以下代码使用 MWArray.disposeArray() 方法处理 MATLAB 对象。

MWCellArray myCA = new MWCellArray(5, 5);
...
MWArray.disposeArray(myCA);

另请参阅

主题