【问题标题】:Process size growing in multi thread application多线程应用程序中的进程大小增长
【发布时间】:2018-09-13 14:55:46
【问题描述】:

我需要一些解决方案来解决这个问题。 在处理更多请求后,在我的应用程序的不同线程中新建和删除进程大小会增长并且不会下降。

伪代码:

Main () {
    Thread1 enter
    Creating object and inserting into map.
    Thread1 exit

    Thread2 enter
    Itherating to the map and creating child thread based on the no of object in the map.
    Thread2 exit

    Child thread calling the function at the end deleting the object.
}

在 Thread1 中创建的对象在使用 Thread2 生成的子线程中删除。

上述方法是否可以。我是否犯了任何错误。 因为当地图中物体的数量增加时。 即使在删除所有分配的对象并清除映射后,进程大小也会迅速增长。 谁能告诉我进程大小增长的原因可能是什么。
更新:


有更新。我已经使用泄漏检测器 libumem 工具检查了该过程。什么都不显示。

当传入流量和删除率相等时,进程大小不会增长。 进程大小仅在流量大的情况下才会增加。 例子: 传入流量4000,删除率100 进程大小增加。 在处理和删除所有请求后,预计进程大小会恢复正常但不会恢复正常。 另一个观察是我第一次发送 10k 请求 内存增加不下来 然后我再次发送 10k 请求,这次进程大小没有增加。 第一次迭代增加的内存被重用。 是否与操作系统行为有关?

【问题讨论】:

  • 不要使用new和delete。它们的滥用会导致内存泄漏。如果您确实需要动态分配,请改用智能指针。
  • 如果必须使用 new 和 delete,请查找内存分析器,如 valgrind
  • 您是在地图中放置指向对象的指针,还是将对象复制到地图中?
  • 方法好吗?创建瞬态线程闻起来很奇怪,这很少是使用它们的最佳方式。你有没有犯任何错误?如果是这样,它们可能在您的实现中,但您没有显示(尽管不可否认,线程代码的 MCVE 并不容易)
  • EvilTeach ,我将对象放入地图中

标签: c++ multithreading


【解决方案1】:

这就是标准库管理内存的方式。 从系统获取内存是非常昂贵的,所以它不会立即返回系统,因为很有可能很快会再次需要它。

线程也不会立即释放,因为创建它们是一个昂贵的过程。因此,当std::thread 完成时,实际线程只是被移动到线程池以供将来重用。

这个标准库行为相当广泛和复杂。

但是,如果您的程序不断增长(不要停在某个水平), 那么您的应用程序中肯定存在内存泄漏。 在这种情况下,我建议使用一些工具来检测内存泄漏,例如 clang address sanitizer 非常棒。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多