• Austin Clements's avatar
    runtime: grow the heap incrementally · f18109d7
    Austin Clements authored
    Currently, we map and grow the heap a whole arena (64MB) at a time.
    Unfortunately, in order to fix #32828, we need to switch from
    scavenging inline with allocation back to scavenging on heap growth,
    but heap-growth scavenging happens in large jumps because we grow the
    heap in large jumps.
    
    In order to prepare for better heap-growth scavenging, this CL
    separates mapping more space for the heap from actually "growing" it
    (tracking the new space with spans). Instead, growing the heap keeps
    track of the "current arena" it's growing into. It track that with new
    spans as needed, and only maps more arena space when the current arena
    is inadequate. The effect to the user is the same, but this will let
    us scavenge on much smaller increments of heap growth.
    
    There are two slightly subtleties to this change:
    
    1. If an allocation requires mapping a new arena and that new arena
       isn't contiguous with the current arena, we don't want to lose the
       unused space in the current arena, so we have to immediately track
       that with a span.
    
    2. The mapped space must be accounted as released and idle, even
       though it isn't actually tracked in a span.
    
    For #32828, since this makes heap-growth scavenging far more
    effective, especially at small heap sizes. For example, this change is
    necessary for TestPhysicalMemoryUtilization to pass once we remove
    inline scavenging.
    
    Change-Id: I300e74a0534062467e4ce91cdc3508e5ef9aa73a
    Reviewed-on: https://go-review.googlesource.com/c/go/+/189957
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarKeith Randall <khr@golang.org>
    Reviewed-by: default avatarMichael Knyszek <mknyszek@google.com>
    f18109d7
mheap.go 64.9 KB