内存泄漏与DateTime对象?

时间:2015-07-15 06:04:02

标签: c# .net memory-leaks

我遇到内存泄漏问题,我认为是由DateTime对象引起的。我的代码从客户端接收一个整数,创建一个DateTime对象,从该对象生成一个整数,将其与客户端发送的对象进行比较,然后将该数据发回。这种情况每1000毫秒发生一次,当客户端发送请求ping时。

客户端代码:

private void sendPingRequest()
{
    List<byte> payloadData = new List<byte>();
    DateTime now = DateTime.UtcNow;
    int seconds = now.Second;
    int ms = now.Millisecond;
    int totalMs = (1000 * seconds) + ms;
    payloadData.AddRange(BitConverter.GetBytes((short)26));
    payloadData.AddRange(BitConverter.GetBytes(4));
    payloadData.AddRange(BitConverter.GetBytes(totalMs));
    client.GetStream().Write(payloadData.ToArray(), 0, payloadData.Count);
    return;
}

服务器端代码:(在tcplistener读取所有数据之后)

private void handlePing(byte[] data, TcpClient sender)
{
    int pingRequest = BitConverter.ToInt32(data, 0);
    DateTime now = DateTime.UtcNow;
    int seconds = now.Second;
    int ms = now.Millisecond;
    int realMs = (1000 * seconds) + ms;
    int diff = realMs - pingRequest;
    List<byte> backData = new List<byte>();
    backData.AddRange(BitConverter.GetBytes((short)27));
    backData.AddRange(BitConverter.GetBytes(4));
    backData.AddRange(BitConverter.GetBytes(diff));
    sender.GetStream().Write(backData.ToArray(), 0, backData.ToArray().Length);
}

当服务器收到其中一个ping请求并重新发送数据时,应用程序的总内存会慢慢开始增加,并且速度会呈指数级增长。 Visual Studio Debugger

谢谢,任何解决此问题的帮助都非常感谢!

2 个答案:

答案 0 :(得分:2)

documentation表示关闭客户端时,您获得的流不会被关闭。

根据您的一般处理,如果此函数是在TcpClient流上运行的唯一函数,您应该关闭它。甚至可以使用using块:

var stream = sender.GetStream();
stream.Write(backData.ToArray(), 0, backData.ToArray().Length);
stream.Close();

using(var stream = sender.GetStream())
{
    stream.Write(backData.ToArray(), 0, backData.ToArray().Length);
}

答案 1 :(得分:0)

DateTime对象导致内存泄漏的可能性极小。通常,如果一个对象不是Disposable并且没有事件订阅(对于一个持久的实例),它不应该是内存泄漏的根本原因。说过你真的需要一个合适的工具(例如:RedGate Memory Profiler)来分析内存泄漏。

您提供的代码不足以说明内存泄漏。但是,请记住,当您不再需要时,必须处理所有Disposable对象。使用&#39;使用&#39;当您创建本地一次性对象时,它将在实例超出范围时处置该实例。特别是当您使用任何类型的流时,最好将它们包含在using子句中。它将关闭它并为您处理(处置时dispose actually closes the stream)。

所以,是的。尝试处理所有一次性物品并再次测试。 &#39; backData&#39;对象看起来很可疑。确保清理或妥善处理。