服务端:
    使用Remoting编写了服务端,使用RegisterWellKnownServiceType注册远程类型,使用Singleton模式。
客户端:
    使用Activator.GetObject创建服务代理,使用的是自定义接口(Interface),方法使用自定义的返回类型,有序列化。经测试,多个客户端连接服务端的时候,服务端只对对象调用了构造函数一次,对于Singleton这是正常的。
调用对象的方法的时候正常的返回了自定义的类型,自定义类型能够被GC自动释放(为了测试添加析构函数,析构能被调用)
服务端有对文件进行操作(FileStream)且使用了using:
using (System.IO.FileStream fs = new System.IO.FileStream(...
{
    ....
}但是随着客户端不断的调用,服务端的内存在不停的上涨,几K以上的上涨,可以从十几M上涨到1G以上,好像没有稳下来的意思。感觉能释放的都释放了,GC也能正常调用析构,到底是哪里出问题了?
该怎么办?

解决方案 »

  1.   

    没用过Remoting,直接上WCF的,对于WCF,有个传输模式的设置,Stream或Buffer,不知道这个在Remoting里面有没有,需要对文件进行操作的,一般都要设置为Stream,否则服务端的内存怎么都不够用。
      

  2.   

    远程对象的生命周期和.net普通对象的生命周期是不一样的
      

  3.   

    CSDN上,没有人遇到到过这个问题吗?
      

  4.   

    帮你查了下那个Singleton模式,估计你的问题就是Singleton模式带来的,试试改为SingleCall看看,虽然你处处释放内存,但是你不能保证Remoting本身有对对象的引用,一旦引用存在,GC就不可能释放干净,而SingleCall则不存在该问题,每个请求都是单独的对象实例,过去的请求所创建的实例肯定会释放。另外网上有人批判了Singleton模式,说是速度非常慢,因为那个模式是单线程的,如果多个人同时请求,那么就有可能导致某人的请求要几分钟后才能得到回复。