我有一个WPF桌面应用程序崩溃与以下异常:
System.Data.SqlServerCe.SqlCeException(0x80004005):运行SQL Server的设备上没有足够的内存
但是,崩溃时的内存值对我来说有点不清楚:
当前过程当前工作集:806 MB
当前过程峰值工作集:1157 MB
当前进程当前页面内存大小:779 MB
当前进程峰值页面内存大小:1502 MB
当前进程专用内存大小:779 MB
ComputerInfo TotalPhysicalMemory:5884 MB
ComputerInfo TotalVirtualMemory:2047 MB
ComputerInfo AvailablePhysicalMemory:3378 MB
ComputerInfo AvailableVirtualMemory:166 MB
顺便说一句.Current Process值取自C#Process类.ComputerInfo值取自VB.NET ComputerInfo类.
我的应用程序使用(x86)配置编译.该过程在Windows 7 64位计算机上运行.
我看到可用虚拟内存为166MB,看起来很低.
当VB.NET ComputerInfo类报告有大量的AvailablePhysicalMemory时,进程是如何崩溃的?
高电流和峰值工作集表明可能在某处存在内存泄漏,但是当有足够的可用内存时,我仍然无法理解崩溃的原因.
您认为物理记忆与任何方式相关的假设是您混淆的根本原因.请记住,思考内存的正确方法是进程内存是磁盘空间.物理内存只是磁盘顶部的快速缓存.再次强调一下:如果你的物理内存耗尽,那么你的机器就会变慢.它不会给出内存不足错误.
相关资源是虚拟地址空间,而不是内存.每32位进程只能获得4GB的虚拟地址空间,并且为使用操作系统保留2GB的虚拟地址空间.假设您剩下166 MB的虚拟地址空间,并将其分成四个块,每个块42 MB.如果有50MB的请求,则无法满足该请求.不幸的是,你得到的错误是"内存不足",而不是"超出虚拟地址空间",这将是一个更准确的错误消息.
您的问题的解决方案是:(1)为每个进程分配少于2GB的用户内存,(2)实现您自己的系统,用于将内存映射到虚拟地址空间和从虚拟地址空间出来,或者(3)使用64位进程更大量的可用虚拟地址空间.