2016-05-31 2 views
1

У меня есть долговременное приложение, которое последовательно выходит из строя из-за утечки памяти.Связаны ли ссылки со статическими свойствами с утечками памяти

Я подозреваю, что причиной этого может быть использование статических свойств. Вот пример того, что я сегодня:

public class StaticReferences 
{ 
    public static readonly object Fixed1 = new object(); 
} 

public class ShortLived 
{ 
    public object Object1; 
} 

public class Doer // This class is instantiated once 
{ 
    public void DoStuff() // This method is called over and over again. 
    { 
     var shortLived = new ShortLived() 
     { 
      Object1 = StaticReferences.Fixed1 
     }; 
    } 
} 

Будет ли экземпляр ShortLived с его ссылкой на StaticReferences.Fixed1 (через ShortLived.Object1 собственности) получить правильно мусора, как только он выходит за рамки?

+4

Что заставляет вас думать, что есть утечка памяти? –

+0

Это консольное приложение, которое запускает процесс, который занимает пару часов. Он выходит из строя с исключением из памяти. Я провел его через Jetbrains DotMemory. Неуправляемое пространство памяти продолжает расти. Управляемый памятник является стабильным. –

+3

@JakobGade Что делает ваша программа, которая требует неуправляемой памяти? Эта часть реализована вами или сторонним компонентом? Как обрабатывается неуправляемая память? – xxbbcc

ответ

4

Нет, просто ссылка на глобальные статические свойства не создаст утечки памяти. Пример, который вы опубликовали, в порядке. shortLived будет очищен после завершения его действия и ссылка на Fixed1 будет очищена, когда ваша программа выйдет. Ваша проблема очень вероятна в другом месте, но на вашем простом примере невозможно сказать. У вас есть доказательства того, что вы ищете утечку памяти?

Я предлагаю вам использовать профилировщик памяти или получить полный дамп памяти и проанализировать его (WinDbg свободен, но есть и другие, более простые в использовании, но инструменты оплаты). Еще один инструмент, который вы можете попробовать использовать: DebugDiag от Microsoft (также бесплатно) - получить дамп, а затем запустить его через DebugDiag, чтобы получить отчет о памяти.

Как @EricJ, упомянутый в его комментарии, профилировщик в Visual Studio 2015 также является отличным инструментом для анализа использования памяти и доступен во всех выпусках, включая бесплатный Community Edition.

+1

Профилировщик памяти в VS2015 отлично работает и доступен даже в издании сообщества https://blogs.msdn.microsoft.com/visualstudioalm/2015/07/20/performance-and-diagnostic-tools-in-visual-studio -2015/ –

+0

@ EricJ. Спасибо, я обновлю свой ответ и включу это, если вы не возражаете. – xxbbcc

+0

Конечно, всегда полезно поддерживать ваш ответ как можно более полным и полезным. –

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