< prev index next >

src/share/vm/classfile/symbolTable.cpp

Print this page
rev 11775 : [backport] 8241700: Shenandoah: Fold ShenandoahKeepAliveBarrier flag into ShenandoahSATBBarrier
Reviewed-by: shade
rev 11823 : Shenandoah: specialize String Table scans for better pause performance
Reviewed-by: rkennke, zgu

*** 719,729 **** static void ensure_string_alive(oop string) { // A lookup in the StringTable could return an object that was previously // considered dead. The SATB part of G1 needs to get notified about this // potential resurrection, otherwise the marking might not find the object. #if INCLUDE_ALL_GCS ! if ((UseG1GC || (UseShenandoahGC && ShenandoahKeepAliveBarrier)) && string != NULL) { G1SATBCardTableModRefBS::enqueue(string); } #endif } --- 719,729 ---- static void ensure_string_alive(oop string) { // A lookup in the StringTable could return an object that was previously // considered dead. The SATB part of G1 needs to get notified about this // potential resurrection, otherwise the marking might not find the object. #if INCLUDE_ALL_GCS ! if ((UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) && string != NULL) { G1SATBCardTableModRefBS::enqueue(string); } #endif }
*** 924,933 **** --- 924,955 ---- int end_idx = MIN2(limit, start_idx + ClaimChunkSize); buckets_oops_do(f, start_idx, end_idx); } } + void StringTable::possibly_parallel_oops_do_shenandoah(OopClosure* f) { + const int limit = the_table()->table_size(); + + // ClaimChunkSize is too small for processing a String table during the pause + // efficiently: the atomic add costs dominate on many reasonable string tables. + // Recast the chunk size to give each GC worker about 10 chunks. + assert(UseShenandoahGC, "Only for Shenandoah"); + const int chunk_size = MAX2<int>(ClaimChunkSize, limit / (ParallelGCThreads * 10)); + + for (;;) { + // Grab next set of buckets to scan + int start_idx = Atomic::add(chunk_size, &_parallel_claimed_idx) - chunk_size; + if (start_idx >= limit) { + // End of table + break; + } + + int end_idx = MIN2(limit, start_idx + chunk_size); + buckets_oops_do(f, start_idx, end_idx); + } + } + // This verification is part of Universe::verify() and needs to be quick. // See StringTable::verify_and_compare() below for exhaustive verification. void StringTable::verify() { for (int i = 0; i < the_table()->table_size(); ++i) { HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
< prev index next >