在我们的.Net Win32应用程序上进行一些负载测试时,我遇到了一些异常:
System.TypeInitializationException: The type initializer for 'MyClass' threw an exception. ---> System.InvalidOperationException: Custom counters file view is out of memory.
at System.Diagnostics.SharedPerformanceCounter.CalculateMemory(Int32 oldOffset, Int32 totalSize, Int32& alignmentAdjustment)
at System.Diagnostics.SharedPerformanceCounter.CreateInstance(CategoryEntry* categoryPointer, Int32 instanceNameHashCode, String instanceName, PerformanceCounterInstanceLifetime lifetime)
at System.Diagnostics.SharedPerformanceCounter.GetCounter(String counterName, String instanceName, Boolean enableReuse, PerformanceCounterInstanceLifetime lifetime)
at System.Diagnostics.SharedPerformanceCounter..ctor(String catName, String counterName, String instanceName, PerformanceCounterInstanceLifetime lifetime)
at System.Diagnostics.PerformanceCounter.InitializeImpl()
at System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)
运行此行时会发生这种情况:
new PerformanceCounter("CategoryName", "CounterName", "InstanceName", false);
我对性能计数器不是很熟悉,通过看到这条消息,我知道它们存储在某个文件中,但这是开发人员清除此文件的责任吗?如果有,怎么样?如果不是,我该怎么办?
我在同一台机器上运行了这个应用程序的5个实例。
答案 0 :(得分:0)
性能计数器实现IDisposable,因此您可以使用
直接:
perfCounter.Close();
perfCounter.Dispose();
间接:
using(PerformanceCounter perfCounter=new PerformanceCounter())
{
//Your Code.
}
清除其资源。
您还可以使用注册表为性能计数器分配更多内存。请参阅文档中的这篇文章:https://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter(v=vs.110).aspx
随.NET Framework 2.0一起安装的性能计数器类别使用单独的共享内存,每个性能计数器类别都有自己的内存。您可以通过在注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \\ Performance中创建名为FileMappingSize的DWORD来指定单独共享内存的大小。 FileMappingSize值设置为类别的共享内存大小。默认大小为131072十进制。如果FileMappingSize值不存在,则使用Machine.config文件中指定的performanceCounters元素的fileMappingSize属性值,从而导致配置文件处理的额外开销。您可以通过在注册表中设置文件映射大小来实现应用程序启动的性能改进。有关文件映射大小的更多信息,请参阅元素。