开发者社区> 问答> 正文

内存泄露

你好!
      在使用OSS的C接口时,库oss_c_sdk_lib.lib里有内存泄露,请问应该怎么解决???

{230} normal block at 0x006A9F08, 8 bytes long.
Data: < P      > A4 50 81 0F 00 00 00 00
{229} normal block at 0x006A9ED0, 8 bytes long.
Data: < P      > 88 50 81 0F 00 00 00 00
{228} normal block at 0x006A9E98, 8 bytes long.
Data: <lP      > 6C 50 81 0F 00 00 00 00
{227} normal block at 0x006A9E60, 8 bytes long.
Data: <PP      > 50 50 81 0F 00 00 00 00
{226} normal block at 0x006A9E28, 8 bytes long.
Data: <4P      > 34 50 81 0F 00 00 00 00
{225} normal block at 0x006A9DF0, 8 bytes long.
Data: < P      > 18 50 81 0F 00 00 00 00
{224} normal block at 0x006A9DB8, 8 bytes long.
Data: < O      > FC 4F 81 0F 00 00 00 00
{223} normal block at 0x006A9D80, 8 bytes long.
Data: < O      > E0 4F 81 0F 00 00 00 00

展开
收起
guyuewuhua 2015-12-07 10:58:57 10782 0
3 条回答
写回答
取消 提交回答
  • 回 9楼(guyuewuhua) 的帖子
    您好,您能将逻辑简化成测试程序,看看是否能重现内存泄漏的问题。测试程序最好不要引入mfc,而是直接调用oss c sdk的接口来重现问题。
    2015-12-07 16:06:02
    赞同 展开评论 打赏
  • Re内存泄露
    我的客户端比较简单,
    用MFC开发的一个窗口程序,然后自己用dll封装了一下oss 的c接口库(没有实际的内存分配),窗口程序直接调用dll,
    什么操作都不做的话(aos_http_io_initialize()这个都没有调用 ),只要一加载dll,调试程序,结束时,都有内存泄露。
    找了好久,找不到原因,vs 的性能测试工具,可以看到oss的c接口里有内存调用,如下所示:

    -------------------------

    Re内存泄露
    还有一个问题,调用接口getobjecttofile后,程序的内存大小没啥变化
    调用getobjecttobuffer后,客户端的内存狂涨,没有释放,这个啥原因啊?请指教!!

    -------------------------

    Re内存泄露




    是这样做的,还有是泄露。。。。

    -------------------------

    Re内存泄露
    getObjectToBuffer这个接口中,
    aos_list_t buffer;    
    aos_list_init(&buffer);
    s = oss_get_object_to_buffer(options, &bucket, &object, headers, &buffer, &resp_headers);
    请问这个双向链表buffer,内存在哪儿释放???

    -------------------------

    Re内存泄露
    我的方案:
    获取object的大小,然后按5M一块来分割object至多块,每一块都往消息队列里扔,开多个线程来抢消息队列里的块,然后调用 oss_get_object_to_buffer,总得来说
    测试的object大小为1M左右,第一次下载完一整个object,内存多了10M,后面每操作一次,内存都增加1M左右内存。。
    测试的object大小为250M左右,第一次下载完一整个object,内存多了40-60M,后面每操作一次,内存都增加1M-6M内存。。

    -------------------------

    Re内存泄露
    我这个程序,后面要实时运行,这样的话,内存迟早会被占满了。

    -------------------------

    Re内存泄露
    我测试了,你们提供的demo,test_get_object_to_buffer()
    aos_pool_destroy这个调用后,程序的内存没有下降。
    最终调用aos_http_io_deinitialize();这个函数,内存才会降下来,最终程序结束,这个是能否解释一下原因啊???

    -------------------------

    Re内存泄露

    -------------------------

    Re内存泄露
    我加你了,麻烦你加我一下, guyuewuhua@163.com,谢谢
    2015-12-07 12:42:40
    赞同 展开评论 打赏
  • 回 楼主(guyuewuhua) 的帖子
    能说一下你使用的场景吗?c sdk所有的内存分配都是在apr memory pool上面的,您的代码是否有在pool之外申请内存

    -------------------------

    回 3楼(guyuewuhua) 的帖子
    getobjecttofile下载的内容存放到文件中,而getobjecttobuffe下载的内容是存放在内存中的。oss c sdk操作时用户需要首先aos_pool_create(&p, NULL);申请一块内存,后面所有的操作都会在这个pool上面,最后需要用户调用aos_pool_destroy(p)进行释放。建议每个操作都申请一个memory pool,然后操作结束后理解aos_pool_destroy释放掉

    -------------------------

    回 6楼(guyuewuhua) 的帖子
    这个双向链表的结点也是在memory pool里面申请的,最后都会随着memory pool释放掉,你是否可以在你的AosPoolMgr打印一下什么时候释放这个pool。另外,你是否可以写一个类似while循环这样的case,如果一直调用oss_get_object_to_buffer,看内存是否一直增长。这个也有可能和操作系统真的释放内存策略有关系

    -------------------------

    回 10楼(oss-dev) 的帖子
    简化一下测试逻辑吧,暂时不要引入多线程抢,就一个线程,每次下载完整的一个文件,多跑几次,注意每次下载一个文件的时候AosPoolMgr是否都会释放memory pool

    -------------------------

    回 13楼(guyuewuhua) 的帖子
    私信您了,您方便的话我们旺旺联系一下,论坛效率比较低,耽误您时间

    -------------------------

    回 13楼(guyuewuhua) 的帖子
    您也可以用vc提供的CRT检测一下,我之前跑过,没有发现有内存泄露问题。apr库的内存池申请一大块内存,何时真正还给操作系统和apr库有关系,最后在aos_http_io_deinitialize();时会做一些清理工作。方便的话您直接旺旺我,联系方式已经私信您
    2015-12-07 11:09:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JVM的GC 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载