< prev index next >

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

Print this page
rev 50505 : imported patch 8204613-stringtable-unclean-fix


3232   int _symbols_processed;
3233   int _symbols_removed;
3234 
3235   bool _process_string_dedup;
3236 
3237 public:
3238   G1StringAndSymbolCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, bool process_string_dedup) :
3239     AbstractGangTask("String/Symbol Unlinking"),
3240     _is_alive(is_alive),
3241     _dedup_closure(is_alive, NULL, false),
3242     _par_state_string(StringTable::weak_storage()),
3243     _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
3244     _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0),
3245     _process_string_dedup(process_string_dedup) {
3246 
3247     _initial_string_table_size = (int) StringTable::the_table()->table_size();
3248     _initial_symbol_table_size = SymbolTable::the_table()->table_size();
3249     if (process_symbols) {
3250       SymbolTable::clear_parallel_claimed_index();
3251     }



3252   }
3253 
3254   ~G1StringAndSymbolCleaningTask() {
3255     guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
3256               "claim value %d after unlink less than initial symbol table size %d",
3257               SymbolTable::parallel_claimed_index(), _initial_symbol_table_size);
3258 
3259     log_info(gc, stringtable)(
3260         "Cleaned string and symbol table, "
3261         "strings: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed, "
3262         "symbols: " SIZE_FORMAT " processed, " SIZE_FORMAT " removed",
3263         strings_processed(), strings_removed(),
3264         symbols_processed(), symbols_removed());



3265   }
3266 
3267   void work(uint worker_id) {
3268     int strings_processed = 0;
3269     int strings_removed = 0;
3270     int symbols_processed = 0;
3271     int symbols_removed = 0;
3272     if (_process_strings) {
3273       StringTable::possibly_parallel_unlink(&_par_state_string, _is_alive, &strings_processed, &strings_removed);
3274       Atomic::add(strings_processed, &_strings_processed);
3275       Atomic::add(strings_removed, &_strings_removed);
3276     }
3277     if (_process_symbols) {
3278       SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
3279       Atomic::add(symbols_processed, &_symbols_processed);
3280       Atomic::add(symbols_removed, &_symbols_removed);
3281     }
3282     if (_process_string_dedup) {
3283       G1StringDedup::parallel_unlink(&_dedup_closure, worker_id);
3284     }




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


< prev index next >