Серый означает «живой, но не отсканированный»: еще не все потомки серого блока отмечены как черные. Серый цвет необходим в инкрементальном сборщике мусора. Он помогает ГК с разметкой и размахом продолжить то, что он делал, в следующий раз, когда у него будет возможность немного пометить.
Если ваш сборщик мусора не является инкрементным, то вам может показаться, что вам не обязательно нужен серый цвет: вы всегда можете просто указать все дочерние элементы любого живого блока, с которым вы сталкиваетесь. Однако другая, более тонкая проблема заключается в том, что этот наивный неинкрементный рекурсивный алгоритм может переполнить стек. Серый цвет также помогает, позволяя хранить информацию о том, что следует посетить в куче, а не в стеке.
Даже если вы используете серый цвет для этой цели, это не мешает вам сохранять буфер блоков, которые еще предстоит посетить для эффективности. Единственное отличие от простой рекурсивной реализации состоит в том, что вы прекращаете обновлять буфер, когда он уже заполнен, и линейно сканируете кучу на наличие серых объектов, если буфер становится пустым после заполнения.