Как отладить потенциальную утечку памяти? - PullRequest
4 голосов
/ 15 декабря 2011

Я запрограммировал службу Windows для выполнения рутинной работы.

Я InstallUtil это служба Windows, и она проснется и что-то сделает, а затем thread.sleep(5min)

Кодэто просто, но я заметил потенциальную утечку памяти.Я проследил это с помощью DOS tasklist и нарисовал диаграмму: enter image description here

Могу ли я сказать, что довольно ясно, что была утечка памяти, хотя и такая небольшая.Помоги мне найти потенциальную утечку.Спасибо.

    public partial class AutoReport : ServiceBase
    {
        int Time = Convert.ToInt32(AppSettings["Time"].ToString());
        private Utilities.RequestHelper requestHelper = new RequestHelper();

        public AutoReport()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Thread thread = new Thread(new ParameterizedThreadStart(DoWork));
            thread.Start();
        }

        protected override void OnStop()
        {
        }

        public void DoWork(object data)
        {
            while (true)
            {
                string jsonOutStr = requestHelper.PostDataToUrl("{\"KeyString\":\"somestring\"}", "http://myurl.ashx");
                Thread.Sleep(Time);
            }
        }
    }

Редактировать: после использования WinDbg @Russell предложил.Что мне делать с этими классами?

MT  Count   TotalSize   ClassName
79330b24    1529    123096  System.String
793042f4    471 41952   System.Object[]
79332b54    337 8088    System.Collections.ArrayList
79333594    211 70600   System.Byte[]
79331ca4    199 3980    System.RuntimeType
7a5e9ea4    159 2544    System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
79333274    143 30888   System.Collections.Hashtable+bucket[]
79333178    142 7952    System.Collections.Hashtable
79331754    121 57208   System.Char[]
7a5d8120    100 4000    System.Net.LazyAsyncResult
00d522e4    95  5320    System.Configuration.FactoryRecord
00d54d60    76  3952    System.Configuration.ConfigurationProperty
7a5df92c    74  2664    System.Net.CoreResponseData
7a5d8060    74  5032    System.Net.WebHeaderCollection
79332d70    73  876 System.Int32
79330c60    73  1460    System.Text.StringBuilder
79332e4c    72  2016    System.Collections.ArrayList+ArrayListEnumeratorSimple
7.93E+09    69  1380    Microsoft.Win32.SafeHandles.SafeTokenHandle
7a5e0d0c    53  1060    System.Net.HeaderInfo
7a5e4444    53  2120    System.Net.TimerThread+TimerNode
79330740    52  624 System.Object
7a5df1d0    50  2000    System.Net.AuthenticationState
7a5e031c    50  5800    System.Net.ConnectStream
7aa46f78    49  588 System.Net.ConnectStreamContext
793180f4    48  960 System.IntPtr[]

Ответы [ 4 ]

5 голосов
/ 15 декабря 2011

Вот как я могу найти утечку памяти:

1) Загрузите WinDbg , если у вас ее еще нет.Это действительно мощный (хотя и сложный в использовании) отладчик.

2) Запустите WinDbg и присоедините его к своему процессу, нажав F6 и выбрав свой exe.

3)присоединенный введите эти команды: (сопровождаемый вводом)

// это загрузит управляемые расширения

.loadby sos clr

// это выведет детали всех ваших объектовв куче

!dumpheap -stat

// это снова запустит службу

g

Теперь подождите несколько минут и нажмите Ctrl +Перерыв, чтобы сломать обратно в сервис.Снова введите команду !Dumpheap -stat, чтобы узнать, что сейчас находится в куче.Если у вас есть утечка памяти (в управляемом коде), то вы увидите, что один или несколько ваших классов со временем будут добавляться в кучу.Теперь вы знаете, что хранится в памяти, чтобы вы знали, где искать проблему в вашем коде.Вы можете определить, что содержит ссылки на объекты, просочившиеся из WinDbg, если хотите, но это сложный процесс.Если вы решите использовать WinDbg, то, возможно, вы захотите начать с чтения блога Тесс и выполнения labs .

.
1 голос
/ 15 декабря 2011

вам понадобится Allocation Profiler для обнаружения утечек памяти, для этого есть хороший профилировщик, я могу порекомендовать AQTime ( посмотреть это видео )

И читать: Как обнаружить утечки памяти с помощью Allocation Profiler

Maby эта статья тоже может быть полезна

0 голосов
/ 15 декабря 2011

Трудно сказать, но я подозреваю, что эта строка в вашем цикле while в DoWork:

JsonIn jsonIn = new JsonIn { KeyString = "secretekeystring", };

Хотя jsonin имеет только область действия в блоке while, я бы рискнул, что сборщик мусора примет еговремя, чтобы удалить нежелательные экземпляры.

0 голосов
/ 15 декабря 2011

Чтобы обнаружить утечку памяти, вы должны посмотреть на счетчики производительности в течение длительного периода времени. Если вы видите количество дескрипторов или общее количество байтов во всей куче, растущее без уменьшения, у вас есть реальная утечка памяти. Затем вы можете использовать, например, инструменты профилирования в Visual Studio для отслеживания утечки. Есть также инструмент от redgate , который работает довольно хорошо.

...