Fix negative mutator time in GC stats in prof builds
Because garbage collector calls retainerProfile() and heapCensus(),
GC times normally include some of PROF times too. To fix this we have
these lines:
// heapCensus() is called by the GC, so RP and HC time are
// included in the GC stats. We therefore subtract them to
// obtain the actual GC cpu time.
stats.gc_cpu_ns -= prof_cpu;
stats.gc_elapsed_ns -= prof_elapsed;
These variables are later used for calculating GC time excluding the final GC (which should be attributed to EXIT).
exit_gc_elapsed = stats.gc_elapsed_ns - start_exit_gc_elapsed;
The problem is if we subtract PROF times from gc_elapsed_ns and then
subtract start_exit_gc_elapsed from the result, we end up subtracting
PROF times twice, because start_exit_gc_elapsed also includes PROF
times.
We now subtract PROF times from GC after the calculations for EXIT and MUT times. The existing assertion that checks
INIT + MUT + GC + EXIT = TOTAL
now holds. When we subtract PROF numbers from GC, and a new assertion
INIT + MUT + GC + PROF + EXIT = TOTAL
also holds.
Fixes #15897 (closed). New assertions added in this commit also revealed #16102 (closed), which is also fixed by this commit.