• Mathieu Chartier's avatar
    Thread local bump pointer allocator. · 692fafd9
    Mathieu Chartier authored
    Added a thread local allocator to the heap, each thread has three
    pointers which specify the thread local buffer: start, cur, and
    end. When the remaining space in the thread local buffer isn't large
    enough for the allocation, the allocator allocates a new thread
    local buffer using the bump pointer allocator.
    
    The bump pointer space had to be modified to accomodate thread
    local buffers. These buffers are called "blocks", where a block
    is a buffer which contains a set of adjacent objects. Blocks
    aren't necessarily full and may have wasted memory towards the
    end. Blocks have an 8 byte header which specifies their size and is
    required for traversing bump pointer spaces.
    
    Memory usage is in between full bump pointer and ROSAlloc since
    madvised memory limits wasted ram to an average of 1/2 page per
    block.
    
    Added a runtime option -XX:UseTLAB which specifies whether or
    not to use the thread local allocator. Its a NOP if the garbage
    collector is not the semispace collector.
    
    TODO: Smarter block accounting to prevent us reading objects until
    we either hit the end of the block or GetClass() == null which
    signifies that the block isn't 100% full. This would provide a
    slight speedup to BumpPointerSpace::Walk.
    
    Timings: -XX:HeapMinFree=4m -XX:HeapMaxFree=8m -Xmx48m
    ritzperf memalloc:
    Dalvik -Xgc:concurrent: 11678
    Dalvik -Xgc:noconcurrent: 6697
    -Xgc:MS: 5978
    -Xgc:SS: 4271
    -Xgc:CMS: 4150
    -Xgc:SS -XX:UseTLAB: 3255
    
    Bug: 9986565
    Bug: 12042213
    
    Change-Id: Ib7e1d4b199a8199f3b1de94b0a7b6e1730689cad
    692fafd9
heap-inl.h 9.86 KB