【问题标题】:Too much memory allocated by curl (memory cached by libcurl)curl分配的内存过多(libcurl缓存的内存)
【发布时间】:2014-01-29 20:06:26
【问题描述】:

我们将 LibCurl 用于我们的机顶盒应用程序。它用于多线程环境,我们可以同时打开多个 curl 句柄,但我们会在下载完成后立即关闭它。

似乎在打开 curl 句柄时(无论我们下载多少),curl 分配了一些内存,随着 curl 句柄数量的增加而增加(我测试了一个有 100 个线程的场景 --- 其中大约 30Mb 的内存是提前分配)。 (只要我们调用curl_easy_init()---内存中有跳转,句柄销毁后没有释放)

在我们的应用程序中,例如:一个 curl 句柄可能仅用于查看服务器是否已启动 --- 但即使这样也会占用我们的内存。

在我们的场景中,内存非常重要。所以,我们不希望 curl 提前缓存那么多内存。

有什么建议可以帮助我们减少curl缓存的内存吗?

【问题讨论】:

  • 你已经用 3 种语言标记了它……是哪一种?
  • 你看过 curl_easy_cleanup(curl); 吗?
  • 是的,每次使用后我们都会清洁卷曲手柄。
  • --- 但是我们在不同的线程中有 8 个 curl 句柄,这些句柄在应用程序关闭之前一直处于打开状态......

标签: c memory libcurl


【解决方案1】:

http://curl.haxx.se/libcurl/c/curl_easy_init.html

在多线程案例中查看所描述的问题。 引用:

此函数必须是第一个调用的函数,它返回一个 CURL 简单句柄,您必须将其用作其他简单函数的输入。 curl_easy_init 初始化 curl,并且此调用必须在操作完成时对 curl_easy_cleanup(3) 进行相应的调用。

如果您还没有调用 curl_global_init(3),curl_easy_init(3) 会自动调用。这在多线程的情况下可能是致命的,因为 curl_global_init(3) 不是线程安全的,并且由于没有相应的清理可能会导致资源问题。

强烈建议您不要允许这种自动行为,请自行正确调用 curl_global_init(3)。该函数的使用方法详见全局环境要求的libcurl(3)中的描述。

【讨论】:

  • 我们调用 curl_global_init(),在模块的开头带有选项 CURL_GLOBAL_NOTHING,在结尾处使用 curl_global_cleanup ()。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多