--- a/hotspot/src/share/vm/memory/iterator.cpp Mon Jul 07 10:12:40 2014 +0200
+++ b/hotspot/src/share/vm/memory/iterator.cpp Mon Jul 07 12:37:11 2014 +0200
@@ -35,10 +35,6 @@
cld->oops_do(_oop_closure, &_klass_closure, _must_claim_cld);
}
-void CLDToKlassAndOopClosure::do_cld(ClassLoaderData* cld) {
- cld->oops_do(_oop_closure, _klass_closure, _must_claim_cld);
-}
-
void ObjectToOopClosure::do_object(oop obj) {
obj->oop_iterate(_cl);
}
@@ -47,20 +43,6 @@
ShouldNotCallThis();
}
-void CodeBlobToOopClosure::do_nmethod(nmethod* nm) {
- nm->oops_do(_cl);
- if (_fix_relocations) {
- nm->fix_oop_relocations();
- }
-}
-
-void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
- nmethod* nm = cb->as_nmethod_or_null();
- if (nm != NULL) {
- do_nmethod(nm);
- }
-}
-
MarkingCodeBlobClosure::MarkScope::MarkScope(bool activate)
: _active(activate)
{
@@ -73,7 +55,32 @@
void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
nmethod* nm = cb->as_nmethod_or_null();
- if (nm != NULL && !nm->test_set_oops_do_mark()) {
- do_nmethod(nm);
+ if (nm == NULL) return;
+ if (!nm->test_set_oops_do_mark()) {
+ NOT_PRODUCT(if (TraceScavenge) nm->print_on(tty, "oops_do, 1st visit\n"));
+ do_newly_marked_nmethod(nm);
+ } else {
+ NOT_PRODUCT(if (TraceScavenge) nm->print_on(tty, "oops_do, skipped on 2nd visit\n"));
}
}
+
+void CodeBlobToOopClosure::do_newly_marked_nmethod(nmethod* nm) {
+ nm->oops_do(_cl, /*allow_zombie=*/ false);
+}
+
+void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
+ if (!_do_marking) {
+ nmethod* nm = cb->as_nmethod_or_null();
+ NOT_PRODUCT(if (TraceScavenge && Verbose && nm != NULL) nm->print_on(tty, "oops_do, unmarked visit\n"));
+ // This assert won't work, since there are lots of mini-passes
+ // (mostly in debug mode) that co-exist with marking phases.
+ //assert(!(cb->is_nmethod() && ((nmethod*)cb)->test_oops_do_mark()), "found marked nmethod during mark-free phase");
+ if (nm != NULL) {
+ nm->oops_do(_cl);
+ }
+ } else {
+ MarkingCodeBlobClosure::do_code_blob(cb);
+ }
+}
+
+