我在 javabuilder 编译的 matlab 代码方面遇到了一些问题。我的应用程序基本上是这样划分的:
- 图形用户界面:Java
- 计算:Matlab
主要问题是,当使用 Matlab(R17,2007a)中的 javabuilder 编译我的 matlab 代码时,我的可用内存比将相同代码编译为 exe 文件时要少。我已经通过“feature('memstats')”函数确认了这一点。我的数组的大小通常为 1000000 x 25,并且从 java 运行时无法初始化,因为最大的连续内存空间太小(最大的连续内存空间约为 65MB,而作为 ML exe 文件运行时约为 1200MB)。我的设备运行的是 Windows XP Professional x86,内存为 4GB。
我尝试过这两个 matlab/c 编译器(在 matlab 命令行中使用“mbuild -setup”命令设置):
- Lcc-win32 C 2.4.1
- Microsoft Visual C++ 6.0(也带有/LARGEADDRESSAWARE 标志,但这似乎根本没有帮助)
有什么建议吗?
最佳答案
实际上,您可能希望减少 Java 堆空间。进程中的内存(至少在常规 Matlab 中)是在 Matlab 和 Java 之间分配的。如果增加 Java 堆大小,则会相应减少可用于 Matlab 数组的内存。 Matlab 数组存在于常规 C 风格内存中,而不是 Java 的 GC 内存中。
我猜发生的情况是,您的 Java 应用程序(正在加载 javabuilder 构建的库)被配置为具有比 Matlab IDE 更大的 Java 堆。 Matlab 从一个较小的 Java 堆开始。以下是如何在 Matlab 中显示它。
function show_javamemory()
rt = java.lang.Runtime.getRuntime();
M = 2^20;
disp(sprintf('Java heap: %d M total, %d M max, %d M free',...
round(rt.totalMemory()/M), round(rt.maxMemory()/M), round(rt.freeMemory()/M)));
在我的 R2009a 中,我看到了这一点。
>> show_javamemory()
Java heap: 62 M total, 125 M max, 28 M free
当 Matlab 作为 IDE 运行时,%matlabroot%/bin/win32 中的 java.opts 文件控制嵌入在 Matlab 中的 JVM。我认为这不会影响在 javabuilder 构建的库中加载的应用程序。需要通过将参数传递给调用它们的任何 java 命令行来调整它们。
尝试从已编译的应用程序中运行 show_javamemory() 以查看其堆的配置(以及您的 java.opts 更改是否有效果),然后调整其 Java 选项以减少堆。
关于java - Matlab javabuilder 和内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406352/