Commit 327d0886 authored by Simon Hausmann's avatar Simon Hausmann Committed by Simon Hausmann
Browse files

Reduce memory pressure on system malloc when allocating large items on the GC heap


Try to free our large items for every 8 megabytes of additional large item
memory we allocate. This helps in particular on 32-bit builds and was noticable
in tst_qqmlecmascript::push_and_shift().

Change-Id: I4cc0b188e58ccaf32026e38c7aaf1cfadc83148b
Reviewed-by: default avatarLars Knoll <lars.knoll@digia.com>
parent 57e54071
No related merge requests found
Showing with 7 additions and 0 deletions
...@@ -104,6 +104,7 @@ struct MemoryManager::Data ...@@ -104,6 +104,7 @@ struct MemoryManager::Data
}; };
LargeItem *largeItems; LargeItem *largeItems;
std::size_t totalLargeItemsAllocated;
GCDeletable *deletable; GCDeletable *deletable;
...@@ -120,6 +121,7 @@ struct MemoryManager::Data ...@@ -120,6 +121,7 @@ struct MemoryManager::Data
, maxShift(6) , maxShift(6)
, maxChunkSize(32*1024) , maxChunkSize(32*1024)
, largeItems(0) , largeItems(0)
, totalLargeItemsAllocated(0)
, deletable(0) , deletable(0)
{ {
memset(smallItems, 0, sizeof(smallItems)); memset(smallItems, 0, sizeof(smallItems));
...@@ -185,6 +187,9 @@ Managed *MemoryManager::allocData(std::size_t size) ...@@ -185,6 +187,9 @@ Managed *MemoryManager::allocData(std::size_t size)
// doesn't fit into a small bucket // doesn't fit into a small bucket
if (size >= MemoryManager::Data::MaxItemSize) { if (size >= MemoryManager::Data::MaxItemSize) {
if (m_d->totalLargeItemsAllocated > 8 * 1024 * 1024)
runGC();
// we use malloc for this // we use malloc for this
MemoryManager::Data::LargeItem *item = static_cast<MemoryManager::Data::LargeItem *>( MemoryManager::Data::LargeItem *item = static_cast<MemoryManager::Data::LargeItem *>(
malloc(Q_V4_PROFILE_ALLOC(m_d->engine, size + sizeof(MemoryManager::Data::LargeItem), malloc(Q_V4_PROFILE_ALLOC(m_d->engine, size + sizeof(MemoryManager::Data::LargeItem),
...@@ -193,6 +198,7 @@ Managed *MemoryManager::allocData(std::size_t size) ...@@ -193,6 +198,7 @@ Managed *MemoryManager::allocData(std::size_t size)
item->next = m_d->largeItems; item->next = m_d->largeItems;
item->size = size; item->size = size;
m_d->largeItems = item; m_d->largeItems = item;
m_d->totalLargeItemsAllocated += size;
return item->managed(); return item->managed();
} }
...@@ -476,6 +482,7 @@ void MemoryManager::runGC() ...@@ -476,6 +482,7 @@ void MemoryManager::runGC()
memset(m_d->allocCount, 0, sizeof(m_d->allocCount)); memset(m_d->allocCount, 0, sizeof(m_d->allocCount));
m_d->totalAlloc = 0; m_d->totalAlloc = 0;
m_d->totalLargeItemsAllocated = 0;
} }
size_t MemoryManager::getUsedMem() const size_t MemoryManager::getUsedMem() const
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment