From 234fc716d4196ddfe38fb3b63d60882437844d3f Mon Sep 17 00:00:00 2001 From: stefank Date: Tue, 11 Sep 2012 14:59:23 +0200 Subject: [PATCH] 7197350: NPG: jvmtiHeapReferenceCallback receives incorrect reference_kind for system class roots Summary: Fix the iteration over the system classes and report the correct reference kind. Reviewed-by: coleenp, rbackman --- src/share/vm/memory/iterator.cpp | 4 ++++ src/share/vm/memory/iterator.hpp | 7 +++++++ src/share/vm/prims/jvmtiTagMap.cpp | 11 +++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/share/vm/memory/iterator.cpp b/src/share/vm/memory/iterator.cpp index f437e0fbe..af5720335 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 91d8bcf59..825bc23ee 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 a9dabdc14..cd91a0c8d 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; } -- GitLab