void CardTableRS::invalidate_or_clear(Generation* gen, bool younger, bool perm) { GenCollectedHeap* gch = GenCollectedHeap::heap(); // For each generation gen (and younger and/or perm) // invalidate the cards for the currently occupied part // of that generation and clear the cards for the // unoccupied part of the generation (if any, making use // of that generation's prev_used_region to determine that // region). No need to do anything for the youngest // generation. Also see note#20040107.ysr above. Generation* g = gen; for(Generation* prev_gen = gch->prev_gen(g); prev_gen != NULL; g = prev_gen, prev_gen = gch->prev_gen(g)) { MemRegion used_mr = g->used_region(); MemRegion to_be_cleared_mr = g->prev_used_region().minus(used_mr); if (!to_be_cleared_mr.is_empty()) { clear(to_be_cleared_mr); } invalidate(used_mr); if (!younger) break; } // Clear perm gen cards if asked to do so. if (perm) { g = gch->perm_gen(); MemRegion used_mr = g->used_region(); MemRegion to_be_cleared_mr = g->prev_used_region().minus(used_mr); if (!to_be_cleared_mr.is_empty()) { clear(to_be_cleared_mr); } invalidate(used_mr); } }