sha*_*oth 8 c++ memory heap visual-c++
我正在开发一个VC++ NT服务,该服务旨在持续运行数月.它密集使用VC++运行时堆.很明显,堆碎片在某些时候会导致它出现故障(认为它是内存不足).
我可以在我的服务上运行哪些测试来估计它容易出现堆碎片的程度?
您已经得到了几个答案,讨论如何防止堆碎片问题,但两者都没有直接解决您的问题.估计碎片问题的可能性的几乎唯一方法是模拟大量使用,并测量你得到的碎片.
由于它是一种NT服务,因此模拟使用数月主要包括匆忙提出大量请求.有可能您可以比通常预期的更快地发出请求,因此您可以在几个小时内模拟几个月的请求,甚至可能更少(取决于您通常期望接收请求的速率) ).
一旦你模拟了几个月的工作(或者甚至在你这样做的时候),你需要查看堆,看看你得到了多少碎片.这并不容易,但通常是可能的.您将首先在服务进程中注入一个线程(在线程注入上搜索"或该命令中的某些内容应获得相当多的信息).然后你需要走遍堆,寻找(特别是)可用的块,但是太小而不能满足大多数请求.假设您正在使用MS VC++,那么您将使用_heapwalk遍历堆,并且它将遍历堆,告诉您堆中每个块的地址,大小和状态(空闲或正在使用).
最后一个细节:为了产生有意义的结果,包含注入线程的可执行文件和DLL都必须链接到DLL中的运行时库.这意味着整个进程将有一个堆,因此您注入的线程将遍历您的服务使用的堆.如果静态链接标准库,则DLL和服务都将拥有自己的堆.DLL将遍历自己的堆,这将告诉您服务进程正在使用的堆.
我想最好的方法是编写自己的内存管理器(或购买一个)来提供这些数据。任何其他方式都会改变堆本身,从而使结果无效。
一个更容易实现的策略是分配不同大小的内存块并等待失败 - 但我认为这不是一个好方法。不管怎样——块大小越大,这不会失败,碎片就越少。但根据内存管理器的不同,分配块可能会改变结果。
编辑:我找到了一个关于slab分配器的链接(感谢评论)显示了统计数据。虽然它是德语的,但该文章的英文版不包含那么多信息。使用 babelfish 进行翻译。
http://de.wikipedia.org/wiki/Slab_allocator(babelfish 版本)
http://www.usenix.org/event/usenix01/full_papers/bonwick/bonwick.pdf