Cocoa 分布式对象、GC 客户端、非 GC 服务器

Posted

技术标签:

【中文标题】Cocoa 分布式对象、GC 客户端、非 GC 服务器【英文标题】:Cocoa Distributed Objects, GC client, non-GC server 【发布时间】:2008-10-14 14:32:22 【问题描述】:

我有一个设置,其中有两个 Cocoa 进程,与分布式对象 (DO) 通信。客户端正在使用垃圾收集,服务器没有。

似乎客户端挂在我直接引用它们之外的远处对象上。这意味着即使在我没有对对象的引用之后,它们也会被 NSDistantObjectTableEntry 拥有。显然它们不会在服务器上被释放。

只有当客户端退出时,它才会放开所有远处的对象。手动断开连接可能也可以,但我不想在客户端运行时这样做。

有没有办法告诉 GC'd DO 客户端放弃不再在本地引用的远程对象?

【问题讨论】:

客户端是应用程序还是命令行工具? 有趣的是,我今天发现了一个非常相似的问题,只是在我的情况下,双方都没有使用 GC(我将其关闭以确保它不是导致错误的原因)。查看我的问题 (***.com/questions/2521514/…) 和我在此处发布的示例。就像你说的,手动断开连接是可行的,但这似乎不对。那么,DO 的工作方式是否存在我们从根本上遗漏的东西? 【参考方案1】:

可能存在跨越客户端和服务器的保留周期 - 即客户端对象保留服务器对象的代理,而服务器对象又保留客户端对象的代理。

这是一个非常简单的保留循环示例,当涉及两个以上的对象时,诊断变得更加复杂。

请参阅The Subtle Dangers Of Distributed Objects,了解其他与 DO 相关的问题。

【讨论】:

以上是关于Cocoa 分布式对象、GC 客户端、非 GC 服务器的主要内容,如果未能解决你的问题,请参考以下文章

避免、发现和消除 Cocoa 中的内存泄漏

Conservative GC (Part one)

GC标记-清除算法(Mark Sweep GC)

彻底理解对象内存分配及Minor GC和Full GC全过程

5.GC是什么时候触发的

JAVA的GC(GarbageCollection)机制