Мне нужен метод для профилирования и регистрации объема памяти, используемой потоком в основном проекте .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;
Если вы рассчитываете объем памяти до запуска потока и после, вы можете оценить объем используемой памяти.
@TheGeneral, ты думаешь, это ошибка? Ага, может, попробую выложить на github. Но мой вопрос остается в силе, если существует другой способ использовать память.
Что вы пытаетесь достичь? У потока есть собственное пространство стека, которое, безусловно, используется потоком, поскольку не является общим. В дополнение к этому поток может создавать объекты, которые затем помещаются в общую кучу. Однако объекты могут совместно использоваться другими потоками, поэтому определение использования становится сложным.
@BrianRasmussen Мне нужно оптимизировать библиотеку, поэтому я создаю регистратор, который на каждой итерации регистрирует используемую потоком память, но значения нереалистичны. Мне не нужно точное использование памяти, но невозможно использовать 26 гигабайт памяти.
возможно, это ошибка, я нашел это на github: github.com/dotnet/coreclr/issues/10207 Проблема в моем случае появляется с xunit, как сообщается на github.





GC.GetAllocatedBytesForCurrentThread возвращает совокупное количество байтов, выделенных текущим потоком, даже если эти выделения уже были очищены сборщиком мусора. Он не возвращает текущий объем используемой памяти. Для этого вы можете использовать Process.WorkingSet64 или Process.PrivateMemorySize64, в зависимости от того, что вы пытаетесь измерить.
26111439440 занимает всего 24,3 ГиБ, что кажется вполне разумным для требовательной к памяти программы, чтобы выделить ее в течение всего срока службы.
Я все еще занимаюсь расследованиями, потому что мне странно использовать столько оперативной памяти, но вы хорошо и четко объяснили, как работает GetAllocatedBytesForCurrentThread, поэтому я принимаю ваш ответ.
Похоже на вопрос для github и очень похоже на ошибку