. NET CLR Счетчики производительности памяти всегда показывают 0 - PullRequest
0 голосов
/ 31 января 2020

Я решил поиграть со счетчиками производительности в контексте сбора мусора. Поэтому я написал этот код:

 class Program
    {
        class MyInt
        {
            public MyInt(int value) => Value = value;

            public int Value { get; }
        }


        public static void Main()
        {
            const int cycles = 200000;
            var listSOH = new List<MyInt>();
            var lstLOH = new List<int>(cycles);

            for (int i = 0; i < cycles; i++)
            {
                listSOH.Add(new MyInt(i));
                lstLOH.Add(i);
                Thread.Sleep(1);
                Console.Write(".");
            }

            Console.WriteLine("Finished");
            Console.ReadKey();
        }
    }

Код заполняет два списка памятью. Поскольку я инициализирую listLOH с 200000 записей, он должен находиться в куче больших объектов сборщика мусора ( MSDN упоминает его для объектов размером более 85000 байт). С другим списком listSOH я хотел бы посмотреть, что происходит с генерацией кучи малых объектов.

Если я проверяю производительность - \.NET CLR Memory(HelloWorld_Net_Framework)\Large Object Heap size -counter с помощью execute (выполняется от имени администратора), он всегда показывает значение 0 Я также пытался получить значения через PowerShell (работает как администратор), тот же результат.

> $samples =Get-Counter -Counter "\.NET CLR Memory(HelloWorld_Net_Framework)\Large Object Heap size" -SampleInterval 1 -MaxSamples 10
> $samples

Timestamp                  CounterSamples
---------                  --------------
31/01/2020 09:10:35        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0


31/01/2020 09:10:36        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0


31/01/2020 09:10:37        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0


31/01/2020 09:10:38        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0


31/01/2020 09:10:39        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0


31/01/2020 09:10:40        \\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size :
                           0

У меня также есть эта проблема с другими счетчиками категории .NET CLR Memory. Кто-нибудь может дать мне какой-нибудь совет, если я должен установить ключ реестра или что-то еще.

Обновление 1:

Среда:

NET Framework 4.7.2
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.19041 N/A Build 19041
System Type:               x64-based PC

Обновление 2:

Если я использую профилировщик памяти ANT, я получаю правильные значения для LOH и SOH:

enter image description here

Что интересно, во время работы профилировщика ANTS я также вижу значение в Perfmon и PowerShell:

> $samples =Get-Counter -Counter "\.NET CLR Memory(HelloWorld_Net_Framework)\*" -SampleInterval 1 -MaxSamples 10
PS C:\WINDOWS\system32> $samples[0].CounterSamples

Path                                                                                                InstanceName                      CookedValue
----                                                                                                ------------                      -----------
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# gen 0 collections                     helloworld_net_framework                    1
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# gen 1 collections                     helloworld_net_framework                    1
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# gen 2 collections                     helloworld_net_framework                    1
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\promoted memory from gen 0              helloworld_net_framework                37048
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\promoted memory from gen 1              helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\gen 0 promoted bytes/sec                helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\gen 1 promoted bytes/sec                helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\promoted finalization-memory from gen 0 helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\process id                              helloworld_net_framework                14164
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\gen 0 heap size                         helloworld_net_framework              4194300
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\gen 1 heap size                         helloworld_net_framework                47144
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\gen 2 heap size                         helloworld_net_framework                   12
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\large object heap size                  helloworld_net_framework               817784
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\finalization survivors                  helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# gc handles                            helloworld_net_framework                   22
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\allocated bytes/sec                     helloworld_net_framework                    0
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# induced gc                            helloworld_net_framework                    1
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\% time in gc                            helloworld_net_framework 7.32466043442964E-05
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# bytes in all heaps                    helloworld_net_framework               864940
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# total committed bytes                 helloworld_net_framework               888832
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# total reserved bytes                  helloworld_net_framework             33546240
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# of pinned objects                     helloworld_net_framework                    5
\\laptop-f273g581\.net clr memory(helloworld_net_framework)\# of sink blocks in use                 helloworld_net_framework                    0

Кто-нибудь может мне объяснить, почему Perfmon / PowerShell работает во время работы ANT?

Thx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...