[.Net]System.OutOfMemoryException异常

1. 一个异常情景

加载15000条等高线,平均每条线有400个点到三维球上,等待时间太长。而且可能会报内存异常。

2. 不错的分析

http://wenku.baidu.com/view/1447140ce87101f69e31950b.html

典型出现内存溢出的情况:

double[,] m = new double[16000, 16000];

代码编写方面的注意问题

  1.System.Drawing方面的类使用问题

  System.Drawing用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用问题:

http://www.dotnet247.com/247reference/msgs/40/202528.aspx

  2.new byte[]问题,当使用字节数组导致内存溢出的情况

  处理流的时候常常会用到new一个大的byte数组。但在多用户情况下会消耗大量的内存。正确的做法应该是定义一个比较小的byte数组做为缓存,然后循环使用。如在我们的程序中,有些地方使用不当,当图片(或附件)过大或过多的时候, new byte[length]就有可能消耗过多的内存。

  这个在Ftp上传下载的时候需要注意。

  3.避免使用大对象数组或小对象大数组

  编程时同样要重视效率问题(包括内存占用问题)。

  4.Com接口调用是要注意释放对象。

其他过多的托管内存使用量通常由以下因素造成:

  1 将大型数据集读入内存中。

  2 创建过多的缓存条目。

  3 上载或下载大文件。

  4 在分析文件时过多地使用正则表达式或字符串。

  5 过多的视图状态。

  6 会话状态中有过多的数据或者会话过多。

http://www.cnblogs.com/chainet/archive/2005/01/25/97000.html

http://www.cnblogs.com/emanlee/archive/2009/06/25/1511198.html

调用构造字符串出现内存异常,类似原因分析

http://www.cnblogs.com/killmyday/archive/2010/07/03/1770616.html 此文推荐,接绍了如何跟踪。