内存泄露,大家提提建议

mahatma_cn 2008-11-18 10:32:52
系统运行一段时间后,出现未分页内存泄露的问题,一旦该问题出现,一定要重启服务器才行,停止进程不能解决问题。
这个问题现在初步定位在网络层,即重叠方式网络工作模式,出现著名的10055错误,即系统未分页内存不足,有解决方案但是短时间内很难验证。
由于系统未分页内存有限(默认为系统物理内存25%左右),且一旦出现根本没有方法进行释放,造成很多硬件的驱动
不能正常工作(甚至由此造成蓝屏)

问题来了:
谁详细解释下面几个值:
Pool Nonpaged bytes
Pool Nonpaged allocs
进程\Pool Nonpaged bytes

通过判断哪些值可知未分页内存不足了?
从何知道未分页内存总数和已使用数(或剩余数)?
如何知道进程占用的未分页内存数?
...全文
204 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
taianmonkey 2008-11-30
  • 打赏
  • 举报
回复
首先,使用drwtsn32 抓一个dump文件下来!
然后使用windbg,分析一下!使用 !poolused命令
feeboby 2008-11-21
  • 打赏
  • 举报
回复
lz 可用用poolmon 工具来确定使用了多大的nonpaged pool
可以看每个tag 分配了多少的nonpaged pool
yc_8301 2008-11-18
  • 打赏
  • 举报
回复
好多星级大侠呀,友情up
zhoujianhei 2008-11-18
  • 打赏
  • 举报
回复
《深入解析windows操作系统》第四版有详细的介绍,依我看你不会在上面找到答案。
还是检查你的代码,尽量少的使用非分页内存,只有当IRQL大于等于DISPATCH_LEVEL时才使用非分页内存,另外也可以将分页内存锁定来将其临时添加进入非分页池。
laolaoliu2002 2008-11-18
  • 打赏
  • 举报
回复
未分页池(nonpaged pool)是常驻内存的虚拟内存页设置,能被随时访问并且不造成分页错误。设备驱动和操作系统内核使用它存储那些必须常驻物理内存并且不得分页存储到硬盘上的数据结构。

未分页池有两种类型:一种作为通常的使用,令一种小的部分(4页)留给紧急状态当未分页池满并且调用者无法忍受分配的失败。单处理器系统有3个未分页池,多处理器系统有5个未分页池。

未分页池有容量极限:Windows NT-128MB,Windows 2K-256MB。内核函数和设备驱动如果需要实时内存缓冲并不允许它分页到当前系统之外,就得从未分页池中分配内存。如果程序在这个分配过程存在着内存泄漏,它终将耗尽所有的未分页池空间,并导致之后对未分页池的请求失败,最后未分页池越界造成当前操作系统蓝屏。



http://www.winos.cn/113235/viewspace-2831
laolaoliu2002 2008-11-18
  • 打赏
  • 举报
