"Win32Exception Not enough storage is available to process this command" 当 运行 作为 windows 服务时出错
"Win32Exception Not enough storage is available to process this command" error when run as a windows service
有时我会收到错误
Win32Exception Not enough storage is available to process this command
在申请 运行 大约一个月左右之后。
这对应于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)
我看到其他回答说是服务器内存泄漏有关,但是如果应用程序在双击时仍然可以运行,是否仍然意味着可能存在内存泄漏?
另外,这是 运行ning 在 Windows Server 2012 上。
调用 RegisterClass
导致内存错误。参见 Why RegisterClass fails with ERROR_NOT_ENOUGH_MEMORY?。您的应用是否多次调用 RegisterClass
或 RegisterWindowsMessage
?
是的,问题可能与服务器上的内存泄漏有关。也许 desktop heap 已耗尽。 "non-interactive" window 会话的桌面堆不同于真实(交互式)桌面会话的桌面堆。这解释了为什么仍然可以双击该应用程序。
尝试查找注册表项 \System\CurrentControlSet\Control\Session Manager\SubSystem 并增加 SharedSection=xxx,yyy,zzz
的第三个参数 (zzz),如 MSKB 126962 中所述(对于 yyy)。
The third SharedSection value (512) is the size of the desktop heap
for each desktop that is associated with a "non-interactive" window
station.
如果这解决了您的问题,例如由泄漏资源引起的堆耗尽可能是问题的根源。 "non-interactive" 桌面堆的大小默认比标准堆小得多。
有时我会收到错误
Win32Exception Not enough storage is available to process this command
在申请 运行 大约一个月左右之后。
这对应于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)
我看到其他回答说是服务器内存泄漏有关,但是如果应用程序在双击时仍然可以运行,是否仍然意味着可能存在内存泄漏?
另外,这是 运行ning 在 Windows Server 2012 上。
调用 RegisterClass
导致内存错误。参见 Why RegisterClass fails with ERROR_NOT_ENOUGH_MEMORY?。您的应用是否多次调用 RegisterClass
或 RegisterWindowsMessage
?
是的,问题可能与服务器上的内存泄漏有关。也许 desktop heap 已耗尽。 "non-interactive" window 会话的桌面堆不同于真实(交互式)桌面会话的桌面堆。这解释了为什么仍然可以双击该应用程序。
尝试查找注册表项 \System\CurrentControlSet\Control\Session Manager\SubSystem 并增加 SharedSection=xxx,yyy,zzz
的第三个参数 (zzz),如 MSKB 126962 中所述(对于 yyy)。
The third SharedSection value (512) is the size of the desktop heap for each desktop that is associated with a "non-interactive" window station.
如果这解决了您的问题,例如由泄漏资源引起的堆耗尽可能是问题的根源。 "non-interactive" 桌面堆的大小默认比标准堆小得多。