2016-05-24 2 views
3

У нас есть служба Windows C# (работает на сервере Windows 2008 + .NET Framework 4.6 + GC perf hot fix). После запуска в течение нескольких дней размер байтов во всех кучах достигает более 100 ГБ (фиксированный), а частные байты тоже очень высокие (110 ГБ +), но использование ОЗУ составляет всего 68 ГБ (рабочий набор) & 59 ГБ (частные байты). Только 10 ГБ в файлах страниц на этом сервере.Почему байты во всей куче намного больше общего использования памяти

Я сделал дамп и запустил WinDbg + SOS для анализа использования памяти, и я узнал, что существует много объектов Free (около 54 ГБ). Может ли это быть вызвано Free объектами? Разве эти бесплатные объекты занимают только виртуальную память, но нет физической памяти? Если нет, то как возможно, что зафиксированная виртуальная память намного больше, чем используемая физическая память + файлы страниц?

ответ

2

Вы только что обнаружили концепцию страниц с нулевым значением.

Процитирую из Windows Internals, 6-е издание, часть 2 [Amazon Germany], глава 10, что об управлении памятью (стр 276 в моем издании книги):

Для многих из этих пунктов , плата за совершение может представлять собой потенциальное использование хранилища, а не фактическое. Например, страница конфиденциальной памяти фактически не занимает ни физической страницы ОЗУ, ни эквивалентного пространства для файлов страниц, пока она не будет указана хотя бы один раз. До тех пор, это нулевая страница [...] Но фиксируйте учетные записи для таких страниц, когда виртуальное пространство сначала создается. Это гарантирует, что, когда страница будет указана позже, для нее будет доступно фактическое физическое пространство для хранения.

Это означает: Windows будет увеличивать размер рабочего набора или файла страницы при доступе к памяти (зафиксированной, но не доступной/неиспользуемой).

Ваше предложение

ли эти свободные объекты занимают только виртуальную память, но не физической памяти?

не подходит для остальной части вопроса. Любая память, независимо от того, что она заполнена (объекты .NET Free, обычные объекты .NET или даже C++), может потреблять физическую память (тогда она находится в рабочем наборе) или нет (тогда она находится в файле страницы).

+0

Привет, Томас, Спасибо за ваш ответ. Страницы с запросом-нулем - это определенно новая концепция для меня. Теперь у вас новое направление. Однако путаница все еще продолжается. Когда я суммирую все основные .net-объекты, перечисленные при запуске '! Dumpheap -stat', составляет около 89G (включая 54G Free objects). Я думаю, что эти объекты ссылаются или используются для ссылки, если для них уже выделена физическая память? – Jason

+1

@ Джейсон: не обязательно. Например. .NET может «подумать», что ваша программа нуждается в большом количестве оперативной памяти, поэтому она заранее выделяет 40 мегабайт. В это время он выделяется как нулевой спрос. Но тогда ваша программа нуждается в 50 МБ в одном блоке (например, в байте []). NET должен выделить 50 МБ новой памяти, которая становится физической. Но старые предварительно выделенные 40 МБ все еще существуют как спрос-ноль. Вы можете попытаться реализовать образец программы, чтобы продемонстрировать такое поведение или посмотреть, можно ли это увидеть с помощью моего [кода примера фрагментации LOH] (http://stackoverflow.com/a/30361185/480982). Попробуйте поместить (native) точку останова на VitualAlloc(). –

+0

Большое спасибо. Я посмотрю. – Jason

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