我有一个WPF桌面应用程序,它崩溃了,例外情况如下:
System.Data.SqlServerCe.SqlCeException (0x80004005):运行Server的设备上内存不足
但是,在崩溃时的内存值对我来说有些不清楚:
顺便说一下。当前进程值取自C#流程类。ComputerInfo值取自VB.NET ComputerInfo类。
我的应用程序是用(x86)配置编译的。该进程正在Windows 7 64位计算机上运行。
我看到可用的虚拟内存是166 is,看起来很低。
如果VB.NET VB.NET类报告了大量的ComputerInfo,那么进程怎么可能崩溃呢?
大电流和峰值工作集表明,可能有一个内存泄漏某处,但我仍然不明白为什么它崩溃时,有足够的可用内存。
发布于 2013-12-02 16:16:19
你认为物理记忆在任何方面都是相关的假设是你困惑的根本原因。记住,正确看待内存的方法是进程内存是磁盘空间。物理内存只是磁盘顶部的一个快速缓存。让我再次强调这一点:如果你耗尽了物理内存,那么你的机器就会变慢。它不会产生内存不足的错误。
相关资源是虚拟地址空间,而不是内存。每32位进程只有4GB的虚拟地址空间,其中2GB是留给操作系统使用的。假设剩下166 MB的虚拟地址空间,并将其分成4块,每块42 MB。如果出现了50 If的请求,则无法满足该请求。不幸的是,您得到的错误是“内存不足”,而不是“超出虚拟地址空间”,这将是一个更准确的错误消息。
解决问题的方法是:(1)为每个进程分配少于2GB的用户内存;(2)实现您自己的系统,以便将内存映射到虚拟地址空间,或者(3)使用一个64位进程,该进程具有更大的可用虚拟地址空间。
发布于 2013-12-01 20:24:52
每个32位(您有32位进程,因为TotalVirtualMemory: 2047 MB)只能寻址最多2GB的内存,而不考虑可用的物理内存。
发布于 2013-12-02 15:56:18
OutOfMemoryException可能是由许多因素引起的。
当应用程序在Gen0托管堆或大型对象堆中没有足够的空间来处理新的分配时,就会导致这种情况。这是一种罕见的情况,但通常会发生在堆太零碎而不允许新的分配(有时很小的时候!)。在Gen0中,这可能是由于过度使用固定对象(当使用非托管代码处理互操作时);在LOH中,这曾经是一个常见的问题,但在以后的.NET版本中出现的频率要低得多。值得注意的是,SqlCe访问将包括非托管代码;我没有听说过这方面的任何主要问题,但您对SqlCe类的使用可能会导致问题。
或者,这可能是一个虚拟内存问题--考虑到你发布的数据,这似乎是相当合理的。Eric有一篇关于这类这里的博客文章。如果您的应用程序试图将内存页写入磁盘,以便将其他内容保存在内存中,那么您很可能会看到异常,因为VM是如此有限。
https://stackoverflow.com/questions/20316707
复制相似问题