【问题标题】:MATLAB weak references to handle class objectsMATLAB 弱引用处理类对象
【发布时间】:2011-05-26 16:23:23
【问题描述】:

在考虑 MATLAB 中基于句柄类的 ORM 的可能性时,缓存实例的问题出现了。我无法立即想到一种方法来制作弱引用或弱映射,尽管我猜测事件监听器可能会设计一些东西。有任何想法吗?

更多信息

在 MATLAB 中,句柄类(与值类相对)具有引用语义。 MATLAB 包含的一个示例是 containers.Map 类。如果您实例化一个并将其传递给函数,则该函数对对象所做的任何修改都将通过原始引用可见。也就是说,它的工作方式类似于 Java 或 Python 对象引用。

与 Java 和 Python 一样,MATLAB 以一种或另一种方式跟踪有多少事物正在引用句柄类的每个对象。当不再有对象时,MATLAB 知道删除该对象是安全的。

弱引用是指引用对象但不计为垃圾收集目的的引用。因此,如果对对象的唯一剩余引用很弱,则可以将其丢弃。通常可以为弱引用提供事件或回调 - 当对象被丢弃时,将通知对其的弱引用,从而允许运行清理代码。

例如,弱值映射类似于法线映射,不同之处在于值(与键相反)是作为弱引用实现的。弱映射类可以在每个弱引用上安排回调或事件,以便在删除引用的对象时,删除映射中的键/值条目,保持映射整洁。

【问题讨论】:

  • 非常好的问题,但在我看来太高级了,即使对于 MATLAB 高级用户也是如此。你必须解释什么是 ORM 和弱听者,否则人们会有奇怪的理论(比如这里mathforum.org/kb/…
  • @Mikhail - ORM 概念与问题并不真正相关,但我至少会解释一下弱引用。
  • 至少 Java,如果我没记错的话,有 3 种周引用 - 弱、软和幻影。你更喜欢哪一个?
  • @Mikhail,就我的目的而言,弱就足够了,但软会更有用。不过,查询 MATLAB 的内存管理器似乎不太可能(memory 命令在我的平台上什至不可用),所以我的目标是弱。
  • 我认为你应该在mathworks.com/matlabcentral/newsreader 上反映这个问题,MathWorks 的人更有可能会注意到它。我想只有他们能回答。

标签: matlab memory-management garbage-collection weak-references


【解决方案1】:

这些特殊的引用类型实际上是语言级别的功能,需要 VM 和 GC 来完成。尝试在用户代码中实现它可能会以泪水告终,尤其是当您依赖未记录的行为时。 (很抱歉成为泥泞中的一员。)

有几种方法可以做类似的事情。这些只是想法,而不是认可;我实际上没有做过。

也许您可以使用嵌入在 Matlab 中的 JVM 中的真实 Java 弱引用映射来缓存昂贵的计算结果,而不是缓存 Matlab 对象实例本身。如果您可以相对快速地将 Matlab 值与 Java 相互转换,这可能是一个胜利。如果是相对平坦的数值数据,像 double[] 或 double[][] 这样的原语使用 Matlab 的隐式转换可以快速转换。

或者您可以在 Matlab 级别中创建一个常规的 LRU 对象缓存(可能使用由哈希码键控的容器。映射),在添加新对象时显式删除其中的对象。直接使用它,或者向您的对象添加 onCleanup() 行为,让它们自动将自己的副本添加到固定大小的全局“最近删除的对象”LRU缓存,由外部有意义的 id 键入,并将实例标记为缓存,因此您的 onCleanup() 方法在由于缓存过期而被删除时不会尝试重新添加它们。然后,您可以使用工厂方法或其他查找方法从缓存中“复活”实例,而不是以昂贵的方式构建全新的实例。不过,这听起来像是很多工作,而且真的不是惯用的 Matlab。

【讨论】:

  • 我同意使用无证行为。我确实尝试使用(未记录的)JMI 将句柄对象舀到 Java 引用中,但它的析构函数在这种情况下无法可靠地执行。
  • 哦,我确实已经为其他东西设置了 LRU,但是这个特殊问题的特征表明存在弱引用缓存。我只是想知道弱引用是否可能。
【解决方案2】:

这不是你的问题的答案,而只是我的 2 美分。

弱引用是垃圾收集器的一个特性。在 Java 和 .NET 中,当内存压力很大时会调用垃圾收集器,因此是不确定的。

This MATLAB Digest post 表示 MATLAB 没有使用(不确定的)垃圾收集器。在 MATLAB 中,每次堆栈弹出时(即离开每个函数时)都会从内存中(确定性地)删除引用。

因此,我认为弱引用不属于 MATLAB 引用处理概念。但是 MATLAB 一直有大量未记录的特性,所以我不能排除它被埋在某个地方。

this SO post 中,我询问了 MATLAB 垃圾收集器的实现,但没有得到真正的答案。一位 MathWorks 成员没有回答我的问题,而是指责我试图构建 Python 与 MATLAB 的论点。另一位 MathWorks 成员写了一些看起来合理但实质上是聪明的欺骗 - 有目的地分散我所询问的问题的注意力。最好的答案是:

如果你问这个问题,那么 MATLAB 不是适合您的语言!

【讨论】:

  • 这听起来像是我与 MathWorks 员工的典型互动 - 他们要么不理解问题,要么告诉我这是不可能的。
  • 哦,CPython 通过引用计数进行确定性删除,并且它们具有弱引用,所以我认为如果他们关心的话,MathWorks 可以实现它。 (当然,CPython 也有 GC,但那是为了杀死循环)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多