MATLAB的垃圾收集器?(MATLAB's Garbage Collector?)

2019-07-18 13:00发布

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

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

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

编辑:第一反应居然是元回答“我为什么要在乎?”。 我也不在乎,因为GC执行时常表现为链表或MVC模式。

Answer 1:

这是我收集的事实清单。 相反GC的记忆(DE)的分配似乎是在这种情况下更合适。

我的主要信息来源是罗兰的博客(尤其是其评论)和该文章从MATLAB文摘。

由于其定位与可能的大数据集的数值计算,MATLAB做优化,切实做好栈对象喜欢使用性能数据就地操作和调用,通过引用的函数参数。 其方向也正因为它的内存模型是根本不同的,例如面向对象的语言如Java。

MATLAB有正式没有用户定义的堆存储器中,直到第7版(版本6中有未记录的reference在功能schema.m文件)。 MATLAB 7具有堆无论在形式嵌套函数(封闭)和处理对象 ,其执行共享相同的基础。 作为一个侧面说明OO可以模拟与封闭在MATLAB(有趣的预-2008A)。

令人惊奇的是能够检查由函数手柄(闭合)捕获的封闭函数的整个工作区,见函数函数(fhandle)在MATLAB帮助。 这意味着,工作空间包围在存储器被冻结 。 这就是为什么cellfun/arrayfun嵌套函数中使用时,有时也很慢。

还有一些有趣的帖子罗兰和布拉德·费伦的对象清理。

关于MATLAB堆释放最有趣的事实是,在我看来,那MATLAB尝试每个堆栈被释放,即在离开每个函数的时间去做。 这有优点 ,但也是一个巨大的CPU罚款,如果堆释放是缓慢的。 它实际上是在MATLAB在某些情况下很慢!

能打到代码MATLAB内存释放的性能问题是非常糟糕的。 我一直注意到,我无意中在介绍我的代码循环引用的时候突然运行X20速度较慢,有时需要离开功能并返回到它的调用者(时间花在清理)之间的一些秒。 这是一个已知的问题,看到戴夫福蒂和这位前辈论坛的帖子 ,其代码是用来使这张照片可视化性能(测试在不同的机器制作,不同的MATLAB版本,所以绝对定时的比较是没有意义的):

参考对象池大小的线性增长意味着MATLAB性能多项式(或指数)下降! 对于值的对象的表现是,如所预期的,直链。

考虑到这些因素,我只能猜测,MATLAB的使用尚未对堆释放引用计数的非常有效的形式。

编辑 :我总是遇到性能问题有许多小嵌套函数,但最近我注意到,至少在2006年a与数据的一些兆字节的单一嵌套范围的清理也是可怕的,它需要1.5秒的时间来设置嵌套的范围变空!

编辑2:我终于得到了答案- 由戴维·福蒂自己 。 他承认缺陷,但说MATLAB是要保持其目前确定的清理方法。

注:短执行时间是更好



Answer 2:

MATLAB使工作区在工作区浏览器或与“卫生组织”命令很清楚。 这说明你在你的命令和多少内存,他们采取了创建的所有对象。

feature('memstats')

将显示您的可用内存MATLAB的最大连续块,这意味着是你可以创造最大的矩阵。 使用“清除”命令将同步从内存中删除这些对象,并释放被再次使用的空间。

在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/

如果你有兴趣的学术会发生什么,当一个函数退出或分配的内存,当你调整变量...我敢肯定,这是一个商业秘密,它改变了每一个版本。 你应该不会注意到它,如果你遇到,你怀疑反对managmenet相关的性能问题,请提交帮助票与技术支持: http://www.mathworks.com/support



Answer 3:

好像你正在试图建立某种形式的Python VS MATLAB的说法。 我没有这样的说法有兴趣。

荟萃回答你的元问题。

它实际上是相当重要的,你不关心。 当我说,我的意思并不是将其限制在MATLAB的内存管理。 这扩展到Python,Java和.NET并进行动态内存分配,并且仍在积极开发其他语言。

你越了解内存管理的现有机制,就越有可能你会防守针对具体实现代码,越有可能成为你不会从未来业绩的改善中获益。 许多就是很好的例子可以在Java的GC找到干练写上去Brian Goetz撰写了在developerworks.com:

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

你可以说这是需要了解的重要。 我反驳说,它的所有有关要求。 更合适的问题是,我正在考虑的语言为我的项目满足我的需求在性能,开发难度,可维护性,可移植性,我的专业开发商,等等,等等条件?

我从来没有见过,使用过大关横扫裁判计数代GC的要求的项目。 我不希望看到一个很快。



文章来源: MATLAB's Garbage Collector?