memory-management - MATLAB 的垃圾收集器?

标签 memory-management matlab garbage-collection

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

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

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

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

最佳答案

这是我收集的事实 list 。在这种情况下,术语内存(取消)分配 似乎比 GC 更合适。

我的主要信息来源是 Loren 的博客(尤其是它的评论)和 this来自 MATLAB Digest 的文章。

由于其面向可能的大型数据集的数值计算,MATLAB 在优化方面做得非常好 stack objects性能像使用 in-place operations on datacall-by-reference关于函数参数。同样由于它的方向,它的内存模型基本上是 different来自 Java 等 OO 语言。

MATLAB 在版本 7 之前正式没有用户定义的堆内存(在版本 6 中,schema.m 文件中有未记录的reference 功能)。 MATLAB 7 的堆都以 nested functions (closures) and handle objects 的形式存在,它们的实现共享相同的基础。作为附注 OO 可能是 emulated在 MATLAB 中使用闭包(对于 2008a 之前的版本很有趣)。

令人惊讶的是,可以检查函数句柄(闭包)捕获的封闭函数的整个工作区,请参阅函数 functions(fhandle)在 MATLAB 帮助中。这意味着封闭的工作区正在内存中卡住。这就是为什么 cellfun/arrayfun 在嵌套函数中使用时有时会非常慢。

Loren 也有有趣的帖子和 Brad Phelan关于对象清理。

在我看来,关于 MATLAB 中的堆释放最有趣的事实是,MATLAB 会在每次释放堆栈时尝试执行此操作,即在离开每个函数时。这有 advantages但如果堆重新分配很慢,这也是一个巨大的 CPU 损失。在某些情况下,它在 MATLAB 中实际上非常慢!

可以命中代码的 MATLAB 内存释放的性能问题非常糟糕。我总是注意到我无意中在我的代码中引入了一个循环引用,当它突然运行慢了 x20 并且有时在离开函数和返回它的调用者之间需要几秒钟(清理时间)。这是一个已知问题,请参阅 Dave Fotithis older forum post这张图是用什么代码做的可视化性能(测试是在不同的机器上做的,所以不同MATLAB版本的绝对时序比较没有意义):

引用对象池大小的线性增加意味着 MATLAB 性能的多项式(或指数)下降!正如预期的那样,对于值对象,性能是线性的。

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

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

编辑 2:我终于得到了答案 - by Dave Foti himself .他承认存在缺陷,但表示 MATLAB 将保留其目前的确定性清理方法。

图例:执行时间越短越好

R2006a R2008a R2009a

关于memory-management - MATLAB 的垃圾收集器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1446281/

相关文章:

actionscript-3 - 如何在 Action Script 3.0 中回收(垃圾回收) "static const Object"?

objective-c - 非 Mac OS X 平台是否支持 Objective-C 2.0 异常处理?

c# - 内存不足时释放的动态变量?

objective-c - 释放后将对象设置为 nil -- TT_RELEASE_SAFELY

matlab - Matlab如何计算相机视角?

c - matlab中c函数返回值错误

Java 堆转储(hprof 文件)比常驻内存小得多

c++ - QWizard会删除QWizardPage还是会泄露?

memory-management - 如何在 TensorFlow 分析器中获得详细的内存分解?

matlab - 计算与Matlab中三个特定点距离相等的点