有时我会收到错误
Win32Exception没有足够的存储空间来处理此命令
申请运行约一个月左右后。
这对应于system error
ERROR_NOT_ENOUGH_MEMORY (8)
通常,它作为Windows服务运行,并且更改其登录的用户仍然会发生错误。但是,如果我通过双击它来运行应用程序,它可以正常工作。它可以再次作为Windows服务运行的唯一方法是重新启动服务器。
该错误出现在应用程序写入的日志中。完整的错误是:
System.ComponentModel.Win32Exception: Not enough storage is available to process this command
at System.Windows.Forms.NativeWindow.WindowClass.RegisterClass()
at System.Windows.Forms.NativeWindow.WindowClass.Create(String className, Int32 classStyle)
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Application.MarshalingControl..ctor()
at System.Windows.Forms.Application.ThreadContext.get_MarshalingControl()
at System.Windows.Forms.WindowsFormsSynchronizationContext..ctor()
at System.Windows.Forms.WindowsFormsSynchronizationContext.InstallIfNeeded()
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
at System.Windows.Forms.ScrollableControl..ctor()
at System.Windows.Forms.ContainerControl..ctor()
at System.Windows.Forms.Form..ctor()
at LicensingModule.LicenseKeyValidator..ctor(String Name, String Path)
at MIDICOMExporter.Program.Main(String[] args)
我看到其他答案说它与服务器上的内存泄漏有关,但是如果双击时应用程序仍然可以运行,那是否仍然意味着可能存在内存泄漏?
此外,这是在Windows Server 2012上运行。
答案 0 :(得分:3)
Yes, the problem might be related to a memory leak on the server. Maybe the desktop heap已耗尽。 “非交互式”窗口会话的桌面堆与实际(交互式)桌面会话的桌面堆不同。这解释了为什么仍然可以双击应用程序。
尝试查找注册表项\ System \ CurrentControlSet \ Control \ Session Manager \ SubSystem,并按MSKB 126962(yyy)中所述增加SharedSection=xxx,yyy,zzz
的第3个参数(zzz)。
第三个SharedSection值(512)是桌面堆的大小 对于与“非交互式”窗口关联的每个桌面 站。
如果这可以解决您的问题,例如由资源泄漏导致的堆耗尽可能是您的问题的根源。默认情况下,“非交互式”桌面堆的大小远小于标准堆。
答案 1 :(得分:0)
对RegisterClass
的调用导致内存错误。见Why RegisterClass fails with ERROR_NOT_ENOUGH_MEMORY?。您的应用多次拨打RegisterClass
或RegisterWindowsMessage
?