找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: glen_dai

服务器内存线性增长的问题,附工程~

[复制链接]
 楼主| 发表于 2008-8-7 14:47:22 | 显示全部楼层
谢谢楼上的讲解。 result.message_block()就是mReadMsgBlock,我在Reset里回收的。

void ClientHandler::Reset()
{
MsgBlockManagerSingleton::instance()->ReleaseMsgBlock(mReadMsgBlock);
mReadMsgBlock = NULL;
ACE_OS::shutdown(this->handle(), ACE_SHUTDOWN_BOTH);
ACE_OS::closesocket(this->handle());
this->handle(ACE_INVALID_HANDLE);
}
发表于 2008-8-7 17:12:28 | 显示全部楼层
问题是你在release该handler的时候没有调用该reset。(没看到你的handler manager的程序,猜的)
关于pool的是我的个人看法,大家多探讨吧。
 楼主| 发表于 2008-8-7 17:19:19 | 显示全部楼层
调用了。。。wishel兄如果有空帮我调试下那个程序:handshake用浏览器直接开链接,应该能进的
我想的是如果重复new,delete的话会产生内存碎片。

[ 本帖最后由 glen_dai 于 2008-8-7 17:22 编辑 ]
发表于 2008-8-7 22:00:36 | 显示全部楼层
汗。。太复杂了,好像把所有能用到的framework和pattern全用上了。我不大会用vc,看了看代码,发现一个小小的问题,根内存泄漏无关,就是ClientHandler的mWriter没有用上。
发表于 2008-8-7 22:41:25 | 显示全部楼层
但是看你的另一个帖子里的Visual Leak Detector的报错信息,很奇怪
---------- Block 14186 at 0x01DACBD8: 4 bytes ----------
  Call Stack:
    f:\rtm\vctools\crt_bld\self_x86\crt\src\newopnt.cpp (18): operator new
    d:\vendor\ace_wrappers\ace\asynch_io.cpp (1059): ACE_Handler::ACE_Handler
    d:\vendor\ace_wrappers\ace\asynch_acceptor.cpp (36): ACE_Asynch_Acceptor<ClientHandler>::ACE_Asynch_Acceptor<ClientHandler>
    f:\test\aceservertest\clientacceptor.cpp (8): ClientAcceptor::ClientAcceptor
    f:\test\aceservertest\main.cpp (21): ace_main_i
    f:\test\aceservertest\main.cpp (13): ACE_Main::run_i
    d:\vendor\ace_wrappers\ace\os_main.cpp (85): ACE_Main_Base::run
    f:\test\aceservertest\main.cpp (13): main
    f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (318): __tmainCRTStartup
    f:\rtm\vctools\crt_bld\self_x86\crt\src\crt0.c (187): mainCRTStartup
    0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
  Data:

好像是说ACE_Asynch_Acceptor用到了operator new,产生新的:ACE_Handler,而其实make_handler()方法已经被override,不会用到operator new。
难道是分析出错?
上面说 d:\vendor\ace_wrappers\ace\asynch_io.cpp (1059): ACE_Handler::ACE_Handler 用到operator new,明显是未被override时候才会调用的。
第1059行的内容: ACE_NEW (p, ACE_Handler::Proxy (this));
发表于 2008-8-7 22:44:02 | 显示全部楼层
你可以测一下是否真的调用到了自己写的那个make_handler(),比如改成打印一行信息然后强行结束程序
 楼主| 发表于 2008-8-8 09:38:30 | 显示全部楼层
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) new的是这个东西
  this->proxy_.reset (p);
}
make_handler()调的是重写的那个,这个跟踪过的。
mWriter不用他也没什么问题把。。
发表于 2008-8-8 09:45:53 | 显示全部楼层
可以这样测试一下:
开一个连接,分配了哪些内存,断开一个连接,应该释放哪些内存,在这些地方放一个打印信息,看是否执行了释放的操作。还有,请问你是怎么知道服务器并没有释放对方的连接内存资源的? 通过任务管理器来查看?
 楼主| 发表于 2008-8-8 09:53:09 | 显示全部楼层
额。。。是跟踪调试的。。。
发表于 2008-8-8 10:23:47 | 显示全部楼层
不用的东西最好注释掉,否则会影响程序的可读性。

如果确实没有用到,那么内存泄漏分析程序就有问题了,其他地方应该也不会调用到这个1059行的new。
另外c++标准并不保证相继new会分配连续的地址空间。虽然当程序刚开始运行时通常是这样,但并不一定。要确保连续空间最好重载operator new,利用placement new指定具体地址。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-4 22:17 , Processed in 0.020185 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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