求救!使用时遇到内存泄露

inz00001 发布于 2014/07/11 20:40
阅读 1K+
收藏 0
我实用CTcpServer作为服务端,该服务端维护一个ConnID数组,当收到OnAccept时,将ConnID放入数组,当收到OnClose、OnError、OnServershutdown等通知时,将相应的ConnID移出数组,以上对于数组的操作都做了同步;同时,我又开了一个线程不断地遍历这个数组,往每个ConnID发送数据包(约10kB/s);当我用Telnet客户端连接上述服务端后,能收到数据,但是服务端的内存在不断上涨,经过初步检查,似乎是某些PostSend后,完成端口没有返回,导致占用的私有堆内存未回收。
加载中
0
Athrob
Athrob
往每个ConnID发送数据包, 这里会不会没及时释放.
0
i
inz00001

引用来自“Athrob”的评论

往每个ConnID发送数据包, 这里会不会没及时释放.
不会,发送的数据都是同一个,不存在新开辟内存的情况
0
Athrob
Athrob

引用来自“Athrob”的评论

往每个ConnID发送数据包, 这里会不会没及时释放.

引用来自“inz00001”的评论

不会,发送的数据都是同一个,不存在新开辟内存的情况
适当位置加些sleep然后观察下内存变化
0
i
inz00001

其实现在就是2个常驻线程,一个是CTcpServer内部的用来调用GetQueuedCom...的,最终产生各种On...通知的;另一个是我定义的,不停地循环我的ConnID数组,发送数据至每个ConnID。

因为我不是很熟悉Telnet协议,比较担心的是这种情况:在某个时刻组件内部产生一个异常,还未来得及触发OnError,此时我的发送线程在往这个异常的ConnID上发数据,这种情况会不会导致完成端口不返回?或者返回很慢?或者必须等Telnet关闭才能返回?

 

0
优游幻世
优游幻世
http://msdn.microsoft.com/zh-cn/library/x98tx3cf.aspx看看有没有帮助
0
伤神小怪兽
伤神小怪兽

1、可能服务器程序有Bug,导致内存泄漏,好好调试

2、可能服务器程序处理性能不足,导致数据在组件中不断堆积,好好调试

另外,强烈建议用Get/SetConnectionExtra() 代替你的数组,详情参考HP-Socket开发指南

0
i
inz00001

引用来自“伤神小怪兽”的评论

1、可能服务器程序有Bug,导致内存泄漏,好好调试

2、可能服务器程序处理性能不足,导致数据在组件中不断堆积,好好调试

另外,强烈建议用Get/SetConnectionExtra() 代替你的数组,详情参考HP-Socket开发指南

我感觉可能是第2种原因,每次当内存占用上升时(例如上升到1G以上),我拔掉网线,内存就会逐渐往下降,大概20秒的样子,回到一开始的占用量。

请问您,针对第2中情况,该如何提升程序的健壮性呢?

0
伤神小怪兽
伤神小怪兽

引用来自“伤神小怪兽”的评论

1、可能服务器程序有Bug,导致内存泄漏,好好调试

2、可能服务器程序处理性能不足,导致数据在组件中不断堆积,好好调试

另外,强烈建议用Get/SetConnectionExtra() 代替你的数组,详情参考HP-Socket开发指南

引用来自“inz00001”的评论

我感觉可能是第2种原因,每次当内存占用上升时(例如上升到1G以上),我拔掉网线,内存就会逐渐往下降,大概20秒的样子,回到一开始的占用量。

请问您,针对第2中情况,该如何提升程序的健壮性呢?

控制发送速度,如:GetPendingData() 超过某个数值时暂停发送。
0
i
inz00001

引用来自“伤神小怪兽”的评论

1、可能服务器程序有Bug,导致内存泄漏,好好调试

2、可能服务器程序处理性能不足,导致数据在组件中不断堆积,好好调试

另外,强烈建议用Get/SetConnectionExtra() 代替你的数组,详情参考HP-Socket开发指南

引用来自“inz00001”的评论

我感觉可能是第2种原因,每次当内存占用上升时(例如上升到1G以上),我拔掉网线,内存就会逐渐往下降,大概20秒的样子,回到一开始的占用量。

请问您,针对第2中情况,该如何提升程序的健壮性呢?

引用来自“伤神小怪兽”的评论

控制发送速度,如:GetPendingData() 超过某个数值时暂停发送。
非常感谢!
返回顶部
顶部