WinXP怪现象:非内存泄漏引起的内存增长

pilixuanke 2006-06-07 04:04:09
各位大侠:
现有一Windows服务程序,运行于WinXP SP2环境下,在运行过程中,从“任务管理器”上可以看到该进程所占用的内存呈现不断增大的趋势(即开一个或多个窗口,然后关闭所有窗口,内存就会增长,虽然在开窗口的时候会申请一定数量的内存,一次申请的最大空间为4M多,但我们在关闭窗口的时候会释放掉申请的空间)。
刚一开始我们怀疑是内存泄漏问题,但不管是自己分析代码,如查找所有的new、malloc是否有对应的释放语句,是否存在某些分支忘记释放等,还是用DevPartner(支持VC.NET的内存泄漏查找工具)以及其它方法,在软件本身上是没有找到内存泄漏的地方,所以排除因内存泄漏而引起的内存增长。
后来经过仔细检查,发现“内存使用”中的增量与“虚拟内存大小”增量相差不多。因此初步怀疑与windows操作系统的内存管理机制相关,我有个假设:一旦程序向系统申请一定量的空间,虽然释放了,但操作系统并没有回收回去,此段释放的堆空间仍然属于该进程,并且占用该进程的4G虚拟内存空间,当整个进程退出或者内存紧张时操作系统才来管理这些内存。因为如果某个进程频繁进行申请-->释放操作的话,操作系统会忙于进行内存管理,可能会加重操作系统的负担,而且现在的内存正在不断的增长,现在的机器一般大于512M内存条吧。所以系统不会去在意这些空间。
但现在问题是,随着该服务程序不断运行,进程所占用的内存空间越来越大,最后会导致new或malloc不成功,从而使服务进程退出。
不知小弟是否将问题描述清楚了。
请各位大侠就此问题发表高见。
谢谢!
...全文
265 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pilixuanke 2006-06-14
  • 打赏
  • 举报
回复
经过一段时间的分析与探索,似乎找到了此问题的根源。那就是用“任务管理器”所看到的“内存使用”一栏中显示的是该进程的工作集,这个值不会很准确,也就是说,用它来作为衡量软件甚至检测是否存在内存泄漏的标准是不恰当的。
也发现一个小现象,打开“任务管理器”,然后开一个Notepad或Word窗口,找到其对应的进程及查看其内存使用值。然后将窗口最小化,大家应该能够看到其对应的内存使用值减少了。这就是说这种情况与windows系统的内存管理机制有很大的关系,并非内存泄漏或者说软件存在问题。
下面的两个链接是我找到的相关文档,大家有空可以看看:

http://www.itwriting.com/dotnetmem.php
http://blog.joycode.com/qqchen/archive/2004/03/17/16434.aspx

pilixuanke 2006-06-08
  • 打赏
  • 举报
回复
To: lengxiao_wang()
你说的我同意,关于碎片的问题我们也考虑过,碎片会存在,但应该不会是内存一直增长的根本原因。而且一个碎片不会超过1个页面,即4K的空间,所以累积起来也不会有很大的影响。
不知你是否认同?
pilixuanke 2006-06-08
  • 打赏
  • 举报
回复
找不到合适的下载网站,去INTEL官方网站想下个测试版来试用,却被告知网站维护,暂不可用。真是晕倒啊!在红旗中科上有几个链接,但网速奇慢,下着下着就断了。
哪位兄弟要知道合适的下载网站,望吱个声啊!俺在此先行谢过了^_^
lengxiao_wang 2006-06-08
  • 打赏
  • 举报
回复
不是系统不在意 ,我认为这是windows 内存管理的算法问题,我们可以做这样的假设,如果你每次申请4MB的内存,然后,用完,释放,再申请4MB,那么明显,内存是不会浪费的,也就是说没有内存碎片产生。问题是,windows 的动态内存管理是堆内存管理,每一次你申请XB的内存,windows给你找到一个合适的空闲内存块,但是,这个内存的大小未必就是XB,也许就是YB,当然Y >= X,这样,系统给你返回你要的XB,余下的(Y-X)B就被标志为空闲,问题就出在这里,如果你今后申请的内存的大小均大于(y -x)B,那么,这个(y -x)B的内存块尽管一直被标志为空闲,你却始终没有机会使用(实际的情况比这个还糟糕),那么时间越长,碎片越多,内存看起来就被使用的越多,也就说可用内存越来越少,呵呵,我们就感觉系统越来越慢了。
ffwin 2006-06-08
  • 打赏
  • 举报
回复
mark
sharpdew 2006-06-08
  • 打赏
  • 举报
回复
呵呵,没分也没关系啦,你先下载好啦
pilixuanke 2006-06-08
  • 打赏
  • 举报
回复
sharpdew(风刃) ( ) 信誉:100 2006-06-07 17:15:00 得分: 0


不过说实话我真不相信任务管理器所显示的那些东西,你最好用VTune这样的工具测试内存变化情况。
///////////////////////////////////////////////////////////////////////////
谢谢啦!我正在尝试下载VTune,但网速太慢,本想先给点你3分先意思意思一下的。可是系统却提示给分就要结帖了,这是我第一次发帖,所以不知道规矩。
pilixuanke 2006-06-08
  • 打赏
  • 举报
回复
To: sharpdew(风刃)
你说到:“不过说实话我真不相信任务管理器所显示的那些东西,你最好用VTune这样的工具测试内存变化情况。”
按理说,内存都是由Windows操作系统在管理,系统本身所带的工具应该不会差到哪去吧?不知兄弟是否将这两者做过对照?
谢谢!
pilixuanke 2006-06-08
  • 打赏
  • 举报
回复
To: doublefish8133(米兰王朝)
问题是服务程序得不间断地运行,而且存在一些场合需要不断地响应客户端的请求,一旦内存空间不够,服务程序就会出错退出,这对用户来说可是一个大大的bug啊!
俺晕死&^%*
doublefish8133 2006-06-08
  • 打赏
  • 举报
回复
偶们公司做.net开发也有这个问题啊,内存8断增大的,虽然代码都多家了Dispose释放资源,8过好象没用,系统8会马上释放的,要过段时间哈!~
sharpdew 2006-06-07
  • 打赏
  • 举报
回复
不过说实话我真不相信任务管理器所显示的那些东西,你最好用VTune这样的工具测试内存变化情况。
pilixuanke 2006-06-07
  • 打赏
  • 举报
回复
系统不立即回收,可以理解,但是经过1分钟后从“任务管理器”上看不到内存使用的值减少。这就有点说不过去了,因为1分钟对系统来说应该是一段比较长的时间了。
sharpdew 2006-06-07
  • 打赏
  • 举报
回复
频繁申请释放的确会是系统负担加重,你的说法有一定的道理。但是程序释放的内存,系统可能不是立即回收的,这之间有一定的时间差。

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