Windows - WPF使用大量可用物理内存处理内存不足崩溃

 mobiledu2502906817 发布于 2023-02-13 15:34

我有一个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时,进程是如何崩溃的?

高电流和峰值工作集表明可能在某处存在内存泄漏,但是当有足够的可用内存时,我仍然无法理解崩溃的原因.

1 个回答
  • 您认为物理记忆与任何方式相关的假设是您混淆的根本原因.请记住,思考内存的正确方法是进程内存是磁盘空间.物理内存只是磁盘顶部的快速缓存.再次强调一下:如果你的物理内存耗尽,那么你的机器就会变慢.它不会给出内存不足错误.

    相关资源是虚拟地址空间,而不是内存.每32位进程只能获得4GB的虚拟地址空间,并且为使用操作系统保留2GB的虚拟地址空间.假设您剩下166 MB的虚拟地址空间,并将其分成四个块,每个块42 MB.如果有50MB的请求,则无法满足该请求.不幸的是,你得到的错误是"内存不足",而不是"超出虚拟地址空间",这将是一个更准确的错误消息.

    您的问题的解决方案是:(1)为每个进程分配少于2GB的用户内存,(2)实现您自己的系统,用于将内存映射到虚拟地址空间和从虚拟地址空间出来,或者(3)使用64位进程更大量的可用虚拟地址空间.

    2023-02-13 15:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有