diff --git a/src/share/vm/memory/iterator.cpp b/src/share/vm/memory/iterator.cpp index f437e0fbe6bd61cf72aa76d6dc509dfeb56d8c23..af57203355eb84d33bb1f231a6d64e760e18267e 100644 --- a/src/share/vm/memory/iterator.cpp +++ b/src/share/vm/memory/iterator.cpp @@ -26,6 +26,10 @@ #include "memory/iterator.hpp" #include "oops/oop.inline.hpp" +void KlassToOopClosure::do_klass(Klass* k) { + k->oops_do(_oop_closure); +} + void ObjectToOopClosure::do_object(oop obj) { obj->oop_iterate(_cl); } diff --git a/src/share/vm/memory/iterator.hpp b/src/share/vm/memory/iterator.hpp index 91d8bcf596c4719373756d42bc27b19b285ab088..825bc23eed5837c407b1f2fe74eabb1dded9b741 100644 --- a/src/share/vm/memory/iterator.hpp +++ b/src/share/vm/memory/iterator.hpp @@ -128,6 +128,13 @@ class KlassClosure : public Closure { virtual void do_klass(Klass* k) = 0; }; +class KlassToOopClosure : public KlassClosure { + OopClosure* _oop_closure; + public: + KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {} + virtual void do_klass(Klass* k); +}; + // ObjectClosure is used for iterating through an object space class ObjectClosure : public Closure { diff --git a/src/share/vm/prims/jvmtiTagMap.cpp b/src/share/vm/prims/jvmtiTagMap.cpp index a9dabdc14c1035164ab69f96344e1e1e8f0ce9b7..cd91a0c8d7f4cb9f6b108953aa13e55e49f85b76 100644 --- a/src/share/vm/prims/jvmtiTagMap.cpp +++ b/src/share/vm/prims/jvmtiTagMap.cpp @@ -2552,15 +2552,17 @@ class SimpleRootsClosure : public OopClosure { return; } - jvmtiHeapReferenceKind kind = root_kind(); - assert(Universe::heap()->is_in_reserved(o), "should be impossible"); + + jvmtiHeapReferenceKind kind = root_kind(); + if (kind == JVMTI_HEAP_REFERENCE_SYSTEM_CLASS) { // SystemDictionary::always_strong_oops_do reports the application // class loader as a root. We want this root to be reported as // a root kind of "OTHER" rather than "SYSTEM_CLASS". - if (o->is_instance() && root_kind() == JVMTI_HEAP_REFERENCE_SYSTEM_CLASS) { + if (!o->is_instanceMirror()) { kind = JVMTI_HEAP_REFERENCE_OTHER; } + } // some objects are ignored - in the case of simple // roots it's mostly Symbol*s that we are skipping @@ -2991,7 +2993,8 @@ inline bool VM_HeapWalkOperation::collect_simple_roots() { // Preloaded classes and loader from the system dictionary blk.set_kind(JVMTI_HEAP_REFERENCE_SYSTEM_CLASS); SystemDictionary::always_strong_oops_do(&blk); - ClassLoaderDataGraph::always_strong_oops_do(&blk, NULL, false); + KlassToOopClosure klass_blk(&blk); + ClassLoaderDataGraph::always_strong_oops_do(&blk, &klass_blk, false); if (blk.stopped()) { return false; }