Может быть

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

Ответы на вопрос(5)

Решение Вопроса

Две функции, которые вы можете найти полезными:

  GC.GetTotalMemory();
  Process.PagedMemorySize64();

Мой опыт показывает, что GC.GetTotalMemory () не очень надежна. Он часто сообщает об использовании памяти, которое намного меньше, чем фактическое использование памяти. Я видел отчет о том, что я использую только 8 гигабайт, когда моей программе не хватает памяти на машине с 16 гигабайтами.

Я еще не тестировал Process.PagedMemorySize64, хотя он выглядит многообещающе.

 Steve Wortham18 апр. 2012 г., 20:03
Я не уверен когдаProcess.PagedMemorySize64 полезно, но в моем случае это не сработало. Я выполняю сравнение до / после создания экземпляра нескольких объектов и запуска анализатора, и PagedMemorySize64 сообщал об одном и том же значении до и после, тогда какGC.GetTotalMemory(true) похоже, более эффективно сообщает об изменениях в использовании памяти.
 maxfridbe24 февр. 2009 г., 22:11
Я думаю, что Process.PrivateMemorySize64 () подходит для использования активной памяти.
 Lost_In_Library20 июн. 2012 г., 08:43
 Dan W11 нояб. 2012 г., 06:19
Я согласен со Стивом в том, что (несмотря на потенциальные недостатки, как упомянуто в ответе), GC.GetTotalMemory (true), кажется, путь. Когда я выделяю память локально внутри метода и возвращаюсь из этого метода, эта память освобождается для повторного использования, но только GC.GetTotalMemory (true) распознает это.
 coffeetocode10 авг. 2012 г., 00:10
@SteveWortham Кэшируются различные свойства процесса (например, PagedMemorySize64), поэтому простой доступ к ним снова не даст вам новых значений. Process.Refresh () предназначен для удаления кеша и получения новых чисел, но я обнаружил, что он не работает. Тем не менее, фактически создавая новый объект Process каждый раз (System.Diagnostics.Process.GetCurrentProcess ()), все получилось. Не идеально, но работает.
Process proc = Process.GetCurrentProcess();
Logger.Info(proc.PeakWorkingSet64/1024 + "kb");

что даст вам много данных (активность GC / использование физической памяти / управляемая куча и т. Д.)

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

Может быть

Windows::System::Diagnostics::ProcessDiagnosticInfo::GetForCurrentProcess();

tem.Diagnostics, класса Process.http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx.

Ничего из «на объект», но, по крайней мере, некоторую информацию о вашем процессе можно почерпнуть.

Ваш ответ на вопрос