Details
-
Bug
-
Resolution: Out of scope
-
P2: Important
-
None
-
6.7.2
-
None
-
Linux - Centos 9
Description
QMap not release memory to OS after program running for a while.
I have create a simple situation.
- Create a 100 threads, each thread loop 10000 and doing 2 two function below
inline void raiseMemory(const qint64 numLoops) { auto data = QMap<std::string, QByteArray>({}); for (int i = 0; i < numLoops; ++i) { data.insert(std::to_string(i), QByteArray(1024, 'D')); } } inline void raiseCpu(const qint64 numLoops) { uint64_t sum = 0; for (uint64_t i = 0; i < numLoops; ++i) { sum += i * i % 123456789; } }
- The main thread:
// [1] Start threads qInfo() << "Sleeping for 3s before starting threads"; QThread::msleep(3000); qInfo() << "Starting threads"; QList<QThread*> threads; for (int i = 0; i < inArgs.numThreads; ++i) { QThread* thread = QThread::create([&inArgs]() { raiseCpu(inArgs.numLoops); raiseMemory(inArgs.numLoops); }); threads.append(thread); thread->start(); }// [2] Wait for threads to finish for (QThread* thread : threads) { thread->wait(); } qInfo() << "All threads finished. Sleeping for 3s before deleting threads."; QThread::msleep(3000);// [3] Delete threads for (QThread* thread : threads) { delete thread; } qInfo() << "All threads deleted. Sleeping for 3s before finishing."; QThread::msleep(3000);
After running I got a chart – the memory does not go down
I replaced QMap with QVector, QList and the memory will drop immediately when the threads finish their work.
I checked Qt documentation but couldn't find any documentation related to this issue.
And I think this is Qt BUG as the behavior of each container class is different.
Please check this out
My sample source code attached below