首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET内存不足故障排除

.NET内存不足故障排除
EN

Stack Overflow用户
提问于 2010-06-07 02:40:57
回答 6查看 9.9K关注 0票数 4

在阅读了一些关于内存在.NET技术、Out of Memory does not refer to physical memory597499中的启发性文章后。

我本以为我明白了为什么C#应用会抛出内存不足的异常,直到我开始用两台服务器做实验,这两台服务器都有2.5 C#的内存,windows server 2003,并且运行着相同的程序。

两者之间唯一的显着区别是,一个有7%的硬盘存储空间,另一个有超过50%的存储空间。

留有7%存储空间的服务器总是抛出内存不足,而另一个性能一直很好。

我的应用程序是一个C# web应用程序,它处理数百MB的字符串对象。

既然内存不足问题最有可能的原因是连续虚拟地址空间不足,为什么会出现这种差异。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-07 02:45:34

我所能想到的就是你耗尽了虚拟内存。听起来你需要在应用上运行一个内存分析器。

我以前也在类似的情况下使用过Red Gate profiler。你可能会惊讶于你的字符串实际使用了多少内存。

票数 8
EN

Stack Overflow用户

发布于 2010-06-07 02:54:48

每台机器上的分页文件碎片是否不同?高度碎片化可能会减慢分页操作,从而加剧内存问题。如果分页文件大量碎片化,请对其进行排序,例如,使服务器脱机,将分页文件大小设置为零,对驱动器进行碎片整理,重新创建分页文件。

在没有更多细节的情况下,很难给出任何关于如何处理字符串处理性能问题的具体建议。

票数 3
EN

Stack Overflow用户

发布于 2010-06-07 03:18:08

既然内存不足问题最有可能的原因是连续虚拟地址空间不足,为什么会出现这种差异?

使用7%的空闲硬盘,您的服务器可能会耗尽空间,无法从您的进程或其他进程中调出内存,因此它必须将所有内容都保留在RAM中,因此您无法比在具有50%空闲空间的服务器上更频繁地分配额外的内存。

你们有什么解决方案?

由于您已经运行了一个分析器,并且至少看到了600MB+的用法以及所有字符串数据,因此您需要开始解决这个问题。

显而易见的答案是,不要将所有数据都保存在内存中。如果你正在处理一个大的数据集,那么加载一个比特,处理它,然后丢弃它,加载下一个比特,而不是预先加载所有比特。

如果是您需要服务的数据,请查看LRU (最近最少使用)之类的缓存策略,只将最热的数据保留在内存中,而将其余数据保留在磁盘上。

您甚至可以将字符串卸载到数据库中(在内存中或基于磁盘),并让它为您处理缓存管理。

我过去不得不使用的一种简单的解决方案是,在字符串数据到达时在内存中对其进行压缩,并在需要时使用SharpZipLib再次解压缩。令人惊讶的是,它并没有那么慢。

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

https://stackoverflow.com/questions/2985408

复制
相关文章

相似问题

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