从上周开始,我正试图从我的项目中修复一个奇怪的内存消耗。我们有一个日志系统,它有两个线程,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中接收到信号,甚至在删除数据后,消耗量也不会减少。