--- old/src/share/vm/gc/g1/g1CollectedHeap.cpp 2017-02-20 12:07:12.857493671 +0100 +++ new/src/share/vm/gc/g1/g1CollectedHeap.cpp 2017-02-20 12:07:12.721492996 +0100 @@ -3531,6 +3531,8 @@ class G1StringSymbolTableUnlinkTask : public AbstractGangTask { private: BoolObjectClosure* _is_alive; + G1StringDedupUnlinkOrOopsDoClosure _dedup_closure; + int _initial_string_table_size; int _initial_symbol_table_size; @@ -3542,12 +3544,16 @@ int _symbols_processed; int _symbols_removed; + bool _process_string_dedup; + public: - G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) : + G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, bool process_string_dedup) : AbstractGangTask("String/Symbol Unlinking"), _is_alive(is_alive), + _dedup_closure(is_alive, NULL, false), _process_strings(process_strings), _strings_processed(0), _strings_removed(0), - _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) { + _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0), + _process_string_dedup(process_string_dedup) { _initial_string_table_size = StringTable::the_table()->table_size(); _initial_symbol_table_size = SymbolTable::the_table()->table_size(); @@ -3590,6 +3596,9 @@ Atomic::add(symbols_processed, &_symbols_processed); Atomic::add(symbols_removed, &_symbols_removed); } + if (_process_string_dedup) { + G1StringDedup::parallel_unlink(&_dedup_closure, worker_id); + } } size_t strings_processed() const { return (size_t)_strings_processed; } @@ -3831,9 +3840,9 @@ public: // The constructor is run in the VMThread. - G1ParallelCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, uint num_workers, bool unloading_occurred) : + G1ParallelCleaningTask(BoolObjectClosure* is_alive, uint num_workers, bool unloading_occurred) : AbstractGangTask("Parallel Cleaning"), - _string_symbol_task(is_alive, process_strings, process_symbols), + _string_symbol_task(is_alive, true, true, G1StringDedup::is_enabled()), _code_cache_task(num_workers, is_alive, unloading_occurred), _klass_cleaning_task(is_alive) { } @@ -3862,23 +3871,26 @@ }; -void G1CollectedHeap::parallel_cleaning(BoolObjectClosure* is_alive, - bool process_strings, - bool process_symbols, - bool class_unloading_occurred) { +void G1CollectedHeap::full_cleaning(BoolObjectClosure* is_alive, + bool class_unloading_occurred) { uint n_workers = workers()->active_workers(); - G1ParallelCleaningTask g1_unlink_task(is_alive, process_strings, process_symbols, - n_workers, class_unloading_occurred); + G1ParallelCleaningTask g1_unlink_task(is_alive, n_workers, class_unloading_occurred); workers()->run_task(&g1_unlink_task); } -void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive, - bool process_strings, bool process_symbols) { - { // Timing scope - G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols); - workers()->run_task(&g1_unlink_task); +void G1CollectedHeap::partial_cleaning(BoolObjectClosure* is_alive, + bool process_strings, + bool process_symbols, + bool process_string_dedup) { + if (!process_strings && !process_symbols && !process_string_dedup) { + // Nothing to clean. + return; } + + G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols, process_string_dedup); + workers()->run_task(&g1_unlink_task); + } class G1RedirtyLoggedCardsTask : public AbstractGangTask {