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