当前位置:  开发笔记 > 编程语言 > 正文

内存异常

如何解决《内存异常》经验,为你挑选了2个好方法。

我正在使用C#和asp.net开发一个Web应用程序我一直收到内存不足的异常.该应用程序所做的是从数据源读取一堆记录(产品),可能是数百/数千,通过向导中的设置处理这些记录,然后使用流程产品信息更新不同的数据源.虽然有多个DB类,但现在所有逻辑都在一个大类中.唯一的原因是,所有信息都与一件产品有关.如果我将我的应用程序划分为不同的类,它会帮助记忆吗?我认为不会这样,因为如果我将业务逻辑划分为两个类,那么这两个类在整个发送消息时都会保持活跃状态​​,所以我不知道这会有什么帮助.我想我的另一个解决方案是找出什么' 吮吸所有的记忆.你能推荐一个好工具吗?

谢谢



1> Sam Saffron..:

您是否正在使用数据加载器来传输数据?(避免在内存中加载过多)

我的直觉告诉我这是一个微不足道的问题需要修复,不要为100万条记录泵送数据表,一次一行地处理表格,或者小批量处理......当你完成它们时释放和处理对象.(例如:没有static List allCustomers = AllCustomers())
有一个开发规则,确保如果涉及的行数超过X,则没有人将表读入内存.

如果你需要一个工具来调试这个看看.net内存分析器或带有sos扩展名的windbg,你可以通过你的托管堆来嗅探.

另一个注意事项是,如果您关心可维护性并希望减少缺陷数量,请以更好地与您的域对齐的方式正确删除SuperDuperDoEverything类和模型信息.SuperDuperDoEverything类是一个等待爆炸的炸弹.



2> Cory Foy..:

另请注意,实际上您可能实际上没有内存不足.会发生什么是.NET去寻找连续的内存块,如果找不到,它会抛出一个OOM - 即使你有足够的总内存来覆盖请求.

有人引用了Perfmon和WinDBG.您还可以设置adplus以在崩溃时捕获内存转储 - 我相信语法是adplus -crash -iis.进行内存转储后,您可以执行以下操作:

.symfix C:\symbols
.reload
.loadby sos mscorwks
!dumpheap -stat

这将使您了解高内存对象是什么.

当然,请查看Tess Fernandez的优秀博客,例如关于使用XML Serializers进行内存泄漏以及如何对其进行故障排除的文章.

如果您能够在开发环境中重新启动它,并且您拥有VS Team Edition for Developers,则可以内置内存分析器.只需启动一个新的性能会话,然后运行您的应用程序即可.它会吐出一个很好的报告.

最后,确保您的对象没有定义析构函数.这不是C++,并且它没有确定性,除了它保证你的对象将在一轮垃圾收集中存活,因为它必须被放置在终结器队列中,然后清理下一轮.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有