Mik*_*ail 28 matlab garbage-collection memory-management
你的心理模型是什么?它是如何实现的?它有哪些优点和缺点?MATLAB GC与Python GC?
我有时会在使用MATLAB嵌套函数时看到奇怪的性能瓶颈,否则看起来无关紧要,我确信这是因为GC.垃圾收集器是VM的重要组成部分,Mathworks不会将其公开.
我的问题是关于MATLAB自己的堆和GC!不是关于Java/COM对象的处理/防止"内存不足"错误/堆栈变量的分配.
Mik*_*ail 44
这是我收集的事实清单.在这种情况下,术语内存(de)分配似乎更合适,而不是GC .
我的主要信息来源是Loren的博客(特别是它的评论)和MATLAB Digest的这篇文章.
由于MATLAB具有可能的大数据集的数值计算方向,因此MATLAB在优化堆栈对象性能方面做得非常好,例如对数据使用就地操作和对函数参数进行逐个引用调用.另外,由于它的定位,它的内存模型与Java这样的OO语言根本不同.
在版本7之前,MATLAB正式没有用户定义的堆内存(在版本6 reference中,schema.m文件中没有未记录的功能).MATLAB 7以嵌套函数(闭包)和句柄对象的形式堆积,它们的实现共享相同的基础.作为旁注,OO可以在MATLAB中使用闭包进行模拟(对于2008a之前的版本很有用).
令人惊讶的是,可以检查由函数句柄(闭包)捕获的封闭函数的整个工作空间,请参阅MATLAB帮助中的函数函数(fhandle).这意味着封闭工作区正在内存中冻结.这就是cellfun/arrayfun在嵌套函数中使用时有时非常慢的原因.
Loren和Brad Phelan也有关于对象清理的有趣帖子.
在我看来,MATLAB中关于堆释放的最有趣的事实是,每次堆栈被释放时,MATLAB都会尝试这样做,即在离开每个函数时.这具有优势,但如果堆释放缓慢,则也会造成巨大的CPU损失.在某些情况下,它在MATLAB中实际上非常慢!
可以命中代码的MATLAB内存释放的性能问题非常糟糕.我总是注意到我在代码中无意中引入了循环引用,当它突然运行x20较慢时,有时需要几秒钟才能离开函数并返回其调用者(清理所花费的时间).这是一个众所周知的问题,请参阅Dave Foti和这个较旧的论坛帖子,该代码用于使该图像可视化性能(测试在不同的机器上进行,因此不同MATLAB版本的绝对时序比较毫无意义):
参考对象的池大小的线性增加意味着MATLAB性能的多项式(或指数)减少!对于值对象,性能如预期的那样是线性的.
考虑到这些事实,我只能推测MATLAB使用的还不是非常有效的引用计数形式来进行堆释放.
编辑:我总是遇到许多小型嵌套函数的性能问题,但最近我注意到至少在2006a中,使用一些兆字节数据清理单个嵌套作用域也很糟糕,只需将1.5秒的嵌套作用域变量设置为空!
编辑2:最后我得到了答案 - 戴夫福蒂本人.他承认存在缺陷,但表示MATLAB将保留其目前的确定性清理方法.
图例:执行时间越短越好

Mik*_*atz 13
MATLAB在Workspace浏览器中或使用"whos"命令使工作区非常清晰.这将显示命令创建的所有对象以及它们占用的内存量.
feature('memstats')
Run Code Online (Sandbox Code Playgroud)
将向您展示MATLAB可用的最大连续内存块,这意味着它是您可以创建的最大矩阵.使用"clear"命令将同步从内存中删除这些对象并释放空间以便再次使用.
JVM仅处理Java项的垃圾收集.因此,如果您在编辑器中打开文件并关闭它,Java会负责从内存中删除窗口和文本等.如果在MATLAB工作空间中创建Java对象,则必须先将其清除,然后由jvm清除它.
在我们的技术说明中有很多关于管理程序存储器的信息:http://www.mathworks.com/support/tech-notes/1100/1106.html
我最近在MATLAB桌面博客上写了关于处理Java内存的文章:http://blogs.mathworks.com/desktop/2009/08/17/calling-java-from-matlab-memory-issues/
如果你在学术上感兴趣,当函数退出或调整变量大小时分配的内存会发生什么......我很确定这是一个商业秘密,它会改变每个版本.您永远不会注意到它,如果遇到您怀疑与对象管理相关的性能问题,请提交技术支持的帮助凭单:http://www.mathworks.com/support
| 归档时间: |
|
| 查看次数: |
21530 次 |
| 最近记录: |