[英]Memory Leak with DateTime objects?
我遇到了內存泄漏問題,我相信這是由DateTime對象引起的。 我的代碼正在從客戶端接收一個整數,創建一個DateTime對象,從該對象中生成一個整數,將其與客戶端發送的內容進行比較,然后將該數據發送回去。 當客戶端發送對其ping的請求時,這種情況每1000毫秒發生一次。
客戶端代碼:
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請求之一並將其發送回時,應用程序的總內存開始緩慢增加,並且速度呈指數級增長。
謝謝,任何解決此問題的幫助都將受到贊賞!
該文檔說,關閉客戶端時不會關閉您獲得的流。
根據您的一般處理方式,如果此功能是在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);
}
DateTime對象導致內存泄漏的可能性很小。 通常,如果對象不是Disposable,並且沒有事件訂閱(持久實例),則它不應成為內存泄漏的根本原因。 話雖如此,您確實需要一個適當的工具(例如RedGate Memory Profiler )來分析內存泄漏。
您提供的代碼不足以說明任何有關內存泄漏的信息。 但是,請記住,當您不再需要所有一次性對象時,請務必對其進行處置。 在創建本地一次性對象時使用“使用”,它將在實例超出范圍時對其進行處置。 特別是在使用任何類型的流時,最好的做法是將它們包裝在using子句中。 它將關閉並為您處置 ( 處置時實際上處置會關閉流 )。
所以,是的。 嘗試處置所有一次性物品,然后再次測試。 “ backData”對象對我來說可疑。 確保清除或適當處置它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.