回复
就Win32平台而言,操作系统(就是Windows!)显式地提供了堆管理(分配、释放)API函数支持(如:HeapAlloc, GetProcessHeap, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc, HeapSize等),这些函数给我们如下信息:在进程(我们可以理解为运行中的程序)的地址空间(是一个逻辑地址空间概念,以后我会专门解释)存在一个叫堆的内存空间可供程序使用(实际上,Win32为每个进程保留了一个缺省堆,其尺寸可以在程序的链接过程中通过参数来改变。另外还可创建新的供本进程使用的堆,正如API函数HeapCreate所作的工作那样),C库函数malloc、free就在内部通过调用系统提供的API堆管理函数为程序提供内存分配、释放。那Win32是如何能够做到释放的完整无误的呢,这个以后再讨论(但显然应该为每次内存分配予以记帐,这样就能在释放空间时做到准确(不会多也不会少释放空间))。其它操作系统也通过相应的系统功能调用来提供类似的功能。(关于内存管理)那么操作系统是如何管理进程的存储空间甚至其他系统资源(如代表打开的文件对象的句柄)的呢?因为这个问题不搞清楚,你就会有疑虑:我的程序运行结束后,如果操作系统不能完全释放本程序所占有的资源(泛指存储空间及其它系统资源,下同)?那么我们的程序多次运行,或其他具有类似问题的应用程序的经常运行就会逐渐耗尽系统的资源,从而导致系统不得不重启。从这里也可以看出,一个操作系统能够多长时间不需重启能够反映出该操作系统在资源管理方面的能力,是系统健壮性的重要体现,因为尽管程序员们在程序设计时程序力图避免未释放的资源,但总不免有不是做得很好的,而且这种可能几乎是必然的,因此在操作系统设计时就应该对进程资源管理进行重点考虑,怎么又扯到操作系统的设计上去了,跑题了!那么我们来看一下Win32对进程占用资源的管理,关键是考察系统在正常或非正常结束一个进程所做的,就会做到心中有数了。我们知道,现代操作系统几乎都运行保护模式下,保护模式的一个基本特征就是存储保护,存储保护的基本目标就是使各个进程的地址空间相互隔离,从而一个进程不能看见其它进程的数据(当然,为了共享目的而设立的共享存储区除外),其基本实现机制是分段、分页。分段使得各个进程运行在存储器的不同部分,对于越界的访问企图都被CPU硬件予以拒绝。分页的基本功能使得各个进程的地址空间的页(一种固定大小内存块,在x86平台上是4K)通过CPU硬件透明地映射到不同的物理内存页帧,从而实现自动隔离。考虑到各种平台的可移植性,Windows系统采用分页而非分段的平板式的内存管理模型,这种模型有一个好处,使得对于象C这种支持指针的语言给程序员提供一个连续的内存空间印象。无论是分段还是分页,都给操作系统提供了的内存回收提供了便利条件,操作系统只需重置描述该进程的段或页的信息就可以释放掉该进程所占用的内存空间资源而为以后的进程再利用,当然考虑到内存碎片的问题,内存的回收在实际操中可能更为复杂一些。总之一句话,操作系统要释放一个进程所占有的内存空间是能够做到的。(关于系统其它资源管理)还有一个问题就是进程在运行中还要用到操作系统提供的其它资源对象(如文件),操作系统能不能回收这些资源呢。谨慎的程序员会在程序设计时可能不会忘记显式的通知(通过相应的释放系统功能调用)操作系统本进程将不在占用该资源,操作系统应该作相应的处理。但情况并不总是这样乐观,粗心的程序员或者是程序异常终止(比方说出现问题被操作系统给kill掉)总是不能正常释放所占有的这些系统资源。因此,操作系统通过记帐进程所使用的系统资源,在进程结束时一一查看这些资源,予以强制释放。以Win32平台为例,它为每个进程维护一个句柄表,这些句柄包含指向相应系统资源对象的指针,在进程终止时,操作系统的进程终止进程查看这个句柄表,强制释放进程已打开的的系统资源。可以通过如下一个实例来测试:创建一个进程,该进程打开一个文件对象(设置为非删除共享方式),该进程进入死循环,这时你在资源管理器中删除刚才被打开的文件就会失败,接着你通过kill进程的方式来终止该进程,再删除该文件成功。这个实例说明Win32在进程非正常终止时的确能够释放该进程所占有的系统资源。能够很好做到第一层的程序员就已经很优秀了!第二层就是,你对编译器、操作系统的内存管理有相当了解,但又没有透彻了解,从而怀疑他们的管理能力;或者你知道了它的实现详细算法,发现了潜在的缺点(这种可能性似乎不大耶!),于是你有点不放心起来,想:我能不能申请一片内存,通过我自己来管理呢,毕竟我自己管理我自己心里最清楚、最放心,答案是肯定的,起码Win32平台就为你提供了这种可能性,请参阅有关Win32 API(VirtualAlloc,VirtualFree等)。这种另起炉灶的思想在某些情况下是很有用的,比方说要设计长时间运行的服务程序时;另外在Windows内核驱动程序设计时对非分页内存空间的使用,Microsoft公司就鼓励这种方式。不过对这种做法,很多人持有不同见解,认为这破坏了分层思想,不符合软件也积木化的发展潮流。
KeSummer 2008-11-18
  • 打赏
  • 举报
