提交 50ae95ff 编写于 作者: M mgronlun

8047812: Ensure ClassLoaderDataGraph::classes_unloading_do only delivers...

8047812: Ensure ClassLoaderDataGraph::classes_unloading_do only delivers klasses from CLDs with non-reclaimed class loader oops
Reviewed-by: coleenp, sspitsyn, ehelin
上级 12c88917
...@@ -531,6 +531,7 @@ bool ClassLoaderData::contains_klass(Klass* klass) { ...@@ -531,6 +531,7 @@ bool ClassLoaderData::contains_klass(Klass* klass) {
// GC root of class loader data created. // GC root of class loader data created.
ClassLoaderData* ClassLoaderDataGraph::_head = NULL; ClassLoaderData* ClassLoaderDataGraph::_head = NULL;
ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL; ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL;
ClassLoaderData* ClassLoaderDataGraph::_saved_unloading = NULL;
ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL; ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL;
bool ClassLoaderDataGraph::_should_purge = false; bool ClassLoaderDataGraph::_should_purge = false;
...@@ -628,7 +629,9 @@ void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) { ...@@ -628,7 +629,9 @@ void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) {
void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) { void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) { // Only walk the head until any clds not purged from prior unloading
// (CMS doesn't purge right away).
for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) {
cld->classes_do(f); cld->classes_do(f);
} }
} }
...@@ -676,6 +679,11 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) { ...@@ -676,6 +679,11 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
ClassLoaderData* data = _head; ClassLoaderData* data = _head;
ClassLoaderData* prev = NULL; ClassLoaderData* prev = NULL;
bool seen_dead_loader = false; bool seen_dead_loader = false;
// Save previous _unloading pointer for CMS which may add to unloading list before
// purging and we don't want to rewalk the previously unloaded class loader data.
_saved_unloading = _unloading;
// mark metadata seen on the stack and code cache so we can delete // mark metadata seen on the stack and code cache so we can delete
// unneeded entries. // unneeded entries.
bool has_redefined_a_class = JvmtiExport::has_redefined_a_class(); bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
......
...@@ -66,6 +66,7 @@ class ClassLoaderDataGraph : public AllStatic { ...@@ -66,6 +66,7 @@ class ClassLoaderDataGraph : public AllStatic {
static ClassLoaderData* _unloading; static ClassLoaderData* _unloading;
// CMS support. // CMS support.
static ClassLoaderData* _saved_head; static ClassLoaderData* _saved_head;
static ClassLoaderData* _saved_unloading;
static bool _should_purge; static bool _should_purge;
static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS); static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册