mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 17:44:40 +02:00
7197350: NPG: jvmtiHeapReferenceCallback receives incorrect reference_kind for system class roots
Fix the iteration over the system classes and report the correct reference kind. Reviewed-by: coleenp, rbackman
This commit is contained in:
parent
2ab9ff2658
commit
b979c4ebe0
3 changed files with 18 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue