笔者为C#业余爱好者,从开始编写一些计算量较大、内存占用较大的程序时,经常会在编译时报出System.OutOfMemoryException(内存溢出)的错误异常,而实际上,当时的剩余内存还多的是,最终只能改变原有算法,尽量减少内存占用。

我至少经历过以下一些场景的内存溢出提示:
1、使用DataTable或者DataSet,明明没有达到二者的最大行数闲置,却报出了内存溢出异常;
2、使用系统类库,逐行读取一个超大的TXT文件时,读到一定程度报内存溢出;
3、在数组、List中存入过多的数据,时不时报出内存溢出问题。
而这些情况在发生时,电脑的物理内存,明明剩余很多,可能剩余内存多大十几GB,并且似乎,每次报出内存溢出时,该程序占用的内存大概只有2.8~3GB左右。
如果你也碰到了此类情况,并且看到了本文,恭喜你,找到了此类问题的根本原因和解决办法,不用再去费尽心机修改代码以节省内存占用了。
众所周知,处理器区分32位和64位,操作系统也区分32位和64位,并且二者遵循如下关系:
1、在32位处理器的电脑上,只能看装32位操作系统
2、在64位处理器的电脑上,既能安装32位也能安装64位操作系统。
而对于应用程序来说:
1、在32位操作系统上,只能运行32位(X86)的程序
2、在64位操作系统上,既能运行32位(X86)的程序,也能运行64位程序(X64)。
对于操作系统的内存支持上来说,操作系统识别的物理内存:
1、在32位操作系统上,最大支持2^32=4GB的内存,由于一部分内存地址作为硬件等其他设备的专用进行保留,留给应用程序可用的一般在3.25GB左右
2、在64位操作系统上,最大支持2^64bit的内存,换算成GB是多大呢?可以明确的告诉你,非常大,按照当前的计算机技术,接近无限大了(超过PB级别),但是受限于 CPU,现在一般民用级别的处理器,基本最大

本文揭示了C#程序在64位系统下遇到内存溢出的真正原因——32位程序的内存限制。通过调整Visual Studio的编译目标为64位,有效解决内存占用问题,无论物理内存多大。
最低0.47元/天 解锁文章
4184

被折叠的 条评论
为什么被折叠?



