小弟写了一C# 多线程socket服务器,运行一段时间以后,物理内存只有几十M,而虚拟内存高达几百M,最终程序会崩溃。小弟百思不得其解,求各位高手解惑。
程序使用几个全局的ArrayList存储用户数据,并一直在写本地硬盘的txt文件作为log。写LOG操作以后,System.IO.StreamWriter对象我是关闭了的。另数据库入库调用的DLL组件后,System.Data.SqlClient.SqlConnection对象也关闭了的。
代码太长,无法帖出来,请见谅。
如果分不够,问题解决了还可以再加。

解决方案 »

  1.   

    ArrayList存储的内容太大了?只跟据提供的信息看不出什么问题,可能是你的程序有使用到很多非托管的资源而没有释放。
      

  2.   

    目前只有几百个用户,内用不会太大吧。程序物理内存最大也只有100多M,然后会自己回收到几十M。但是虚拟内存回收不了。
    请问具体哪些资源数据非托管资源呢?又如何回收?有资料或者简单的例子都行,我是新手学习中,对C#的理解很不深刻。谢谢关注。
      

  3.   

    查了一些资料,得知
    System.IO.StreamWriter
    System.Data.SqlClient.SqlConnection
    都是非托管资源,这些对象使用后,只执行了对象自带的close() 操作有问题吗?
    socket 使用后,执行了 shutdown () 和 close ()操作
      

  4.   

    物理内存占用不大虚拟内存占用很大的原因是Cache命中率很低...也就是说你常驻内存的数据变动很频繁...看看那几个全局的ArrayList...优化一下...
      

  5.   

    我怎么看糊涂了。通常程序没法管理物理内存和虚拟内存。C#就更不行了。物理内存和虚拟内存是操作系统管理的,应该是物理内存不够了,才会交换到硬盘上的虚拟内存。
    怎么听lz的意思好像是物理内存没怎么使用了。lz,你是如何判断出物理内存使用少,而虚拟内存使用多的呢?
      

  6.   

    能指点下思路吗?如何优化呢?我的ArrayList的数据确实变动比较频繁。
      

  7.   

    to vrhero :
    是不是定时执行这个:
    Arraylist1//全局变量存储
    private void ClearMemory()
    {
      try{
        ArrayList ArrayList2=new ArrayList(); 
        lock(Arraylist1)
        {
            for (int i=0;i<ArrayList1.Count;++i)
               {
                  ArrayList2.add(ArrayList1[i]);
               }
            ArrayList1.clear();
             for (int i=0;i<ArrayList2.Count;++i)
               {
                  ArrayList1.add(ArrayList2[i]);
               }
            ArrayList2.clear();    }
      }
      catch()
        {
        }}
      

  8.   

    那就是有泄漏了。不过C#有自己的垃圾收集机制,因此比较大的可能性是,你的全局变量,尤其是数组,原来越大。我们单位原来有个程序使用enterprise library就有这个问题,写的时候没注意,最后根本没法解决。