Я решил поиграть со счетчиками производительности в контексте сбора мусора. Поэтому я написал этот код:
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:
Что интересно, во время работы профилировщика 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