【问题标题】:How do I properly dispose the byte array used in the class?如何正确处理类中使用的字节数组?
【发布时间】:2012-10-23 15:14:16
【问题描述】:

我有一个 StateObject 类,用于存储来自客户端和服务器的数据。

代码如下:

 public class StateObject : IDisposable 
    {
        public StateObject()
        {

        }

        public String serviceName = ConfigurationManager.AppSettings["ServiceName"].ToString().Trim();  //Holds the service name 
        public Socket clientSocket; //socket for communication with the client

        public int id; //client id  (A running sequence to keep track of StateObjects)

        public string leaseId; //holds the leaseId that is used to communicate with the server

        public bool isLeaseIdValid = false;

        public string requestQuery = string.Empty;

        public IPEndPoint serverEP;

        public Socket serverSocket; //Socket for communication with the server

        public static int BUFFER_SIZE = Convert.ToInt32(ConfigurationManager.AppSettings["BufferSize"].ToString().Trim());  //Get the buffer size from the state object

        public byte[] clientReadBuffer = new byte[BUFFER_SIZE];   // Receive clientReadBuffer.
        public byte[] serverReadBuffer = new byte[BUFFER_SIZE];

        public int clientNumBytes;
        public byte[] clientSendBuffer = new byte[BUFFER_SIZE];
        public int serverNumBytes;
        public byte[] serverSendBuffer = new byte[BUFFER_SIZE];

        public bool isShutdown = false;

        public Socket serverSocketPort80; //Socket for communication with the server

        public bool ConnectedToPort80 = false; //initially set to false

        public ConnectionObject connectionObject;

        #region Dispose implementation

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                connectionObject.Dispose();
            }
        }

        ~StateObject()
        {
            Dispose(false);
        }

        #endregion
    }

如何正确处理此类并清除字节数组使用的内存?字节数组用于在套接字通信中存储发送/接收的消息。

【问题讨论】:

    标签: c# .net sockets memory-leaks


    【解决方案1】:

    你只需要释放非托管内存。

    在这种情况下,您似乎唯一需要处理的是 Socket 和可能的 ConnectionObject,不管是什么。

    换句话说,释放该类创建的任何IDisposable 实例。

    一旦该对象超出范围,垃圾收集器将处理字节数组。

    【讨论】:

    • 另外,这个类实际上并没有分配Socket 引用,所以这个类不需要 Dispose 或 Destructor。
    • @Tejs,对,代码并没有完全显示套接字的来源。如果是从外面传进来的,就不应该放在这里。
    • @DrewNoakes 如果我不能为 GC 使用 w8,或者字节数组真的很长(2GB 长)怎么办?!?我需要尽快解决!!!
    • @Leonardo,字节数组是托管的。如果您已经删除了对它的所有引用,您可以调用GC.Collect(),但不能保证执行收集。从 .NET 4.5.1 开始,您还可以通过在调用 Collect 之前设置 GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce 来请求压缩大对象堆。
    【解决方案2】:

    您没有(如@DrewNoakes 回答中所述)。如果您将此特定代码部分标识为对象创建/内存分配热点,请考虑创建一个字节数组池,您可以从中租用已分配的数组。通常我会尝试使用服务器软件来执行此操作,因此内存使用量存在某种上限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多