主要内容

管理MATLABJVM资源

MATLAB®编译器SDK™使用Java本地接口(JNI)包装器连接Java®应用程序到c++MATLAB运行时.因此,大部分资源被消耗Matlab Compiler SDK.Java应用程序的各个部分由MATLAB运行时.创建的资源MATLAB运行时对JVM™不可见。JVM垃圾收集器不能有效地管理它看不到的资源。

所有的Matlab Compiler SDK.当JVM垃圾收集器收集包装器对象时,Java类具有释放MATLAB资源的钩子。但是,JVM垃圾收集是不可靠的,因为JVM只看到较小的包装器对象。垃圾回收器可以放弃花费CPU周期来删除小包装器对象。在删除Java包装器对象之前,在MATLAB运行时也没有删除。这种行为可能导致类似于内存泄漏的情况,并迅速消耗资源。

避免这种情况:

  • 不要创建匿名的MATLAB对象。

  • 总是使用MATLAB对象dispose()方法。

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

的名字MATLAB资源维护对象

所有支持的MATLAB对象金宝appMatlab Compiler SDK.是否有Java API文档中描述的标准Java构造函数matlabroot./帮助/工具箱/ javabuilder / MWArrayAPI

当创建MATLAB对象时,总是给它们分配名称。例如,创建一个5 × 5单元格数组。

myCA = new MWCellArray(5,5);

Java对象myCA包装纸是指向5乘5的吗mxCellArray对象MATLAB运行时myCA可以添加到其他MATLAB数组或在Java应用程序中操作。当你用完myCA,你可以清理5乘5的空间mxCellArray通过使用对象的dispose()方法。

API的语义允许您创建匿名MATLAB对象并将它们存储在已命名的MATLAB对象中,但您应该这样做从来没有在实践中这样做。您无法管理匿名MATLAB对象创建的MATLAB资源。

考虑下面的代码,它创建了一个MATLAB数组、数据,并用一个匿名的MATLAB对象填充它:

MWStructArray数据= new MWStructArray(1, KMAX, FIELDS);数据。set(FIELDS[0], k + 1, new MWNumericArray(k * 1.13));

创建了两个MATLAB对象。两个对象都有一个Java包装器和一个MATLAB数组对象MATLAB运行时.当你处理数据,所有资源都被清理完成。但是,由此创建的匿名对象新MWNumericArray(k * 1.13)只是被JVM标记为要删除。因为Java包装器只消耗很小的空间,所以垃圾收集器很可能将其留在周围。由于JVM从不清理包装器对象,MATLAB运行时永远不要清理它分配的资源。

现在考虑下面的代码,其中MATLAB对象的设置()方法接受本地Java类型:

MWStructArray数据= new MWStructArray(1, KMAX, FIELDS);数据。set(FIELDS[0], k + 1, k * 1.13);

在这个实例中,只创建了一个MATLAB对象。当它dispose()调用方法,清理所有资源。

释放资源MATLAB对象

清理MATLAB对象使用:

  • 对象的dispose()方法

  • 静态MWArray.disposeArray ()方法

这两种方法都释放了与MATLAB对象关联的所有资源。删除Java包装器对象。如果没有其他引用MATLAB运行时mxarray.对象时,它也被删除。

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

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

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

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

相关话题