8013160: NPG: Remove unnecessary mark stack draining after CodeCache::do_unloading
Reviewed-by: coleenp, mgerdin
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Fri Apr 26 09:53:22 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Fri Apr 26 10:40:36 2013 +0200
@@ -6007,26 +6007,23 @@
&cmsDrainMarkingStackClosure,
NULL);
}
- verify_work_stacks_empty();
- }
+ }
+
+ // This is the point where the entire marking should have completed.
+ verify_work_stacks_empty();
if (should_unload_classes()) {
{
TraceTime t("class unloading", PrintGCDetails, false, gclog_or_tty);
- // Follow SystemDictionary roots and unload classes
+ // Unload classes and purge the SystemDictionary.
bool purged_class = SystemDictionary::do_unloading(&_is_alive_closure);
- // Follow CodeCache roots and unload any methods marked for unloading
+ // Unload nmethods.
CodeCache::do_unloading(&_is_alive_closure, purged_class);
- cmsDrainMarkingStackClosure.do_void();
- verify_work_stacks_empty();
-
- // Update subklass/sibling/implementor links in KlassKlass descendants
+ // Prune dead klasses from subklass/sibling/implementor lists.
Klass::clean_weak_klass_links(&_is_alive_closure);
- // Nothing should have been pushed onto the working stacks.
- verify_work_stacks_empty();
}
{
@@ -6040,11 +6037,10 @@
// Need to check if we really scanned the StringTable.
if ((roots_scanning_options() & SharedHeap::SO_Strings) == 0) {
TraceTime t("scrub string table", PrintGCDetails, false, gclog_or_tty);
- // Now clean up stale oops in StringTable
+ // Delete entries for dead interned strings.
StringTable::unlink(&_is_alive_closure);
}
- verify_work_stacks_empty();
// Restore any preserved marks as a result of mark stack or
// work queue overflow
restore_preserved_marks_if_any(); // done single-threaded for now
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Fri Apr 26 09:53:22 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Fri Apr 26 10:40:36 2013 +0200
@@ -144,29 +144,25 @@
&GenMarkSweep::follow_stack_closure,
NULL);
- // Follow system dictionary roots and unload classes
+
+ // This is the point where the entire marking should have completed.
+ assert(GenMarkSweep::_marking_stack.is_empty(), "Marking should have completed");
+
+ // Unload classes and purge the SystemDictionary.
bool purged_class = SystemDictionary::do_unloading(&GenMarkSweep::is_alive);
- assert(GenMarkSweep::_marking_stack.is_empty(),
- "stack should be empty by now");
- // Follow code cache roots (has to be done after system dictionary,
- // assumes all live klasses are marked)
+ // Unload nmethods.
CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
- GenMarkSweep::follow_stack();
- // Update subklass/sibling/implementor links of live klasses
+ // Prune dead klasses from subklass/sibling/implementor lists.
Klass::clean_weak_klass_links(&GenMarkSweep::is_alive);
- assert(GenMarkSweep::_marking_stack.is_empty(),
- "stack should be empty by now");
- // Visit interned string tables and delete unmarked oops
+ // Delete entries for dead interned strings.
StringTable::unlink(&GenMarkSweep::is_alive);
+
// Clean up unreferenced symbols in symbol table.
SymbolTable::unlink();
- assert(GenMarkSweep::_marking_stack.is_empty(),
- "stack should be empty by now");
-
if (VerifyDuringGC) {
HandleMark hm; // handle scope
COMPILER2_PRESENT(DerivedPointerTableDeactivate dpt_deact);
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Fri Apr 26 09:53:22 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Fri Apr 26 10:40:36 2013 +0200
@@ -517,23 +517,23 @@
is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL);
}
- // Follow system dictionary roots and unload classes
+ // This is the point where the entire marking should have completed.
+ assert(_marking_stack.is_empty(), "Marking should have completed");
+
+ // Unload classes and purge the SystemDictionary.
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
- // Follow code cache roots
+ // Unload nmethods.
CodeCache::do_unloading(is_alive_closure(), purged_class);
- follow_stack(); // Flush marking stack
- // Update subklass/sibling/implementor links of live klasses
- Klass::clean_weak_klass_links(&is_alive);
- assert(_marking_stack.is_empty(), "just drained");
+ // Prune dead klasses from subklass/sibling/implementor lists.
+ Klass::clean_weak_klass_links(is_alive_closure());
- // Visit interned string tables and delete unmarked oops
+ // Delete entries for dead interned strings.
StringTable::unlink(is_alive_closure());
+
// Clean up unreferenced symbols in symbol table.
SymbolTable::unlink();
-
- assert(_marking_stack.is_empty(), "stack should be empty by now");
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Fri Apr 26 09:53:22 2013 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Fri Apr 26 10:40:36 2013 +0200
@@ -2354,22 +2354,24 @@
}
TraceTime tm_c("class unloading", print_phases(), true, gclog_or_tty);
+
+ // This is the point where the entire marking should have completed.
+ assert(cm->marking_stacks_empty(), "Marking should have completed");
+
// Follow system dictionary roots and unload classes.
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
- // Follow code cache roots.
+ // Unload nmethods.
CodeCache::do_unloading(is_alive_closure(), purged_class);
- cm->follow_marking_stacks(); // Flush marking stack.
-
- // Update subklass/sibling/implementor links of live klasses
+
+ // Prune dead klasses from subklass/sibling/implementor lists.
Klass::clean_weak_klass_links(is_alive_closure());
- // Visit interned string tables and delete unmarked oops
+ // Delete entries for dead interned strings.
StringTable::unlink(is_alive_closure());
+
// Clean up unreferenced symbols in symbol table.
SymbolTable::unlink();
-
- assert(cm->marking_stacks_empty(), "marking stacks should be empty");
}
void PSParallelCompact::follow_klass(ParCompactionManager* cm, Klass* klass) {
--- a/hotspot/src/share/vm/memory/genMarkSweep.cpp Fri Apr 26 09:53:22 2013 +0200
+++ b/hotspot/src/share/vm/memory/genMarkSweep.cpp Fri Apr 26 10:40:36 2013 +0200
@@ -223,23 +223,23 @@
&is_alive, &keep_alive, &follow_stack_closure, NULL);
}
- // Follow system dictionary roots and unload classes
+ // This is the point where the entire marking should have completed.
+ assert(_marking_stack.is_empty(), "Marking should have completed");
+
+ // Unload classes and purge the SystemDictionary.
bool purged_class = SystemDictionary::do_unloading(&is_alive);
- // Follow code cache roots
+ // Unload nmethods.
CodeCache::do_unloading(&is_alive, purged_class);
- follow_stack(); // Flush marking stack
- // Update subklass/sibling/implementor links of live klasses
+ // Prune dead klasses from subklass/sibling/implementor lists.
Klass::clean_weak_klass_links(&is_alive);
- assert(_marking_stack.is_empty(), "just drained");
- // Visit interned string tables and delete unmarked oops
+ // Delete entries for dead interned strings.
StringTable::unlink(&is_alive);
+
// Clean up unreferenced symbols in symbol table.
SymbolTable::unlink();
-
- assert(_marking_stack.is_empty(), "stack should be empty by now");
}