Currently G1 clears the whole (next) mark bitmaps of the regions of the entire (committed) heap.
This is unnecessary, only bitmaps of regions that were dirtied need clearing. Since JDK-8197850 we track how much live data has been encountered during mark for every region, corresponding to the live objects we set a mark between bottom and ntams.
I.e. first, we only need to clear between [bottom, ntams[, and second only clear bitmaps which regions had at least one bit set (i.e. have some live data).
This is also a very interesting optimization for JDK-8240556