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