• Rick Hudson's avatar
    [dev.garbage] runtime: allocate directly from GC mark bits · 3479b065
    Rick Hudson authored
    Instead of building a freelist from the mark bits generated
    by the GC this CL allocates directly from the mark bits.
    
    The approach moves the mark bits from the pointer/no pointer
    heap structures into their own per span data structures. The
    mark/allocation vectors consist of a single mark bit per
    object. Two vectors are maintained, one for allocation and
    one for the GC's mark phase. During the GC cycle's sweep
    phase the interpretation of the vectors is swapped. The
    mark vector becomes the allocation vector and the old
    allocation vector is cleared and becomes the mark vector that
    the next GC cycle will use.
    
    Marked entries in the allocation vector indicate that the
    object is not free. Each allocation vector maintains a boundary
    between areas of the span already allocated from and areas
    not yet allocated from. As objects are allocated this boundary
    is moved until it reaches the end of the span. At this point
    further allocations will be done from another span.
    
    Since we no longer sweep a span inspecting each freed object
    the responsibility for maintaining pointer/scalar bits in
    the heapBitMap containing is now the responsibility of the
    the routines doing the actual allocation.
    
    This CL is functionally complete and ready for performance
    tuning.
    
    Change-Id: I336e0fc21eef1066e0b68c7067cc71b9f3d50e04
    Reviewed-on: https://go-review.googlesource.com/19470Reviewed-by: 's avatarAustin Clements <austin@google.com>
    3479b065
mheap.go 34.3 KB