| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1236 人关注过本帖
标题:[转载]CLR内存优化
只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:2 
[转载]CLR内存优化

.NET拥有自己的内存回收机制,大大方便了我们的开发。但并不意味着内存的问题从此一劳永逸了。在开发时,我们依然会遇到各种各样的内存故障。

内存溢出是最常见的内存故障,在解析内存为什么会溢出之前,我们先了解一下WIN32的内存模式:

WIN32内存模式分为系统模式和用户模式,各占2GB的寻址空间。对于任何一个进程而言,理论上都有4GB的内存寻址空间。其中开头的4M和结尾的2GB被系统核心占用,剩下的不到2GB寻址空间是我们的应用程序可以访问的。因此程序内存溢出,我们首先应该检查是否超出了自己的寻址空间。

对于.NET程序而言,会因为framework以及各种程序集消耗很多内存,因此.NET程序真正可用的寻址空间将远远小于2GB。当应用程序消耗的内存超过特定的限额时(通常在1.2GB左右),framework就会抛出System.OutOfMemoryException。由于.NET采用非实时内存垃圾回收的机制,那么对于一个.NET程序而言,在进行垃圾回收之前,内存只减不增,消耗极快,这又进一步促使内存溢出故障的发生。

以上就是绝大部分内存溢出的原因。

我们可以采取一些手段来规避这个问题:
1. 从核心系统索取更多的寻址空间
在Windows2000、Windows XP以及Windows 2003中,我们都可以通过设置boot.ini文件来使应用程序获得更大的寻址空间:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="……" /3GB

然后,我们需要对exe文件连接LARGEADDRESSAWARE选项来支持大寻址空间模式:

link -edit -LARGEADDRESSAWARE app.exe

如此一番操作之后,我们的应用程序就可以使用更大的内存空间了(大概2.4GB左右)。
注意:需要使用管理员身份调用程序。

2. 使用AWE
3GB内存地址空间只是微软的一个应急解决方案,如果我们的程序跑在拥有4GB或者更大内存的服务器上面时,我们应当尝试使用AWE来实现对2GB以外内存地址空间的访问。不过我在这块也是一知半解,网上有相当多关于AWE的资料,搜索一下就行了。

搜索更多相关主题的帖子: CLR 内存 
2007-08-06 18:05
反正都是自我
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2007-7-27
收藏
得分:0 

我顶,好文章啊。


2007-08-06 18:33
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
我以前总是自己猜到什么时候运用GC.collect(),不过听说这个函数会消耗CPU去处理释放任务,所以不能常用

而且如果当前真的需要大内存的话,强制释放完之后会马上又因为要用而填充回那部分内存

也就是说,如果有些东西必须用大内存,又介乎于用与不用之间的话(就是说,暂时没使用的资源,但是等下可能又要用到)

强行GC掉,过几秒钟之后就会迅速恢复(占回同样多的内存)

2007-08-06 18:50
快速回复:[转载]CLR内存优化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017716 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved