调试.NET程序OutOfMemoryException

本文详细介绍了如何诊断和解决.NET程序中出现的OutOfMemoryException问题。通过分析虚拟内存耗尽的原因,演示了问题重现的过程,并提供了一系列调试方法,包括配置性能计数器、更改注册表设置、使用DebugDiag工具等。文章还展示了通过分析内存dump来定位内存消耗最大对象的步骤,强调了理解内存分配和垃圾回收在排查此类问题中的重要性。
摘要由CSDN通过智能技术生成

问题简介 

Out of memory异常是如何产生的

 

总的来说OutOfMemoryException会在两种情况下发生,

  1. 进程虚拟内存空间耗尽
  2. 系统物理内存耗尽

第二种情况我们可以参照系统进程管理器中性能选项卡,如果其中committed数值接近了limit,那说明第二种情况发生了。

 

不过大多数时候OutOfMemoryException发生是因为第一种原因,接下来我们将重点研究虚拟地址空间耗尽的问题。 

无论机器插了多少内存条,32位操作系统可以寻址4GB的地址空间,如果系统没有打开3GB开关的话,其中2GB分配给操作系统内核,另外2GB分配给用户程序。内核的2GB空间被所有的进程,操作系统所共享。但用户模式的那2GB空间为每个进程独享。

 

我们来简单描述一下CLR内存分配的方式,当应用程序需要分配内存空间的时候,CLR会分配一段连续空间64MB给应用程序使用,如果应用程序需要分配的内存大于85000byte,那么这部分内存会在大对象堆中分配,如果大对象堆中没有这么大的连续内存空间,则为大对象堆分配新的一段16MB。如果一直这样分配下去的话,总会达到一个上限无法满足连续空间的分配请求,因为我们只有2GB的用户模式内存空间。这样outof memory异常就会发生了。当然我们没有讨论垃圾回收器会不停的回收内存,整理压缩空间。

 

主要两大原因会使进程虚拟内存耗尽,

  1. 程序分配的速度大于内存回收速度
  2. 虚拟内存地址空间太多碎片,减少了连续空间分配的可能性

 

通常情况下,当32位应用程序虚拟内存使用了800M以上的时候,发生out of memory的几率会大大增加,因为内存碎片难以避免,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值