2015-05-12 4 views
1

Если я выполняю этот кодКак исправить OutOfMemoryException для PerformanceCounterCategory.GetInstanceName

PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 
var instances = cat.GetInstanceNames(); // OutOfMemoryException 

я получаю OutOfMemoryException Полный стек трассировки

A first chance exception of type 'System.OutOfMemoryException' occurred in mscorlib.dll 
System.OutOfMemoryException: An Exception of Type "System.OutOfMemoryException" occured. 
    at Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity) 
    at Microsoft.Win32.RegistryKey.GetValue(String name) 
    at System.Diagnostics.PerformanceMonitor.GetData(String item) 
    at System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) 
    at System.Diagnostics.PerformanceCounterLib.get_CategoryTable() 
    at System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine, String category) 
    at System.Diagnostics.PerformanceCounterCategory.GetCounterInstances(String categoryName, String machineName) 
    at WindowsFormsApplication5.Form1.button1_Click(Object sender, EventArgs e) 

Это происходит только в x64 ехе, если я бегу тот же код под x86 работает. Есть идеи, как это решить?

ОС - Windows 8.1 x64, с ОЗУ 8 ГБ (это не проблема физической памяти).

+0

Какая версия окон? – tolanj

+0

И сколько свободной памяти у вас есть перед вызовом проблемы? – tolanj

+0

@tolanj Я добавил некоторые данные –

ответ

1

В конце концов я решил это с knowlegebase статье How to manually rebuild Performance Counter Library values

  1. резервного копирования Perfc009.dat и Perfh009.dat в %Systemroot%\System32
  2. Копирование файлов с установочного носителя на% SystemRoot% \ System32. Хотя эта статья kb для сервера 2008 года, и я нахожусь в Windows 8.1, я извлек файлы из файла dvd установки sources\install.wim (папка 2\Windows\System32\ для Windows 8 Pro) с 7-zip.
  3. В реестре измените значение последнего счетчика на 1846 (десятичный) и измените значение последней справки на 1847 (десятичное).
  4. Удалите следующие значения из подраздела производительности (если они существуют): First Counter, First Help, Last Counter, Last Help
  5. Использование lodctr /R (я сделал это с администратором CMD подскажу раз в System32 и папке Syswow64 просто чтобы быть уверенным), чтобы снова включить счетчики стороннего
  6. В статье также говорится, что если какие-либо приложения .NET не запускаются, вам необходимо переустановить сборки .NET, которые создают счетчики производительности, например InstallUtil /i Microsoft.Mom.ConfigService.dll, но это не было необходимо в моем случае.
+0

Хорошо для вас. Часто вы можете уйти просто с помощью команды 'lodctr/R' (без каких-либо других шагов). –

+0

Хмм, я не покупаю. Вы забыли перечислить шаг 6а. Перезагрузите компьютер? –

+0

@ 500-InternalServerError - Не в моем случае, я также пробовал 'lodctr/q' и' loadctr/d: 'для некоторых счетчиков производительности сторонних разработчиков. @HansPassant - Noop, это сработало для меня без перезагрузки, даже не перезапустив службу, связанную с производительностью. –