empty uint64 // lock-free list of empty blocks workbuf
pad0 [sys.CacheLineSize]uint8 // prevents false-sharing between full/empty and nproc/nwait
+ // bytesMarked is the number of bytes marked this cycle. This
+ // includes bytes blackened in scanned objects, noscan objects
+ // that go straight to black, and permagrey objects scanned by
+ // markroot during the concurrent scan phase. This is updated
+ // atomically during the cycle. Updates may be batched
+ // arbitrarily, since the value is only read at the end of the
+ // cycle.
+ //
+ // Because of benign races during marking, this number may not
+ // be the exact number of marked bytes, but it should be very
+ // close.
+ //
+ // Put this field here because it needs 64-bit atomic access
+ // (and thus 8-byte alignment even on 32-bit architectures).
+ bytesMarked uint64
+
markrootNext uint32 // next markroot job
markrootJobs uint32 // number of markroot jobs
// program started if debug.gctrace > 0.
totaltime int64
- // bytesMarked is the number of bytes marked this cycle. This
- // includes bytes blackened in scanned objects, noscan objects
- // that go straight to black, and permagrey objects scanned by
- // markroot during the concurrent scan phase. This is updated
- // atomically during the cycle. Updates may be batched
- // arbitrarily, since the value is only read at the end of the
- // cycle.
- //
- // Because of benign races during marking, this number may not
- // be the exact number of marked bytes, but it should be very
- // close.
- bytesMarked uint64
-
// initialHeapLive is the value of memstats.heap_live at the
// beginning of this GC cycle.
initialHeapLive uint64