Memory management MATLAB';谁是垃圾收集器?

Memory management MATLAB';谁是垃圾收集器?,memory-management,matlab,garbage-collection,Memory Management,Matlab,Garbage Collection,你的思维模式是什么?它是如何实施的?它有哪些优势和劣势?MatlabGC与Python GC 有时,当我在看似无害的代码中使用MATLAB嵌套函数时,我会看到奇怪的性能瓶颈,我确信这是因为GC。垃圾收集器是VM的重要组成部分,Mathworks不会将其公开 我的问题是关于MATLAB自己的堆和GC!不是关于Java/COM对象的处理/防止“内存不足”错误/堆栈变量的分配 编辑:第一个回答实际上是元答案“我为什么应该关心?”。我很在意,因为GC在实现或模式时会表现出来。MATLAB在工作区浏览器中

你的思维模式是什么?它是如何实施的?它有哪些优势和劣势?MatlabGC与Python GC

有时,当我在看似无害的代码中使用MATLAB嵌套函数时,我会看到奇怪的性能瓶颈,我确信这是因为GC。垃圾收集器是VM的重要组成部分,Mathworks不会将其公开

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


编辑:第一个回答实际上是元答案“我为什么应该关心?”。我很在意,因为GC在实现或模式时会表现出来。

MATLAB在工作区浏览器中或使用“whos”命令使工作区非常清晰。这将显示由命令创建的所有对象以及它们占用的内存量

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

JVM只处理Java项的垃圾收集。因此,如果在编辑器中打开并关闭一个文件,Java将负责从内存中删除窗口和文本等。如果在MATLAB工作区中创建Java对象,首先必须清除它,然后jvm才能清除它

我们的技术说明中有很多关于管理程序内存的信息:

我最近在MATLAB桌面博客上写了关于处理Java内存的文章:


如果你在学术上感兴趣,当一个函数退出或者当你调整一个变量的大小时,分配的内存会发生什么…我很确定这是一个商业秘密,它会在每个版本中改变。您永远不会注意到这一点,如果您遇到了怀疑与对象managmenet相关的性能问题,请向技术支持部门提交一份帮助通知单:

您似乎在尝试构造某种Python vs MATLAB参数。我对那个论点不感兴趣

元问题的元答案

其实你不在乎是相当重要的。当我这么说的时候,我并不想把它局限于MATLAB内存管理。这扩展到Python、Java、.NET和任何其他执行动态内存分配的语言,并且仍在积极开发中

您对当前的内存管理机制了解得越多,就越有可能编写针对特定实现的防御代码,就越有可能无法从未来的性能改进中获益。Brian Goetz在developerworks.com上写的Java的gc中可以找到许多很好的例子:

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


我从未见过一个项目需要使用分代gc over mark sweep over ref counting。我不希望很快看到。这是我收集的事实清单。在这种情况下,术语记忆(de)分配似乎比GC更合适

我的主要信息来源是Loren的博客(特别是它的评论)和MatlabDigest的文章

由于其面向可能的大数据集的数值计算,MATLAB在优化性能(如使用函数参数和函数参数)方面做得非常好。此外,由于其方向性,其内存模型基本上来自Java等OO语言

MATLAB在版本7之前没有用户定义的堆内存(在版本6中,
schema.m
文件中有未记录的
reference
功能)。Matlab7以堆的形式提供了这两者,它们的实现共享相同的基础。作为旁注,OO可以在MATLAB中使用闭包(对于2008a之前的版本很有趣)

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

还有一些关于对象清理的有趣文章

在我看来,MATLAB中关于堆释放的最有趣的事实是,MATLAB在每次释放堆栈时都会尝试这样做,即在离开每个函数时。如果堆释放速度慢,这将带来巨大的CPU损失。在某些情况下,它在MATLAB中的速度非常慢

MATLAB内存释放的性能问题可能会命中代码,这是非常糟糕的。我总是注意到,我无意中在代码中引入了一个循环引用,因为它突然运行得慢了x20,有时在离开函数和返回调用方之间需要几秒钟(清理时间)。这是一个已知的问题,请参阅,以及使用哪种代码使该图片具有可视化性能(在不同的机器上进行测试,因此不同MATLAB版本的绝对计时比较毫无意义):

参考对象池大小的线性增加意味着MATLAB性能的多项式(或指数)下降!对于值对象,性能与预期一样是线性的

考虑到这些事实,我只能推测MATLAB在堆释放中使用了尚未非常有效的引用计数形式

编辑:我经常遇到许多小型嵌套函数的性能问题,但最近我注意到,至少在2006a中,清理包含数兆数据的单个嵌套作用域也很糟糕,只需1.5秒即可设置