glen_dai
发表于 2008-8-8 12:37:39
ACE_Handler::ACE_Handler (void)
: proactor_ (0), handle_ (ACE_INVALID_HANDLE)
{
ACE_Handler::Proxy *p;
ACE_NEW (p, ACE_Handler::Proxy (this)); // asynch_io.cpp (1059)
这个是在一开始分配5000个handler时候调的构造函数。
wishel
发表于 2008-8-8 12:48:27
这个只要最后结束时都释放掉就不会有内存泄漏。我现在公司登不上去看不了程序。
那几个singleton你用object manager管理了么,如果用了的话应该都会结束前自动释放。记得在singleton的析构函数中delete分配的资源。
昨天看程序,确实除了预分配的资源,其他地方并没有其他的动态new。
glen_dai
发表于 2008-8-8 12:56:49
typedef ACE_Unmanaged_Singleton<MsgBlockManager, ACE_Null_Mutex> MsgBlockManagerSingleton;
然后在程序结束的时候
MsgBlockManagerSingleton::close();
退出的时候资源都释放了,就是在服务器运行的时候,一有连接内存就会涨,一个连接大概涨个200字节把,要10多个连接就能看出进程的内存涨了,关闭连接后内存不会降下来。
直接用iocp做的话随便怎么连内存都不变啊。
wishel
发表于 2008-8-11 11:43:52
这两天比较忙,呵呵,有空帮你调一下看看
glen_dai
发表于 2008-8-11 16:56:47
:handshake
wishel
发表于 2008-8-26 21:54:41
抱歉最近比较忙,一直没有集中的时间帮你看程序。
楼主可以看下我的这个帖子
http://www.acejoy.com/bbs/viewthread.php?tid=755&extra=page%3D2
例子是ace(5.6)自带的example/Reactor/Proactor/test_proactor.cpp
可以看到例子中的void Receiver::open (ACE_HANDLE handle, ACE_Message_Block &message_block)
比你的程序中void ClientHandler::open(ACE_HANDLE new_handle, ACE_Message_Block &message_block)
多了一块if (message_block.length () != 0)的处理,我运行例子的时候,这个length是512,就是说,ACE_Service_Handler open的时候,开始Handle之前,是有收到acceptor传过来的数据的。为什么会这样很奇怪,例子中用了一个fake result来处理。
这里如果不处理,就会丢失那512字节的数据,这个我验证过的。
这512字节是怎么产生的我没有细看,假如没有走内存池,是new出来的,而且没有得到释放,就也会造成泄漏,每次新建链接都泄漏512。具体的你可以再看一下。