MATLAB的垃圾收集器?

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

我有时会看到奇怪的性能瓶颈时使用MATLAB嵌套function,否则无害的代码,我相信这是因为GC。 垃圾收集器是虚拟机的一个重要组成部分,Mathworks并不公开。

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

编辑:第一个回答实际上是元回答“我为什么要在意?”。 我很在乎,因为GC在实现链表或MVC模式时显现出来。

这是我收集的事实清单。 记忆(de)分配这一术语似乎更适合于这种情况。

我的主要信息来源是Loren的博客(特别是其评论)和来自MATLAB Digest的这篇文章。

由于数值计算的方向可能有大量的数据集,因此MATLAB在优化堆栈对象性能方面确实做得很好,例如使用数据的就地操作和函数参数的引用调用。 同样因为它的定位,它的内存模型与Java这样的OO语言根本不同 。

在版本7之前,MATLAB正式没有用户定义的堆内存(在版本6中,在schema.m文件中有未logging的referencefunction)。 MATLAB 7具有嵌套函数(闭包)和处理对象的forms ,它们的实现共享相同的基础。 作为一个侧面说明OO可以用MATLAB中的闭包进行模拟 (对于2008年之前有趣)。

令人惊讶的是,可以检查由函数句柄(闭包)捕获的封闭函数的整个工作空间,参见MATLAB帮助中的函数函数(fhandle) 。 这意味着封闭的工作空间正在被冻结在内存中。 这就是为什么cellfun/arrayfun在嵌套函数中使用时有时非常慢的原因。

还有Loren和Brad Phelan在对象清理方面的有趣post。

在我看来,关于MATLAB中堆释放的最有趣的事实是,每次堆栈被释放时(即离开每个函数),MATLAB都会尝试执行它。 这有好处,但如果堆释放缓慢,也是巨大的CPU惩罚。 在某些情况下,实际上MATLAB非常慢!

可以打码的MATLAB内存释放的性能问题相当糟糕。 我总是注意到,当我的代码突然运行x20时,无意中引入了一个循环引用,有时在离开函数和返callback用者(花在清理上的时间)之间需要几秒钟的时间。 这是一个已知的问题,请参阅Dave Foti和这个较旧的论坛post ,该代码用于使图片可视化性能(testing是在不同的机器上进行的,因此不同MATLAB版本的绝对时序比较是没有意义的):

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

考虑到这些事实,我只能推测,MATLAB使用的还不是非常有效的引用计数forms,用于堆释放。

编辑 :我总是遇到许多小嵌套function的性能问题,但最近我注意到,至less与2006年一个单一的嵌套范围与一些兆字节的数据的清理也是可怕的,只需要1.5秒设置嵌套范围variables为空!

编辑2 :最后我得到了答案 – 由戴夫·福迪自己 。 他承认这个缺陷,但说MATLAB将保留现有的确定性清理方法。

图例:执行时间越短越好

R2006aR2008aR2009a

MATLAB使工作空间在Workspace浏览器或“whos”命令中非常清晰。 这将显示您的命令创build的所有对象以及占用的内存量。

 feature('memstats') 

将向您展示可用于MATLAB的最大的连续内存块,这意味着这是您可以创build的最大的matrix。 使用“清除”命令将同步从内存中删除这些对象,释放空间再次使用。

JVM仅处理Java项目的垃圾回收。 所以,如果你在编辑器中打开一个文件并closures它,Java会从内存中删除窗口和文本等。 如果你在MATLAB工作区中创build一个Java对象,它首先必须被清除,然后它可以被jvm清除。

有很多关于在我们的技术中pipe理程序内存的信息: 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/

如果你对学术感兴趣,当一个函数退出或者当你调整一个variables的时候,分配的内存会发生什么……我敢肯定这是一个商业秘密,它会改变每个版本。 您不应该注意到它,如果遇到您怀疑与对象pipe理网有关的性能问题,请提供技术支持的帮助凭单: http : //www.mathworks.com/support

看来你正在尝试构build某种Python vs MATLAB的参数。 我对这个说法不感兴趣。

对你的元问题的元回答。

实际上你并不在乎,这是相当重要的。 当我这么说的时候,我并不是想把它限制在MATLAB内存pipe理上。 这延伸到Python,Java,.NET和任何其他语言,dynamic内存分配,并仍在积极的发展。

对于当前的内存pipe理机制了解得越多,就越有可能针对特定的实现进行防御编码,越有可能不会从未来的性能改进中受益。 Java的gc能够在developerworks.com上由Brian Goetz写出一些很好的例子。

http://www.ibm.com/developerworks/library/j-jtp01274.html

你可以说知道这很重要。 我反驳说,这一切都是关于要求。 更合适的问题是,为我的项目考虑的语言能否满足我在开发人员的性能,开发工作,可维护性,可移植性,专业知识等方面的需求?

我从来没有见过一个项目,要求使用代数gc超过标记扫描参考计数。 我不期望看到一个。