在Matlab编辑器中以编程方式打开和关闭文件会导致内存泄漏。以下代码说明了该问题:
function TestEditorMemoryLeak(filepaths)
for i = 1 : numel(filepaths)
docobj = matlab.desktop.editor.openDocument(filepaths{i});
disp([num2str(i), ': ', filepaths{i}]);
pause(0.2);
docobj.closeNoPrompt();
end
end
- 警告:不要运行包含大量文件的上述代码。根据在MATLAB常规设置下分配的Java堆内存大小,它可能会导致MATLAB崩溃和挂起,从而导致命令历史记录和MATLAB设置*的丢失。
我在大约1300个文件上使用了上面的代码,其中每个文件都不太大--可能平均每个文件大约有50行。在我的系统上,分配了默认的768MB Java堆内存,在大约1000个文件之后,内存耗尽,并且MATLAB严重挂起。
我认为Java垃圾收集可能会在函数运行后清除,但768MB的内存仍在使用,并且永远不会在Windows任务管理器中恢复正常。
适当增加Java堆内存设置可以解决问题,但我希望找到一个真正的解决方案。有没有办法避免这种内存泄漏?-例如,有没有办法让MatLab偶尔清理一下?会对任何有解决方案的人表示感谢。
1条答案
按热度按时间bvuwiixz1#
这可能不是内存泄漏,已用堆和已分配堆之间是有区别的。
即使堆空间现在没有使用,JVM也可能会保留已经分配的内存。
在您的例子中,JVM进程将在打开文件期间保留内存,但不会立即将其交还给操作系统。
您可以查看此答案why does this java process not release memory。