Я работаю над изменением проекта API. NET 4.6.1 ASP. NET на x64. Я начал смотреть на потребление памяти при запуске того же GET для нашего API и увидел, что у x64 API есть собственный рабочий набор, который примерно в 3 раза больше, чем сайт x86. У меня сложилось впечатление, что процесс x64 будет примерно в 2 раза больше, но я не ожидал увеличения личного рабочего набора в ~ 3 раза.
Первое, что я сделал, - это создал сценарий powershell для получения частного рабочего установить при использовании приложения, чтобы я мог видеть, как память росла со временем. Вот окончательные результаты использования памяти после выполнения одних и тех же действий на обоих веб-сайтах.
DateTime Name Memory
-------- ---- ------
2020/01/10 07:56:15 qa_12050_API_Checklist 221367KB
2020/01/10 07:56:15 qa_9210_API_21 700185KB
, а вот скрипт
While($true)
{
ForEach($process in (gwmi win32_process | Where-Object {$_.Name -eq "w3wp.exe" -and ($_.CommandLine -like "*_21*" -or $_.CommandLine -like "*_checklist*") }))
{
gwmi Win32_PerfRawData_PerfProc_Process | Where-Object {$_.IDProcess -eq $process.ProcessId } | Select-Object -Property @{Name='DateTime';Expression={[System.DateTime]::Now.ToString('yyyy/MM/dd HH:mm:ss')}},@{Name='Name';Expression={ $process.CommandLine -match '"(qa_\d+_API_.*)" -v' | Out-Null; $Matches[1]; }},@{Name='Memory';Expression={[string]([int]($_.WorkingSetPrivate / 1028)) + "KB"} }
};
Sleep -Seconds 5;
}
Я использовал .\PerfView.exe ForceGC <PID>
, чтобы увидеть, если он очистит любую эту память, но это не так. После этого я использовал procdump, чтобы получить дамп памяти каждого из приложений и сравнить их. Я использовал !dumpheap -stat
и получил следующее.
x86
0:000> !dumpheap -stat
Statistics:
MT Count TotalSize Class Name
...
00606e00 20352 10890500 Free
72b4fcb0 329142 16147928 System.String
Total 1745592 objects
x64
0:000> !dumpheap -stat
Statistics:
MT Count TotalSize Class Name
...
00007ffabd5b9798 564669 31517154 System.String
0000004cbc6b8ac0 32579 161281670 Free
Total 3444975 objects
Из этого я могу сказать, что в ~ 2 раза выжило больше объектов, даже после того, как я заставил вывоз мусора. Я также вижу, что эти объекты примерно в 2 раза больше в x64, что я ожидал из-за большей ширины указателя. Чего я не понимаю, так это того, почему объекты начали переживать сборку мусора, которую я форсирую в процессе x64, и почему я вижу такую большую разницу в количестве объектов.
Может кто-нибудь объяснить, почему мы увидим это ~ 3-кратная разница в объеме памяти, используемой этими процессами?