Reviewed by Cameron Zwarich.
Changed MarkedSpace to delegate grow/shrink decisions to Heap
https://bugs.webkit.org/show_bug.cgi?id=53759
SunSpider reports no change.
* runtime/Heap.cpp:
(JSC::Heap::Heap):
(JSC::Heap::reset):
* runtime/Heap.h: Reorganized a few data members for better cache locality.
Added a grow policy.
* runtime/MarkedSpace.cpp:
(JSC::MarkedSpace::allocate):
(JSC::MarkedSpace::sweep):
(JSC::MarkedSpace::reset): Don't shrink automatically. Instead, wait for
the heap to make an explicit sweep call.
* runtime/MarkedSpace.h:
(JSC::MarkedSpace::highWaterMark):
(JSC::MarkedSpace::setHighWaterMark): Use a watermark to determine how
many bytes to allocate before failing and giving the heap an opportunity
to collect garbage. This also means that we allocate blocks on demand,
instead of ahead of time.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@77612
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2011-02-03 Geoffrey Garen <ggaren@apple.com>
+
+ Reviewed by Cameron Zwarich.
+
+ Changed MarkedSpace to delegate grow/shrink decisions to Heap
+ https://bugs.webkit.org/show_bug.cgi?id=53759
+
+ SunSpider reports no change.
+
+ * runtime/Heap.cpp:
+ (JSC::Heap::Heap):
+ (JSC::Heap::reset):
+ * runtime/Heap.h: Reorganized a few data members for better cache locality.
+ Added a grow policy.
+
+ * runtime/MarkedSpace.cpp:
+ (JSC::MarkedSpace::allocate):
+ (JSC::MarkedSpace::sweep):
+ (JSC::MarkedSpace::reset): Don't shrink automatically. Instead, wait for
+ the heap to make an explicit sweep call.
+
+ * runtime/MarkedSpace.h:
+ (JSC::MarkedSpace::highWaterMark):
+ (JSC::MarkedSpace::setHighWaterMark): Use a watermark to determine how
+ many bytes to allocate before failing and giving the heap an opportunity
+ to collect garbage. This also means that we allocate blocks on demand,
+ instead of ahead of time.
+
2011-02-03 James Kozianski <koz@chromium.org>
Reviewed by Dimitri Glazkov.
#include "JSLock.h"
#include "JSONObject.h"
#include "Tracing.h"
+#include <algorithm>
#define COLLECT_ON_EVERY_ALLOCATION 0
+using namespace std;
+
namespace JSC {
+const size_t minBytesPerCycle = 512 * 1024;
+
Heap::Heap(JSGlobalData* globalData)
- : m_markedSpace(globalData)
- , m_operationInProgress(NoOperation)
+ : m_operationInProgress(NoOperation)
+ , m_markedSpace(globalData)
, m_markListSet(0)
, m_activityCallback(DefaultGCActivityCallback::create(this))
, m_globalData(globalData)
if (sweepToggle == DoSweep)
m_markedSpace.sweep();
+ size_t usedCellCount = m_markedSpace.markedCells();
+ size_t proportionalBytes = usedCellCount * 1.5 * HeapConstants::cellSize;
+ m_markedSpace.setHighWaterMark(max(proportionalBytes, minBytesPerCycle));
+
JAVASCRIPTCORE_GC_END();
(*m_activityCallback)();
RegisterFile& registerFile();
- MarkedSpace m_markedSpace;
OperationInProgress m_operationInProgress;
+ MarkedSpace m_markedSpace;
ProtectCountSet m_protectedValues;
Vector<PageAllocationAligned> m_weakGCHandlePools;
m_heap.nextCell = block->marked.nextPossiblyUnset(m_heap.nextCell);
} while (m_heap.nextCell != HeapConstants::cellsPerBlock);
m_heap.nextCell = 0;
+ m_heap.waterMark += BLOCK_SIZE;
} while (++m_heap.nextBlock != m_heap.usedBlocks);
-
+
+ if (m_heap.waterMark < m_heap.highWaterMark)
+ return &allocateBlock()->cells[m_heap.nextCell++];
+
return 0;
}
new (cell) JSCell(dummyMarkableCellStructure);
#endif
}
+
+ shrinkBlocks(0);
}
size_t MarkedSpace::objectCount() const
{
m_heap.nextCell = 0;
m_heap.nextBlock = 0;
+ m_heap.waterMark = 0;
#if ENABLE(JSC_ZOMBIES)
sweep();
#endif
- resizeBlocks();
}
LiveObjectIterator MarkedSpace::primaryHeapBegin()
size_t numBlocks;
size_t usedBlocks;
+
+ size_t waterMark;
+ size_t highWaterMark;
MarkedBlock* collectorBlock(size_t index) const
{
JSGlobalData* globalData() { return m_globalData; }
+ size_t highWaterMark() { return m_heap.highWaterMark; }
+ void setHighWaterMark(size_t highWaterMark) { m_heap.highWaterMark = highWaterMark; }
+
void* allocate(size_t);
void clearMarkBits();
void markRoots();
void reset();
void sweep();
+ size_t markedCells(size_t startBlock = 0, size_t startCell = 0) const;
size_t size() const;
size_t capacity() const;
void shrinkBlocks(size_t neededBlocks);
void clearMarkBits(MarkedBlock*);
- size_t markedCells(size_t startBlock = 0, size_t startCell = 0) const;
CollectorHeap m_heap;
JSGlobalData* m_globalData;