SUGGESTED FIX
diff --git a/src/share/vm/oops/instanceRefKlass.cpp b/src/share/vm/oops/instance
RefKlass.cpp
--- a/src/share/vm/oops/instanceRefKlass.cpp
+++ b/src/share/vm/oops/instanceRefKlass.cpp
@@ -438,6 +438,11 @@ void instanceRefKlass::oop_verify_on(oop
}
}
+bool instanceRefKlass::owns_pending_list_lock(JavaThread* thread) {
+ Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock());
+ return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock);
+}
+
void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_
lock) {
// we may enter this with pending exception set
PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS ar
gument
diff --git a/src/share/vm/oops/instanceRefKlass.hpp b/src/share/vm/oops/instance
RefKlass.hpp
--- a/src/share/vm/oops/instanceRefKlass.hpp
+++ b/src/share/vm/oops/instanceRefKlass.hpp
@@ -84,6 +84,7 @@ class instanceRefKlass: public instanceK
static void release_and_notify_pending_list_lock(BasicLock *pending_list_basi
c_lock);
static void acquire_pending_list_lock(BasicLock *pending_list_basic_lock);
+ static bool owns_pending_list_lock(JavaThread* thread);
// Update non-static oop maps so 'referent', 'nextPending' and
// 'discovered' will look like non-oops
diff --git a/src/share/vm/oops/methodOop.cpp b/src/share/vm/oops/methodOop.cpp
--- a/src/share/vm/oops/methodOop.cpp
+++ b/src/share/vm/oops/methodOop.cpp
@@ -283,6 +283,12 @@ void methodOopDesc::print_invocation_cou
// Build a methodDataOop object to hold information about this method
// collected in the interpreter.
void methodOopDesc::build_interpreter_method_data(methodHandle method, TRAPS) {
+ // Do not profile method if current thread holds the pending list lock,
+ // which avoids deadlock for acquiring the MethodData_lock.
+ if (instanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) {
+ return 0;
+ }
+
// Grab a lock here to prevent multiple
// methodDataOops from being created.
MutexLocker ml(MethodData_lock, THREAD);
|