Changeset 96432 in webkit for trunk/Source/JavaScriptCore/heap


Ignore:
Timestamp:
Sep 30, 2011, 3:23:33 PM (14 years ago)
Author:
[email protected]
Message:

2011-09-30 Oliver Hunt <[email protected]>

Need a sensible GGC policy

Reviewed by Geoff Garen.

This replaces the existing random collection policy
with a deterministic policy based on nursery size.

  • heap/AllocationSpace.cpp: (JSC::AllocationSpace::allocateSlowCase):
  • heap/Heap.cpp: (JSC::Heap::Heap): (JSC::Heap::markRoots): (JSC::Heap::collect):
  • heap/Heap.h:
  • heap/MarkedSpace.cpp: (JSC::MarkedSpace::MarkedSpace): (JSC::MarkedSpace::resetAllocator):
  • heap/MarkedSpace.h: (JSC::MarkedSpace::nurseryWaterMark): (JSC::MarkedSpace::allocate):
Location:
trunk/Source/JavaScriptCore/heap
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/heap/AllocationSpace.cpp

    r96372 r96432  
    5656    AllocationEffort allocationEffort;
    5757   
    58     if (m_markedSpace.waterMark() < m_markedSpace.highWaterMark() || !m_heap->m_isSafeToCollect)
     58    if ((
     59#if ENABLE(GGC)
     60         m_markedSpace.nurseryWaterMark() < m_heap->m_minBytesPerCycle
     61#else
     62         m_markedSpace.waterMark() < m_markedSpace.highWaterMark()
     63#endif
     64         ) || !m_heap->m_isSafeToCollect)
    5965        allocationEffort = AllocationMustSucceed;
    6066    else
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r96372 r96432  
    215215    : m_heapSize(heapSize)
    216216    , m_minBytesPerCycle(heapSizeForHint(heapSize))
     217    , m_lastFullGCSize(0)
    217218    , m_operationInProgress(NoOperation)
    218219    , m_objectSpace(this)
     
    454455}
    455456
    456 void Heap::markRoots()
    457 {
     457void Heap::markRoots(bool fullGC)
     458{
     459    UNUSED_PARAM(fullGC);
    458460    ASSERT(isValidThreadState(m_globalData));
    459461    if (m_operationInProgress != NoOperation)
     
    474476#if ENABLE(GGC)
    475477    MarkedBlock::DirtyCellVector dirtyCells;
    476     // Until we have a sensible policy we just random choose to perform
    477     // young generation collections 90% of the time.
    478     if (WTF::randomNumber() > 0.1)
     478    if (!fullGC)
    479479        m_objectSpace.gatherDirtyCells(dirtyCells);
    480480    else
     
    487487
    488488#if ENABLE(GGC)
    489     for (size_t i = 0; i < dirtyObjectCount; i++) {
     489    size_t dirtyCellCount = dirtyCells.size();
     490    for (size_t i = 0; i < dirtyCellCount; i++) {
    490491        heapRootVisitor.visitChildren(dirtyCells[i]);
    491492        visitor.drain();
     
    600601    ASSERT(m_isSafeToCollect);
    601602    JAVASCRIPTCORE_GC_BEGIN();
    602    
     603    bool fullGC = sweepToggle == DoSweep;
     604    if (!fullGC)
     605        fullGC = (capacity() > 4 * m_lastFullGCSize); 
    603606    canonicalizeCellLivenessData();
    604     markRoots();
     607
     608    markRoots(fullGC);
    605609
    606610    harvestWeakReferences();
     
    622626    // new bytes allocated) proportion, and seems to work well in benchmarks.
    623627    size_t proportionalBytes = 2 * size();
     628    if (fullGC)
     629        m_lastFullGCSize = proportionalBytes / 2;
     630   
    624631    m_objectSpace.setHighWaterMark(max(proportionalBytes, m_minBytesPerCycle));
    625632    JAVASCRIPTCORE_GC_END();
  • trunk/Source/JavaScriptCore/heap/Heap.h

    r96372 r96432  
    145145
    146146        void clearMarks();
    147         void markRoots();
     147        void markRoots(bool fullGC);
    148148        void markProtectedObjects(HeapRootVisitor&);
    149149        void markTempSortVectors(HeapRootVisitor&);
     
    165165        const HeapSize m_heapSize;
    166166        const size_t m_minBytesPerCycle;
     167        size_t m_lastFullGCSize;
    167168       
    168169        OperationInProgress m_operationInProgress;
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp

    r96424 r96432  
    3333MarkedSpace::MarkedSpace(Heap* heap)
    3434    : m_waterMark(0)
     35    , m_nurseryWaterMark(0)
    3536    , m_highWaterMark(0)
    3637    , m_heap(heap)
     
    6465{
    6566    m_waterMark = 0;
     67    m_nurseryWaterMark = 0;
    6668
    6769    for (size_t cellSize = preciseStep; cellSize <= preciseCutoff; cellSize += preciseStep)
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.h

    r96424 r96432  
    7373    size_t waterMark();
    7474    size_t highWaterMark();
     75    size_t nurseryWaterMark();
    7576    void setHighWaterMark(size_t);
    7677
     
    9293    FixedArray<SizeClass, impreciseCount> m_impreciseSizeClasses;
    9394    size_t m_waterMark;
     95    size_t m_nurseryWaterMark;
    9496    size_t m_highWaterMark;
    9597    Heap* m_heap;
     
    104106{
    105107    return m_highWaterMark;
     108}
     109
     110inline size_t MarkedSpace::nurseryWaterMark()
     111{
     112    return m_nurseryWaterMark;
    106113}
    107114
     
    127134            if (firstFreeCell)
    128135                break;
    129 
     136            m_nurseryWaterMark += block->capacity() - block->size();
    130137            m_waterMark += block->capacity();
    131138            block->didConsumeFreeList();
Note: See TracChangeset for help on using the changeset viewer.