8025834: NPE in Parallel Scavenge with -XX:+CheckUnhandledOops
authorehelin
Mon, 21 Oct 2013 14:20:47 +0200
changeset 21116 6e8fb0940359
parent 21115 ba1a3dc8dc16
child 21117 89fa6b136f85
8025834: NPE in Parallel Scavenge with -XX:+CheckUnhandledOops Reviewed-by: coleenp, mgerdin, sspitsyn
hotspot/src/share/vm/prims/jvmtiImpl.cpp
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Mon Oct 21 01:04:01 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Mon Oct 21 14:20:47 2013 +0200
@@ -225,18 +225,20 @@
   _method = NULL;
   _bci    = 0;
   _class_loader = NULL;
-#ifdef CHECK_UNHANDLED_OOPS
-  // This one is always allocated with new, but check it just in case.
-  Thread *thread = Thread::current();
-  if (thread->is_in_stack((address)&_method)) {
-    thread->allow_unhandled_oop((oop*)&_method);
-  }
-#endif // CHECK_UNHANDLED_OOPS
 }
 
 JvmtiBreakpoint::JvmtiBreakpoint(Method* m_method, jlocation location) {
   _method        = m_method;
   _class_loader  = _method->method_holder()->class_loader_data()->class_loader();
+#ifdef CHECK_UNHANDLED_OOPS
+  // _class_loader can't be wrapped in a Handle, because JvmtiBreakpoint:s are
+  // eventually allocated on the heap.
+  //
+  // The code handling JvmtiBreakpoint:s allocated on the stack can't be
+  // interrupted by a GC until _class_loader is reachable by the GC via the
+  // oops_do method.
+  Thread::current()->allow_unhandled_oop(&_class_loader);
+#endif // CHECK_UNHANDLED_OOPS
   assert(_method != NULL, "_method != NULL");
   _bci           = (int) location;
   assert(_bci >= 0, "_bci >= 0");