< prev index next >

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

Print this page
rev 12505 : 8171235: Move archive object code from G1MarkSweep into G1ArchiveAllocator
Reviewed-by: tschatzl, kbarrett
rev 12506 : 8171238: Unify cleanup code used in G1 Remark and Full GC marking
Reviewed-by:
rev 12507 : [mq]: 8171238-rev-tsch

*** 3526,3538 **** (alloc_buffer_waste + undo_waste) * HeapWordSize / K, alloc_buffer_waste * HeapWordSize / K, undo_waste * HeapWordSize / K); } ! class G1StringSymbolTableUnlinkTask : public AbstractGangTask { private: BoolObjectClosure* _is_alive; int _initial_string_table_size; int _initial_symbol_table_size; bool _process_strings; int _strings_processed; --- 3526,3540 ---- (alloc_buffer_waste + undo_waste) * HeapWordSize / K, alloc_buffer_waste * HeapWordSize / K, undo_waste * HeapWordSize / K); } ! class G1StringAndSymbolCleaningTask : public AbstractGangTask { private: BoolObjectClosure* _is_alive; + G1StringDedupUnlinkOrOopsDoClosure _dedup_closure; + int _initial_string_table_size; int _initial_symbol_table_size; bool _process_strings; int _strings_processed;
*** 3540,3555 **** bool _process_symbols; int _symbols_processed; int _symbols_removed; public: ! G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) : AbstractGangTask("String/Symbol Unlinking"), _is_alive(is_alive), _process_strings(process_strings), _strings_processed(0), _strings_removed(0), ! _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) { _initial_string_table_size = StringTable::the_table()->table_size(); _initial_symbol_table_size = SymbolTable::the_table()->table_size(); if (process_strings) { StringTable::clear_parallel_claimed_index(); --- 3542,3561 ---- bool _process_symbols; int _symbols_processed; int _symbols_removed; + bool _process_string_dedup; + public: ! G1StringAndSymbolCleaningTask(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_string_dedup(process_string_dedup) { _initial_string_table_size = StringTable::the_table()->table_size(); _initial_symbol_table_size = SymbolTable::the_table()->table_size(); if (process_strings) { StringTable::clear_parallel_claimed_index();
*** 3557,3567 **** if (process_symbols) { SymbolTable::clear_parallel_claimed_index(); } } ! ~G1StringSymbolTableUnlinkTask() { guarantee(!_process_strings || StringTable::parallel_claimed_index() >= _initial_string_table_size, "claim value %d after unlink less than initial string table size %d", StringTable::parallel_claimed_index(), _initial_string_table_size); guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size, "claim value %d after unlink less than initial symbol table size %d", --- 3563,3573 ---- if (process_symbols) { SymbolTable::clear_parallel_claimed_index(); } } ! ~G1StringAndSymbolCleaningTask() { guarantee(!_process_strings || StringTable::parallel_claimed_index() >= _initial_string_table_size, "claim value %d after unlink less than initial string table size %d", StringTable::parallel_claimed_index(), _initial_string_table_size); guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size, "claim value %d after unlink less than initial symbol table size %d",
*** 3588,3597 **** --- 3594,3606 ---- if (_process_symbols) { SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed); 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; } size_t strings_removed() const { return (size_t)_strings_removed; }
*** 3823,3841 **** }; // To minimize the remark pause times, the tasks below are done in parallel. class G1ParallelCleaningTask : public AbstractGangTask { private: ! G1StringSymbolTableUnlinkTask _string_symbol_task; G1CodeCacheUnloadingTask _code_cache_task; G1KlassCleaningTask _klass_cleaning_task; public: // The constructor is run in the VMThread. ! G1ParallelCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, uint num_workers, bool unloading_occurred) : AbstractGangTask("Parallel Cleaning"), ! _string_symbol_task(is_alive, process_strings, process_symbols), _code_cache_task(num_workers, is_alive, unloading_occurred), _klass_cleaning_task(is_alive) { } // The parallel work done by all worker threads. --- 3832,3850 ---- }; // To minimize the remark pause times, the tasks below are done in parallel. class G1ParallelCleaningTask : public AbstractGangTask { private: ! G1StringAndSymbolCleaningTask _string_symbol_task; G1CodeCacheUnloadingTask _code_cache_task; G1KlassCleaningTask _klass_cleaning_task; public: // The constructor is run in the VMThread. ! G1ParallelCleaningTask(BoolObjectClosure* is_alive, uint num_workers, bool unloading_occurred) : AbstractGangTask("Parallel Cleaning"), ! _string_symbol_task(is_alive, true, true, G1StringDedup::is_enabled()), _code_cache_task(num_workers, is_alive, unloading_occurred), _klass_cleaning_task(is_alive) { } // The parallel work done by all worker threads.
*** 3860,3886 **** _klass_cleaning_task.work(); } }; ! void G1CollectedHeap::parallel_cleaning(BoolObjectClosure* is_alive, ! bool process_strings, ! bool process_symbols, 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); 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); } } class G1RedirtyLoggedCardsTask : public AbstractGangTask { private: DirtyCardQueueSet* _queue; --- 3869,3898 ---- _klass_cleaning_task.work(); } }; ! void G1CollectedHeap::complete_cleaning(BoolObjectClosure* is_alive, bool class_unloading_occurred) { uint n_workers = workers()->active_workers(); ! G1ParallelCleaningTask g1_unlink_task(is_alive, n_workers, class_unloading_occurred); 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; } + + G1StringAndSymbolCleaningTask g1_unlink_task(is_alive, process_strings, process_symbols, process_string_dedup); + workers()->run_task(&g1_unlink_task); + } class G1RedirtyLoggedCardsTask : public AbstractGangTask { private: DirtyCardQueueSet* _queue;
< prev index next >