找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: 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时候调的构造函数。
发表于 2008-8-8 12:48:27 | 显示全部楼层
这个只要最后结束时都释放掉就不会有内存泄漏。我现在公司登不上去看不了程序。
那几个singleton你用object manager管理了么,如果用了的话应该都会结束前自动释放。记得在singleton的析构函数中delete分配的资源。
昨天看程序,确实除了预分配的资源,其他地方并没有其他的动态new。
 楼主| 发表于 2008-8-8 12:56:49 | 显示全部楼层
typedef ACE_Unmanaged_Singleton<MsgBlockManager, ACE_Null_Mutex> MsgBlockManagerSingleton;

然后在程序结束的时候
        MsgBlockManagerSingleton::close();

退出的时候资源都释放了,就是在服务器运行的时候,一有连接内存就会涨,一个连接大概涨个200字节把,要10多个连接就能看出进程的内存涨了,关闭连接后内存不会降下来。
直接用iocp做的话随便怎么连内存都不变啊。
发表于 2008-8-11 11:43:52 | 显示全部楼层
这两天比较忙,呵呵,有空帮你调一下看看
 楼主| 发表于 2008-8-11 16:56:47 | 显示全部楼层
:handshake
发表于 2008-8-26 21:54:41 | 显示全部楼层
抱歉最近比较忙,一直没有集中的时间帮你看程序。
楼主可以看下我的这个帖子
http://www.acejoy.com/bbs/viewth ... &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。具体的你可以再看一下。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 17:26 , Processed in 0.015763 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表