繁体   English   中英

具有客户端激活对象的应用程序域中 static 对象的远程生命周期

[英]Remoting lifetime for static objects in app domain with client activated objects

我很好奇 AppDomain 中的共享/静态 object 生命周期,其中 RemotingCalls 是创建共享对象的原因。

我们正在使用使用客户端激活对象的远程处理设置,我们仅使用这些功能来访问服务器。 远程对象设置为单例。

服务器设置通道并使用 RemotingConfiguration.Configure 加载配置文件。

其中一些服务器函数在服务器上接触并使用一些 static(在 vb.net 中共享)变量。 我不知道这些 static 变量的生命周期是多少,它们在第一次被触摸时被创建(运行静态构造函数)。 使用日志记录我看不到对象 dispose/finalize 发生。

在连接到远程服务器后等待几分钟,可以看到共享对象仍然存在并且运行良好。

问题:

那么在这个远程设置中 static 对象的预期生存时间是多少。 它们是否与 AppDomain 一样长,或者当 Remoting 对象被交换时它们是否会被循环出去。 如果需要,延长其使用寿命的正确方法是什么?

答案:

Static 类型在 AppDomain 中存在,因为他们第一次访问直到 AppDomain 被卸载。 因此,只要 AppDomain 正在运行,您就不需要延长它们的生命周期。

直到租约到期后,远程处理对象才会被垃圾收集 - 租约保护它们免受 GC,因为没有明显可见的对它们的引用。 默认租用期为 5 分钟,垃圾收集器可能会在另外几分钟内运行(取决于负载、memory 使用情况等),然后对 object 的最后引用应该消失了。 只有在这一切发生之后,才应该在下一次GC 运行时收集一个实例 object。 然而,Static 对象根本不会被垃圾回收。

至于问题的第二部分,延长寿命的正确方法称为“赞助”——基本上当租约到期时,服务器会询问客户端是否有人愿意继续使用这个 object。 这里有一篇关于这个主题的非常详细的文章。 不要只是将生命周期设置为无穷大。

Static 字段永远不会被垃圾收集。 看看Jeffrey Richter 的文章
Static 字段被垃圾收集器视为根,因此垃圾收集器将始终假定使用 static 字段。

Static 字段在加载所有者类型时初始化。 JIT 编译器在需要构建方法并看到对该类型的引用时加载类型。 加载后,该类型会在所有 AppDomain 生命周期内保持不变,因此属于该类型的字段(静态字段)引用的任何内容都将被视为已使用的引用,不会被垃圾回收。

此外,关于此声明:

我不知道这些 static 变量的生命周期是多少,它们在第一次被触摸时被创建(运行静态构造函数)。

从技术上讲,static 构造函数中的 static 变量不一定第一次被“触及”。 像这样考虑 class :

public static class Test
{
    private static MyType myType;

    static Test()
    {
        myType = new MyType();
    }
}

Static 构造函数(类型构造函数)将永远不会被调用,除非您有执行和引用此类型的代码,例如var x = Test.myType; . 好吧,这可能取决于“触摸”的确切含义。

答案:

Static 类型在 AppDomain 中存在,因为他们第一次访问直到 AppDomain 被卸载。 因此,只要 AppDomain 正在运行,您就不需要延长它们的生命周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM