2015-07-15 4 views
0

У меня возникли проблемы с утечкой памяти, которые, как я полагаю, вызваны объектами DateTime. Мой код получает целое число от клиента, создавая объект DateTime, генерируя целое число из этого объекта, сравнивая его с тем, что отправил клиент, и отправляя эти данные обратно. Это происходит каждые 1000 мс, когда клиент отправляет запрос на его пинг.Утечка памяти с объектами DateTime?

стороне клиента Код:

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); 
} 

Когда сервер получает один из этих запросов звона и отправляет данные назад, общая память приложения медленно начинает увеличиваться и экспоненциально возрастает в скорости. Visual Studio Debugger

Спасибо, любая помощь в решении этого очень ценится!

+0

Список backData = новый Список (); - заявлено выше трех блоков. это байт [], который сокет записывает обратно клиенту. – foxbot

+0

Вы пробовали (как раз для того, чтобы играть хотя бы), чтобы выполнить полный GC? (GC третьего поколения), скажем, каждый 10-й запрос. Идея заключается в том, что в режиме сервера я знаю, что GC ведет себя немного по-другому, а коллекция объектов более расслаблена для получения производительности. –

+5

Почему вы предполагаете, что происходит утечка памяти? GC, возможно, еще не ударил. –

ответ

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); 
} 
+0

Изучив это, утечка памяти все еще происходит, даже если код не выполняется после получения данных от клиента. Я уточню свой вопрос. – foxbot

0

МАЛОВЕРОЯТНЫМ вызывает утечку памяти с помощью объекта DateTime. Как правило, если объект не является одноразовым и не имеет подписки на события (для длительного экземпляра), это не должно быть основной причиной утечки памяти. Сказав, что вам действительно нужен правильный инструмент (например: RedGate Memory Profiler) для анализа утечек памяти.

Код, который вы предоставили, недостаточно, чтобы что-то сказать об утечке памяти. Однако имейте в виду, что вы ДОЛЖНЫ располагать все одноразовые объекты, когда они вам больше не нужны. Используйте «использование», когда вы создаете локальный одноразовый объект, он будет удалять экземпляр, когда он выходит из области действия. Специально, когда вы используете какие-либо потоки, лучше всего обернуть их в разделе использования. Он закроет его и утилизирует для вас (dispose actually closes the stream при утилизации).

Итак, да. Попробуйте удалить все одноразовые предметы и повторите тест. Объект backData выглядит подозрительно для меня. Удостоверьтесь, что вы очистили его или утилизировали соответствующим образом.

Смежные вопросы