如何修复PerformanceCounterCategory.GetInstanceName的OutOfMemoryException

时间:2015-05-12 07:36:21

标签: c# .net performancecounter

如果我执行此代码

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 exe中,如果我在x86下运行相同的代码它可以工作。任何想法如何解决这个问题?

操作系统是Windows 8.1 x64,内存为8GB(这不是物理内存问题)。

1 个答案:

答案 0 :(得分:1)

我最终通过知识库文章How to manually rebuild Performance Counter Library values

解决了这个问题
  1. Perfc009.dat
  2. 中的备份Perfh009.dat%Systemroot%\System32
  3. 将文件从安装媒体复制到%Systemroot%\ System32。虽然这篇kb文章是针对服务器2008而我是在Windows 8.1上,但是我使用7-zip从安装dvd的文件sources\install.wim(Windows 8 Pro文件夹2\Windows\System32\)中提取文件。
  4. 在注册表中,将Last Counter值更改为1846(十进制),并将Last Help值更改为1847(十进制)。
  5. 从Performance子项中删除以下值(如果存在):First Counter, First Help, Last Counter, Last Help
  6. 使用lodctr /R(我在System32和Syswow64文件夹中从管理员cmd提示执行此操作以确保)重新启用第三方计数器
  7. 文章还建议,如果任何.NET应用程序无法启动,则必须重新安装创建性能计数器的.NET程序集,例如: InstallUtil /i Microsoft.Mom.ConfigService.dll但在我的情况下这不是必需的。