奇怪的记忆消耗

时间:2018-04-12 06:31:09

标签: c++ memory memory-leaks stl out-of-memory

从上周开始,我正试图从我的项目中修复一个奇怪的内存消耗。我们有一个日志系统,它有两个线程,thread1用于收集数据,thread2用于解析数据并写入文件。当用户想要写入数据时,他将通知thread1。 thread1将创建以下Job类并传递Data* deque

的引用
class Job
{
    public:
    Job(std::deque<Data*> & Job)
    {
        m_dataHolder = new DataContainer();

        for (auto & pData : Job)
        {
            m_dataHolder->Add(pData->Clone());
        }
    }

    ~Job()
    {
       delete m_dataHolder;
    }

    void clear()
    {
       delete m_dataHolder;
       m_dataHolder = NULL;
    }

    void write()
    {
       if (NULL != m_dataHolder)
       {
           serialize_data();
           file_write();
       }
    }
};

这里thread1正在创建Data *的副本。现在thread1将此对象传递给thread2并使用pthread_kill()唤醒线程。当我们在队列中有50k记录时,问题就开始了,当我们创建副本时,内存使用率上升到90%并且不会减少。 thread2示例代码如下所示

class FileOperationsWorker()
{
    public:
    void SignalEvent(uint32_t SignalNumber)
    {
        ExecuteeMutex.lock();
        while (JobQueue.size() > 0)
        {
            Job* pNextJob = JobQueue.front();
            JobQueue.pop_front();
            ExecuteeMutex.unlock();

            pNextJob->Write();

            delete pNextJob;
            ExecuteeMutex.lock();
        }
        JobQueue.clear();
        ExecuteeMutex.unlock();
    }

    void AddJob(Job* pJob)
    {
        ExecuteeMutex.lock();
        JobQueue.push_back(pJob);
        ExecuteeMutex.unlock();
        pthread_kill(ThreadId, Signal);
    }
    std::deque<Job*> JobQueue;
};

我修改了thread2 AddJob()方法,如下所示

   void AddJob(Job* pJob)
   {
        ExecuteeMutex.lock();
        JobQueue.push_back(pJob);
        pJob->clear();
        ExecuteeMutex.unlock();
        pthread_kill(ThreadId, Signal);
    }

当我清除pJob-&gt; clear()时,内存消耗减少并恢复正常使用。但收到信号后,我尝试了同样但不减少内存。另一个观察是下一次继续文件写入不会增加内存(它将保持在90%)。我的问题是STL容器是否会缓存内存?还是linux进程会缓存内存?在给出该信号后没有执行其他代码。一旦在thread2中接收到信号,甚至在删除数据后,消耗量也不会减少。

0 个答案:

没有答案