< prev index next >

src/hotspot/share/gc/g1/g1CollectedHeap.cpp

Print this page
rev 50539 : [mq]: 8204613-stringtable-unclean-fix


3245   int _symbols_processed;
3246   int _symbols_removed;
3247 
3248   bool _process_string_dedup;
3249 
3250 public:
3251   G1StringAndSymbolCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, bool process_string_dedup) :
3252     AbstractGangTask("String/Symbol Unlinking"),
3253     _is_alive(is_alive),
3254     _dedup_closure(is_alive, NULL, false),
3255     _par_state_string(StringTable::weak_storage()),
3256     _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
3257     _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0),
3258     _process_string_dedup(process_string_dedup) {
3259 
3260     _initial_string_table_size = (int) StringTable::the_table()->table_size();
3261     _initial_symbol_table_size = SymbolTable::the_table()->table_size();
3262     if (process_symbols) {
3263       SymbolTable::clear_parallel_claimed_index();
3264     }



3265   }
3266 
3267   ~G1StringAndSymbolCleaningTask() {
3268     guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
3269               "claim value %d after unlink less than initial symbol table size %d",
3270               SymbolTable::parallel_claimed_index(), _initial_symbol_table_size);
3271 
3272     log_info(gc, stringtable)(
3273         "Cleaned string and symbol table, "
3274         "strings: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed, "
3275         "symbols: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed",
3276         strings_processed(), strings_removed(),
3277         symbols_processed(), symbols_removed());



3278   }
3279 
3280   void work(uint worker_id) {
3281     int strings_processed = 0;
3282     int strings_removed = 0;
3283     int symbols_processed = 0;
3284     int symbols_removed = 0;
3285     if (_process_strings) {
3286       StringTable::possibly_parallel_unlink(&_par_state_string, _is_alive, &strings_processed, &strings_removed);
3287       Atomic::add(strings_processed, &_strings_processed);
3288       Atomic::add(strings_removed, &_strings_removed);
3289     }
3290     if (_process_symbols) {
3291       SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
3292       Atomic::add(symbols_processed, &_symbols_processed);
3293       Atomic::add(symbols_removed, &_symbols_removed);
3294     }
3295     if (_process_string_dedup) {
3296       G1StringDedup::parallel_unlink(&_dedup_closure, worker_id);
3297     }




3245   int _symbols_processed;
3246   int _symbols_removed;
3247 
3248   bool _process_string_dedup;
3249 
3250 public:
3251   G1StringAndSymbolCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, bool process_string_dedup) :
3252     AbstractGangTask("String/Symbol Unlinking"),
3253     _is_alive(is_alive),
3254     _dedup_closure(is_alive, NULL, false),
3255     _par_state_string(StringTable::weak_storage()),
3256     _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
3257     _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0),
3258     _process_string_dedup(process_string_dedup) {
3259 
3260     _initial_string_table_size = (int) StringTable::the_table()->table_size();
3261     _initial_symbol_table_size = SymbolTable::the_table()->table_size();
3262     if (process_symbols) {
3263       SymbolTable::clear_parallel_claimed_index();
3264     }
3265     if (process_strings) {
3266       StringTable::reset_dead_counter();
3267     }
3268   }
3269 
3270   ~G1StringAndSymbolCleaningTask() {
3271     guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
3272               "claim value %d after unlink less than initial symbol table size %d",
3273               SymbolTable::parallel_claimed_index(), _initial_symbol_table_size);
3274 
3275     log_info(gc, stringtable)(
3276         "Cleaned string and symbol table, "
3277         "strings: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed, "
3278         "symbols: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed",
3279         strings_processed(), strings_removed(),
3280         symbols_processed(), symbols_removed());
3281     if (_process_strings) {
3282       StringTable::finish_dead_counter();
3283     }
3284   }
3285 
3286   void work(uint worker_id) {
3287     int strings_processed = 0;
3288     int strings_removed = 0;
3289     int symbols_processed = 0;
3290     int symbols_removed = 0;
3291     if (_process_strings) {
3292       StringTable::possibly_parallel_unlink(&_par_state_string, _is_alive, &strings_processed, &strings_removed);
3293       Atomic::add(strings_processed, &_strings_processed);
3294       Atomic::add(strings_removed, &_strings_removed);
3295     }
3296     if (_process_symbols) {
3297       SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
3298       Atomic::add(symbols_processed, &_symbols_processed);
3299       Atomic::add(symbols_removed, &_symbols_removed);
3300     }
3301     if (_process_string_dedup) {
3302       G1StringDedup::parallel_unlink(&_dedup_closure, worker_id);
3303     }


< prev index next >