回复
windbg

参考章节:
Kernel-Mode Memory Leaks

参考指令:
!poolused

The !poolused extension displays memory use summaries, based on the tag used for each pool allocation.

Here is a partial example of the output from this extension:

0: kd> !poolused
Sorting by Tag

Pool Used:
NonPaged Paged
Tag Allocs Used Allocs Used
1394 1 520 0 0UNKNOWN pooltag '1394', please update pooltag.txt
1MEM 1 3368 0 0UNKNOWN pooltag '1MEM', please update pooltag.txt
2MEM 1 3944 0 0UNKNOWN pooltag '2MEM', please update pooltag.txt
3MEM 3 248 0 0UNKNOWN pooltag '3MEM', please update pooltag.txt
8042 4 3944 0 0PS/2 kb and mouse , Binary: i8042prt.sys
AGP 1 344 2 384UNKNOWN pooltag 'AGP ', please update pooltag.txt
AcdN 2 1072 0 0TDI AcdObjectInfoG
AcpA 3 192 1 504ACPI Pooltags , Binary: acpi.sys
AcpB 0 0 4 576ACPI Pooltags , Binary: acpi.sys
AcpD 40 13280 0 0ACPI Pooltags , Binary: acpi.sys
AcpF 6 240 0 0ACPI Pooltags , Binary: acpi.sys
AcpM 0 0 1 128ACPI Pooltags , Binary: acpi.sys
AcpO 4 208 0 0ACPI Pooltags , Binary: acpi.sys

...

WmiG 30 6960 0 0Allocation of WMIGUID
WmiR 63 4032 0 0Wmi Registration info blocks
Wmip 146 3504 182 18600Wmi General purpose allocation
Wmit 1 4096 7 49480Wmi Trace
Wrpa 2 720 0 0WAN_ADAPTER_TAG
Wrpc 1 72 0 0WAN_CONN_TAG
Wrpi 1 120 0 0WAN_INTERFACE_TAG
Wrps 2 128 0 0WAN_STRING_TAG
aEoP 1 672 0 0UNKNOWN pooltag 'aEoP', please update pooltag.txt
fEoP 1 16 0 0UNKNOWN pooltag 'fEoP', please update pooltag.txt
hSVD 0 0 1 40Shared Heap Tag , Binary: mrxdav.sys
hibr 0 0 1 24576UNKNOWN pooltag 'hibr', please update pooltag.txt
iEoP 1 24 0 0UNKNOWN pooltag 'iEoP', please update pooltag.txt
idle 2 208 0 0Power Manager idle handler
jEoP 1 24 0 0UNKNOWN pooltag 'jEoP', please update pooltag.txt
mEoP 1 88 0 0UNKNOWN pooltag 'mEoP', please update pooltag.txt
ohci 1 136 0 01394 OHCI host controller driver
rx.. 3 1248 0 0UNKNOWN pooltag ' rx', please update pooltag.txt
sidg 2 48 0 0GDI spooler events
thdd 0 0 1 20480DirectDraw/3D handle manager table
usbp 18 77056 2 96UNKNOWN pooltag 'usbp', please update pooltag.txt
vPrt 0 0 18 68160UNKNOWN pooltag 'vPrt', please update pooltag.txt
TOTAL 3570214 209120008 38769 13066104
Pipi0714 2008-11-18
  • 打赏
  • 举报
回复
没有楼住高,没有做过驱动。

估计肯定出线内存泄露的情况,因此你判断出未分页内存不足又能如何重新启动电脑?
好好查查你的驱动的代码,查找问题的根本所在
csgdseed 2008-11-18
  • 打赏
  • 举报
回复
up

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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