阅读:2332回复:16
物理内存不断减少
任务管理器显示驱动程序工作时物理内存不断减少,但verifier显示的分页内存和非分页内存没什么变化,物理内存最少到了3000K,卸载驱动后,物理内存才释放到开始的水平,怎么回事
|
|
沙发#
发布于:2002-05-29 15:28
你是否不断申请内存,并且没有释放呀?
如果是这样,那可能需要修改代码, 还有,如果你使用某些调试工具,有可能是调试工具转存信息时申请的,象DebugPrint就需要申请内存来保存Debug信息(使用动态连表), |
|
|
板凳#
发布于:2002-05-30 15:28
没有申请内存,没有用调试工具
程序运行时的功能就是从本地磁盘拷贝文件到服务器,结果考一个文件物理内存就少一大块,最少到了100k,这时拷贝就停不下来了,然后就是死机。 |
|
地板#
发布于:2002-05-30 15:57
肯定是有内存分配了没释放!
你仔细检查一下 |
|
|
地下室#
发布于:2002-05-30 20:01
内存泄露?!? ;) |
|
|
5楼#
发布于:2002-05-30 20:12
显然是你把文件拷到内存中没释放而且你没写出导致缓冲池不断扩大,所以不断减少可分配内存,到最后很可能产生内存交换文件不断地来回调动而产生内存抖动,一定会当机的拉!
|
|
|
6楼#
发布于:2002-05-31 08:49
没释放,应该是这样
|
|
7楼#
发布于:2002-05-31 09:56
没有申请内存,没有用调试工具 可以确定是你考文件时有写内存没有释放,你没有主动申请内存并不意味作你没有使用,系统有些函数需要申请内存,并且需要你自己去释放,还有系统的使用核心对象的创建都需要删除,引用也需要处理,凡此种种都需要注意,如果不能检查错误,可将这部分代码贴出来,大家看比一个人看更快 |
|
|
8楼#
发布于:2002-05-31 14:03
我现在正式怀疑这家伙根本没有写程序,骗我们玩,坏蛋!
|
|
9楼#
发布于:2002-05-31 17:16
每次拷贝文件时你是不是都创建了IPR ?
|
|
10楼#
发布于:2002-05-31 19:17
是否用zwcreatefile, zwwritefile, zwreadfile来进行文件拷贝?
如果是这样的话,必须保证处理完之后把handle关掉。zwclose 否则系统的cache memory永远也不会清,结果就是mem不足。 八成没有直接处理irp吧,否则,自己没有分配内存几乎不可能。 |
|
11楼#
发布于:2002-06-03 10:55
就直接用的Irp->MdlAddress,
data=(UCHAR *)MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority); 处理过程中需要的内存在初始化时分配了固定单元,处理Irp时不会再用到这部分代码,程序卸载时释放所申请的内存。 处理完成后,调用IoCompleteRequest完成Irp Irp->IoStatus.status=STATUS_SUCCESS; Irp->IoStatus.info=transfer_len; IoCompleteRequest(Irp,IO_NO_INCREMENT); 虚拟的磁盘是一个网络磁盘,我注意到每次写一个文件时,系统的物理内存就少了一大块,再拷贝相同的文件(覆盖),物理内存不变,然后删除,物理内存不变,清空回收站,物理内存就恢复到原来的水平,可能是系统缓存用了这部分内存,但是本地硬盘拷贝,物理内存根本就没变化,为什么向我的磁盘拷的东西都被缓存起来了? |
|
12楼#
发布于:2002-06-03 14:50
only for guest..
the memory you use(MmGetSystemAddressForMdlSafe) has been MmProbeAndLockPages, because you code, system has no chance to call MmUnlockPages or MmUnlockPages failed. then it is keep in memory for ever. [编辑 - 6/3/02 by zdhe] |
|
13楼#
发布于:2002-06-03 16:46
终于找到原因了:
我用的是 data=(UCHAR *)MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority); 然后又用这个data指针调用IoAllowcateMdl 现在修改后我分了一个数组data1 memcpy(data1,data,len); 然后用data1来调用IoAllowcateMdl就没有物理内存减少的情况了。 我不直接把Irp->mdladdress传给下一步操作是因为在网络一次不能发送完数据时还要修改数据,重新建立新的MDL。 现在的问题是,为什么不能用从Irp->MdlAddress的来了虚拟地址做参数调用IoAllowcateMdl呢,我调用了AllowcatdMdl分配了mdl,但是使用完后我又释放了呀。采用数组这样拷来拷去毕竟降低了系统的性能呀。 |
|
14楼#
发布于:2002-06-03 17:02
guess:
for same system memory range, MmProbeAndLockPages called two time.( one by os and one by you(when allocate mdl)). MmUnlockPages only one time. -> by os. -> then it will be kept in memory for ever. you should not allocate mdl use same memory buffer. if think about performance, you can use mdl pool(mate yourself). |
|
15楼#
发布于:2002-06-04 09:56
你是说我对用IoAllowcateMdl分配的mdl调用MmUnlockPages没起作用?
|
|
16楼#
发布于:2002-06-04 22:14
显然你肯定没有释放分配的内存.看看你在高中断级调用时的内存分配,那部分内存不会自动的被内存管理器收集的.
|
|