首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows - WPF进程内存崩溃,有大量可用的物理内存。

Windows - WPF进程内存崩溃,有大量可用的物理内存。
EN

Stack Overflow用户
提问于 2013-12-01 20:13:40
回答 3查看 1.5K关注 0票数 0

我有一个WPF桌面应用程序,它崩溃了,例外情况如下:

System.Data.SqlServerCe.SqlCeException (0x80004005):运行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: 166MB

顺便说一下。当前进程值取自C#流程类。ComputerInfo值取自VB.NET ComputerInfo类。

我的应用程序是用(x86)配置编译的。该进程正在Windows 7 64位计算机上运行。

我看到可用的虚拟内存是166 is,看起来很低。

如果VB.NET VB.NET类报告了大量的ComputerInfo,那么进程怎么可能崩溃呢?

大电流和峰值工作集表明,可能有一个内存泄漏某处,但我仍然不明白为什么它崩溃时,有足够的可用内存。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-02 16:16:19

你认为物理记忆在任何方面都是相关的假设是你困惑的根本原因。记住,正确看待内存的方法是进程内存是磁盘空间。物理内存只是磁盘顶部的一个快速缓存。让我再次强调这一点:如果你耗尽了物理内存,那么你的机器就会变慢。它不会产生内存不足的错误。

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

解决问题的方法是:(1)为每个进程分配少于2GB的用户内存;(2)实现您自己的系统,以便将内存映射到虚拟地址空间,或者(3)使用一个64位进程,该进程具有更大的可用虚拟地址空间。

票数 7
EN

Stack Overflow用户

发布于 2013-12-01 20:24:52

每个32位(您有32位进程,因为TotalVirtualMemory: 2047 MB)只能寻址最多2GB的内存,而不考虑可用的物理内存。

票数 1
EN

Stack Overflow用户

发布于 2013-12-02 15:56:18

OutOfMemoryException可能是由许多因素引起的。

当应用程序在Gen0托管堆或大型对象堆中没有足够的空间来处理新的分配时,就会导致这种情况。这是一种罕见的情况,但通常会发生在堆太零碎而不允许新的分配(有时很小的时候!)。在Gen0中,这可能是由于过度使用固定对象(当使用非托管代码处理互操作时);在LOH中,这曾经是一个常见的问题,但在以后的.NET版本中出现的频率要低得多。值得注意的是,SqlCe访问将包括非托管代码;我没有听说过这方面的任何主要问题,但您对SqlCe类的使用可能会导致问题。

或者,这可能是一个虚拟内存问题--考虑到你发布的数据,这似乎是相当合理的。Eric有一篇关于这类这里的博客文章。如果您的应用程序试图将内存页写入磁盘,以便将其他内容保存在内存中,那么您很可能会看到异常,因为VM是如此有限。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20316707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档