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 }
|