• Austin Clements's avatar
    runtime: fix over-aggressive proportional sweep · 7407d8e5
    Austin Clements authored
    Currently, sweeping is performed before allocating a span by charging
    for the entire size of the span requested, rather than the number of
    bytes actually available for allocation from the returned span. That
    is, if the returned span is 8K, but already has 6K in use, the mutator
    is charged for 8K of heap allocation even though it can only allocate
    2K more from the span. As a result, proportional sweep is
    over-aggressive and tends to finish much earlier than it needs to.
    This effect is more amplified by fragmented heaps.
    
    Fix this by reimbursing the mutator for the used space in a span once
    it has allocated that span. We still have to charge up-front for the
    worst-case because we don't know which span the mutator will get, but
    at least we can correct the over-charge once it has a span, which will
    go toward later span allocations.
    
    This has negligible effect on the throughput of the go1 benchmarks and
    the garbage benchmark.
    
    Fixes #12040.
    
    Change-Id: I0e23e7a4ccf126cca000fed5067b20017028dd6b
    Reviewed-on: https://go-review.googlesource.com/16515Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    7407d8e5
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang.org/x/net/http2/hpack Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...