--- a/src/hotspot/share/gc/parallel/psCardTable.cpp Fri Aug 16 09:18:29 2019 +0200
+++ b/src/hotspot/share/gc/parallel/psCardTable.cpp Fri Aug 16 09:18:32 2019 +0200
@@ -128,6 +128,38 @@
// when the space is empty, fix the calculation of
// end_card to allow sp_top == sp->bottom().
+// The generation (old gen) is divided into slices, which are further
+// subdivided into stripes, with one stripe per GC thread. The size of
+// a stripe is a constant, ssize.
+//
+// +===============+ slice 0
+// | stripe 0 |
+// +---------------+
+// | stripe 1 |
+// +---------------+
+// | stripe 2 |
+// +---------------+
+// | stripe 3 |
+// +===============+ slice 1
+// | stripe 0 |
+// +---------------+
+// | stripe 1 |
+// +---------------+
+// | stripe 2 |
+// +---------------+
+// | stripe 3 |
+// +===============+ slice 2
+// ...
+//
+// In this case there are 4 threads, so 4 stripes. A GC thread first works on
+// its stripe within slice 0 and then moves to its stripe in the next slice
+// until it has exceeded the top of the generation. The distance to stripe in
+// the next slice is calculated based on the number of stripes. The next
+// stripe is at ssize * number_of_stripes (= slice_stride).. So after
+// finishing stripe 0 in slice 0, the thread finds the stripe 0 in slice1 by
+// adding slice_stride to the start of stripe 0 in slice 0 to get to the start
+// of stride 0 in slice 1.
+
void PSCardTable::scavenge_contents_parallel(ObjectStartArray* start_array,
MutableSpace* sp,
HeapWord* space_top,