MATLAB的垃圾收集器?

Mik*_*ail 28 matlab garbage-collection memory-management

你的心理模型是什么?它是如何实现的?它有哪些优点和缺点?MATLAB GC与Python GC

我有时会在使用MATLAB嵌套函数时看到奇怪的性能瓶颈,否则看起来无关紧要,我确信这是因为GC.垃圾收集器是VM的重要组成部分,Mathworks不会将其公开.

我的问题是关于MATLAB自己的和GC!不是关于Java/COM对象的处理/防止"内存不足"错误/堆栈变量的分配.

编辑:第一个回答实际上是元回答"我为什么要关心?".我很关心因为GC在实现链表MVC模式时表现出来.

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在嵌套函数中使用时有时非常慢的原因.

LorenBrad Phelan也有关于对象清理的有趣帖子.

在我看来,MATLAB中关于堆释放的最有趣的事实是,每次堆栈被释放时,MATLAB都会尝试这样做,即在离开每个函数时.这具有优势,但如果堆释放缓慢,则也会造成巨大的CPU损失.在某些情况下,它在MATLAB中实际上非常慢!

可以命中代码的MATLAB内存释放的性能问题非常糟糕.我总是注意到我在代码中无意中引入了循环引用,当它突然运行x20较慢时,有时需要几秒钟才能离开函数并返回其调用者(清理所花费的时间).这是一个众所周知的问题,请参阅Dave Foti这个较旧的论坛帖子,该代码用于使该图像可视化性能(测试在不同的机器上进行,因此不同MATLAB版本的绝对时序比较毫无意义):

参考对象的池大小的线性增加意味着MATLAB性能的多项式(或指数)减少!对于值对象,性能如预期的那样是线性的.

考虑到这些事实,我只能推测MATLAB使用的还不是非常有效的引用计数形式来进行堆释放.

编辑:我总是遇到许多小型嵌套函数的性能问题,但最近我注意到至少在2006a中,使用一些兆字节数据清理单个嵌套作用域也很糟糕,只需将1.5秒的嵌套作用域变量设置为空!

编辑2:最后我得到了答案 - 戴夫福蒂本人.他承认存在缺陷,但表示MATLAB将保留其目前的确定性清理方法.

图例:执行时间越短越好

R2006a R2008a R2009a


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

  • 对不起塞西尔,这个答案不是我的问题的答案.这只是一些与我的问题无关的东西.这个答案看起来很有启发性,但只是故意分散了我所问的问题. (6认同)