mirror of https://github.com/golang/go.git
runtime: split out pointer/scalar metadata from heapArena
We're going to want to fork this data in the near future for a GOEXPERIMENT, so break it out now. Change-Id: Ia7ded850bb693c443fe439c6b7279dcac638512c Reviewed-on: https://go-review.googlesource.com/c/go/+/537978 Reviewed-by: Keith Randall <khr@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
04575ce53f
commit
7a606fef66
|
|
@ -46,6 +46,27 @@ import (
|
|||
"unsafe"
|
||||
)
|
||||
|
||||
// heapArenaPtrScalar contains the per-heapArena pointer/scalar metadata for the GC.
|
||||
type heapArenaPtrScalar struct {
|
||||
// bitmap stores the pointer/scalar bitmap for the words in
|
||||
// this arena. See mbitmap.go for a description.
|
||||
// This array uses 1 bit per word of heap, or 1.6% of the heap size (for 64-bit).
|
||||
bitmap [heapArenaBitmapWords]uintptr
|
||||
|
||||
// If the ith bit of noMorePtrs is true, then there are no more
|
||||
// pointers for the object containing the word described by the
|
||||
// high bit of bitmap[i].
|
||||
// In that case, bitmap[i+1], ... must be zero until the start
|
||||
// of the next object.
|
||||
// We never operate on these entries using bit-parallel techniques,
|
||||
// so it is ok if they are small. Also, they can't be bigger than
|
||||
// uint16 because at that size a single noMorePtrs entry
|
||||
// represents 8K of memory, the minimum size of a span. Any larger
|
||||
// and we'd have to worry about concurrent updates.
|
||||
// This array uses 1 bit per word of bitmap, or .024% of the heap size (for 64-bit).
|
||||
noMorePtrs [heapArenaBitmapWords / 8]uint8
|
||||
}
|
||||
|
||||
// addb returns the byte pointer p+n.
|
||||
//
|
||||
//go:nowritebarrier
|
||||
|
|
|
|||
|
|
@ -239,23 +239,8 @@ var mheap_ mheap
|
|||
type heapArena struct {
|
||||
_ sys.NotInHeap
|
||||
|
||||
// bitmap stores the pointer/scalar bitmap for the words in
|
||||
// this arena. See mbitmap.go for a description.
|
||||
// This array uses 1 bit per word of heap, or 1.6% of the heap size (for 64-bit).
|
||||
bitmap [heapArenaBitmapWords]uintptr
|
||||
|
||||
// If the ith bit of noMorePtrs is true, then there are no more
|
||||
// pointers for the object containing the word described by the
|
||||
// high bit of bitmap[i].
|
||||
// In that case, bitmap[i+1], ... must be zero until the start
|
||||
// of the next object.
|
||||
// We never operate on these entries using bit-parallel techniques,
|
||||
// so it is ok if they are small. Also, they can't be bigger than
|
||||
// uint16 because at that size a single noMorePtrs entry
|
||||
// represents 8K of memory, the minimum size of a span. Any larger
|
||||
// and we'd have to worry about concurrent updates.
|
||||
// This array uses 1 bit per word of bitmap, or .024% of the heap size (for 64-bit).
|
||||
noMorePtrs [heapArenaBitmapWords / 8]uint8
|
||||
// heapArenaPtrScalar contains pointer/scalar data about the heap for this heap arena.
|
||||
heapArenaPtrScalar
|
||||
|
||||
// spans maps from virtual address page ID within this arena to *mspan.
|
||||
// For allocated spans, their pages map to the span itself.
|
||||
|
|
|
|||
Loading…
Reference in New Issue