我正在编写一个EXE COM服务器,它公开一个锁定系统资源的类。 在正常执行中,客户端释放资源(几秒钟后COM可执行文件关闭。 在异常执行中,客户端应用程序崩溃,使com服务器具有具有正引用计数的实例。 COM可执行文件运行约12分钟,直到终止。这意味着系统资源在此期间被锁定。
有没有办法即时检测客户端终止,如套接字IPC或驱动程序协议?如果不是,那么COM似乎不如其他IPC机制。
答案 0 :(得分:1)
当COM客户端正常终止时, 它释放对它的所有引用 服务器对象。当一个客户 然而,在那里异常终止 可能是杰出的参考 服务器对象。没有垃圾 收集机制,服务器代码 无法知道何时回收 为COM分配的资源 对象,然后可以导致 资源泄漏。解决这个问题 问题,COM实现自动化 垃圾收集机制 COM解析器进程(RPCSS)上 客户端机器ping服务器 机器代表客户端 过程
使用COM的GC的替代方案 协议(例如,使用定期 应用程序级“ping” - 方法 通知对象的调用 客户仍然活着,或使用 潜在的运输机制,如 TCP keepalives)显然很多 效率低下。因此,DCOM的 应使用默认的GC机制 对于必须关闭的任何对象 当他们的客户消失或 否则如果那些对象行为不端 会有效地成为内存泄漏 在服务器上。
服务器计算机上的解析程序 跟踪每个人的ping 服务器对象。 ping期限是2 分钟,目前,它是非 可配置的。当解析器上 服务器机器检测到一个对象 它没有被激活6分钟 假定该对象的所有客户端 已经终止或者没有 更长时间使用该对象。解析器 然后将释放所有外部 对象的引用。它做到了这一点 只需拥有对象的存根 manager(COM运行时代码) 传递对每个对象的呼叫) ::对象的IUnknown上的Release() 接口。此时,对象的 参考计数到目前为止为零 关注COM运行时。 (那里 可能仍然是当地的参考 (同一公寓)客户,所以 对象的内部引用计数可以 不一定在这方面归零 点。)然后对象可以关闭 本身就失望了。
注意:垃圾收集适用于 所有服务器无论是否 他们的客户是本地的或远程的,或 本地和远程的组合。该 底层的ping机制是 在当地的情况不同,因为没有 生成网络数据包,但是 所有实际目的,行为 是一样的。