我遇到内存泄漏问题,我认为是由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请求并重新发送数据时,应用程序的总内存会慢慢开始增加,并且速度会呈指数级增长。
谢谢,任何解决此问题的帮助都非常感谢!
答案 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;对象看起来很可疑。确保清理或妥善处理。