Как работает GetAllocatedBytesForCurrentThread ()? как нить использовать память?

Мне нужен метод для профилирования и регистрации объема памяти, используемой потоком в основном проекте .net. Я нашел вот такой интересный метод: GC.GetAllocatedBytesForCurrentThread ();

Как видно из названия метода, я ожидаю получить количество байтов, используемых потоком, но вместо этого я получаю чрезвычайно высокие значения, например: 26111439440 байт, и это невозможно, поскольку не соответствует используемой памяти в диспетчере задач и доступной памяти на моем машина.

Знаете ли вы другой метод, совместимый с .net core 2.0, который выполняет мою задачу?

UPDATE:

GetAllocatedBytesForCurrentThread() ошибается, возвращаемое значение никоим образом не имеет смысла.

Не знаю, связано ли это, но уже была ошибка (теперь закрыта), похожая на мою ситуацию: https://github.com/dotnet/coreclr/issues/10207 Я там доложил.

GetAllocatedBytesForCurrentThread() Возвращает совокупную память, используемую потоком, а не текущий объем используемой памяти, поэтому, если поток продолжает выделять и освобождать память, функция может возвращать очень высокие значения, даже если вы никогда не использовали столько памяти одновременно.

WORKAROUND:

Невозможно получить надежную память, используемую потоком, но вы можете получить память, используемую процессом:

Process currentProcess = Process.GetCurrentProcess();
long memory = currentProcess.WorkingSet64;

Если вы рассчитываете объем памяти до запуска потока и после, вы можете оценить объем используемой памяти.

Похоже на вопрос для github и очень похоже на ошибку

TheGeneral 01.11.2018 12:01

@TheGeneral, ты думаешь, это ошибка? Ага, может, попробую выложить на github. Но мой вопрос остается в силе, если существует другой способ использовать память.

Stefano Balzarotti 01.11.2018 12:04

Что вы пытаетесь достичь? У потока есть собственное пространство стека, которое, безусловно, используется потоком, поскольку не является общим. В дополнение к этому поток может создавать объекты, которые затем помещаются в общую кучу. Однако объекты могут совместно использоваться другими потоками, поэтому определение использования становится сложным.

Brian Rasmussen 01.11.2018 12:11

@BrianRasmussen Мне нужно оптимизировать библиотеку, поэтому я создаю регистратор, который на каждой итерации регистрирует используемую потоком память, но значения нереалистичны. Мне не нужно точное использование памяти, но невозможно использовать 26 гигабайт памяти.

Stefano Balzarotti 01.11.2018 12:18

возможно, это ошибка, я нашел это на github: github.com/dotnet/coreclr/issues/10207 Проблема в моем случае появляется с xunit, как сообщается на github.

Stefano Balzarotti 01.11.2018 12:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
461
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

GC.GetAllocatedBytesForCurrentThread возвращает совокупное количество байтов, выделенных текущим потоком, даже если эти выделения уже были очищены сборщиком мусора. Он не возвращает текущий объем используемой памяти. Для этого вы можете использовать Process.WorkingSet64 или Process.PrivateMemorySize64, в зависимости от того, что вы пытаетесь измерить.

26111439440 занимает всего 24,3 ГиБ, что кажется вполне разумным для требовательной к памяти программы, чтобы выделить ее в течение всего срока службы.

Я все еще занимаюсь расследованиями, потому что мне странно использовать столько оперативной памяти, но вы хорошо и четко объяснили, как работает GetAllocatedBytesForCurrentThread, поэтому я принимаю ваш ответ.

Stefano Balzarotti 05.11.2018 19:23

Другие вопросы по теме