--- old/src/share/vm/gc/cms/parCardTableModRefBS.cpp 2015-05-20 10:55:48.626718164 +0200 +++ new/src/share/vm/gc/cms/parCardTableModRefBS.cpp 2015-05-20 10:55:48.498713846 +0200 @@ -41,7 +41,8 @@ CardTableRS* ct, uint n_threads) { assert(n_threads > 0, "Error: expected n_threads > 0"); - assert(n_threads <= (uint)ParallelGCThreads, "# worker threads != # requested!"); + assert(n_threads <= (uint)ParallelGCThreads, + err_msg("Error: n_threads: %u > ParallelGCThreads: %u", n_threads, (uint)ParallelGCThreads)); // Make sure the LNC array is valid for the space. jbyte** lowest_non_clean; @@ -58,12 +59,9 @@ pst->set_n_threads(n_threads); pst->set_n_tasks(n_strides); - bool parallel = n_threads > 0; - uint stride = 0; while (!pst->is_task_claimed(/* reference */ stride)) { process_stride(sp, mr, stride, n_strides, - parallel, cl, ct, lowest_non_clean, lowest_non_clean_base_chunk_index, @@ -87,7 +85,6 @@ process_stride(Space* sp, MemRegion used, jint stride, int n_strides, - bool parallel, OopsInGenClosure* cl, CardTableRS* ct, jbyte** lowest_non_clean, @@ -131,6 +128,9 @@ assert(chunk_mr.word_size() > 0, "[chunk_card_start > used_end)"); assert(used.contains(chunk_mr), "chunk_mr should be subset of used"); + // This function is used by the parallel card table iteration. + const bool parallel = true; + DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), cl->gen_boundary(), parallel); --- old/src/share/vm/gc/shared/cardTableModRefBS.cpp 2015-05-20 10:55:48.894727204 +0200 +++ new/src/share/vm/gc/shared/cardTableModRefBS.cpp 2015-05-20 10:55:48.738721942 +0200 @@ -452,8 +452,11 @@ } else { // clear_cl finds contiguous dirty ranges of cards to process and clear. - DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), cl->gen_boundary(), false); - ClearNoncleanCardWrapper clear_cl(dcto_cl, ct, false); + // This is the single-threaded version. + const bool parallel = false; + + DirtyCardToOopClosure* dcto_cl = sp->new_dcto_cl(cl, precision(), cl->gen_boundary(), parallel); + ClearNoncleanCardWrapper clear_cl(dcto_cl, ct, parallel); clear_cl.do_MemRegion(mr); } --- old/src/share/vm/gc/shared/cardTableModRefBS.hpp 2015-05-20 10:55:49.146735704 +0200 +++ new/src/share/vm/gc/shared/cardTableModRefBS.hpp 2015-05-20 10:55:49.002730846 +0200 @@ -239,7 +239,6 @@ void process_stride(Space* sp, MemRegion used, jint stride, int n_strides, - bool parallel, OopsInGenClosure* cl, CardTableRS* ct, jbyte** lowest_non_clean,