More parallel GC, rewritten parallel mark stack processing.
Card scanning may now be done in parallel. This speeds up sticky and
reduces pause times for all GC types.
Speedup on my mako (ritz perf):
Average pause time for sticky GC (~250 samples):
Without parallel cards scanning enabled: 2.524904215ms
Parallel card scanning (num_gc_threads_): 1.552123552ms
Throughput (~250 samples):
Sticky GC throughput with parallel card scanning: 69MB/s
Sticky GC throughput without parallel card scanning: 51MB/s
Rewrote the mark stack processing to be LIFO and use a prefetch queue
like the non parallel version.
Cleaned up some of the logcat printing for the activity manager
process state listening.
Added unlikely hints to object scanning since arrays and classes are
scanned much less often than normal objects.
Fixed a bug where the number of GC threads was clamped to 1 due to a
bool instead of a size_t.
Fixed a race condition when we added references to the reference
queues. Sharded the reference queue lock into one lock for each reference
type (weak, soft, phatom, finalizer).
Changed timing splits to be different for processing gray objects with
and without mutators paused since sticky GC does both.
Mask out the class bit when visiting fields as an optimization, this is
valid since classes are held live by the class linker.
Partially completed: Parallel recursive mark + finger.
13 files changed