AppDomain 中的对象被垃圾收集

Posted

技术标签:

【中文标题】AppDomain 中的对象被垃圾收集【英文标题】:Objects in AppDomain getting Garbage Collected 【发布时间】:2016-04-29 18:47:04 【问题描述】:

我正在尝试在 C# 中实现一个插件框架,其中每个插件都加载到自己的 AppDomain 中。我遇到了AppDomains 之间的远程处理层似乎是垃圾收集我的插件实例的问题。每个插件都继承自这个类:

public class PluginRefObject : MarshalByRefObject
    public override object InitializeLifetimeService() 
        return null;
    

我认为这会给对象一个无限的生命周期。然而,插件似乎工作了一点,然后突然我收到一个带有错误消息的RemotingException

Object 'longhexstring.rem' has been disconnected or does not exist at the server

从谷歌搜索,我相信这意味着 GC 已经删除了我的远程对象。我是否必须做其他事情才能让这个对象保持活力?

【问题讨论】:

可能的答案:***.com/a/6339701/1186321 是的,我看到了那个。链接不好,发布的 .chm 文件无法打开 道歉;我相信这可能会有所帮助:msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx @spectacularbob 我通过右键单击文件打开 .chm 文件,转到属性,然后单击“取消阻止”。在我这样做之前,我可以看到内容,但什么也没有(这很愚蠢,如果文件被阻止,我如何从文件中获取 any 信息?),但在解除阻止之后,我可以读取整个文件。 【参考方案1】:

原来我的插件中抛出了一个异常,导致 AppDomain 被卸载。

不过,这是一个棘手的错误。我的插件注册了TcpChannel,并且有一点我希望通过ChannelServices.UnregisterChannel() 断开TcpChannel。显然,运行该通道的线程仍在运行,并在下次尝试访问该通道时异步抛出 ObjectDisposedException

谷歌搜索后,似乎没有干净的方法可以杀死 TcpChannel,而我发现在另一个 AppDomain 中清理频道的最佳解决方案就是卸载 AppDomain

【讨论】:

以上是关于AppDomain 中的对象被垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集是在进程级别还是 appdomain 级别发生的?

JVM垃圾收集算法(标记-清除复制标记-整理)

java 垃圾收集

Java垃圾回收机制

67.Java垃圾收集机制对象引用垃圾对象的判定垃圾收集算法标记—清除算法标记—整理算法分代收集垃圾收集器性能调优

为啥在执行 Java Stream 终端操作时对象没有被垃圾收集?