8016277: Crash in nmethod::is_compiled_by_c1() on x86
authorroland
Mon, 26 Aug 2013 16:12:20 +0200
changeset 19711 95cc0162a92d
parent 19710 2f8ca425504e
child 19714 5afc245c36a7
child 19715 a3f8b34430ef
child 19717 7819ffdaf0ff
8016277: Crash in nmethod::is_compiled_by_c1() on x86 Summary: Method pointer for zombie methods may be invalid Reviewed-by: kvn, coleenp
hotspot/src/share/vm/code/nmethod.cpp
--- a/hotspot/src/share/vm/code/nmethod.cpp	Wed Aug 21 13:34:45 2013 +0200
+++ b/hotspot/src/share/vm/code/nmethod.cpp	Mon Aug 26 16:12:20 2013 +0200
@@ -93,18 +93,21 @@
 #endif
 
 bool nmethod::is_compiled_by_c1() const {
-  if (compiler() == NULL || method() == NULL)  return false;  // can happen during debug printing
-  if (is_native_method()) return false;
+  if (compiler() == NULL) {
+    return false;
+  }
   return compiler()->is_c1();
 }
 bool nmethod::is_compiled_by_c2() const {
-  if (compiler() == NULL || method() == NULL)  return false;  // can happen during debug printing
-  if (is_native_method()) return false;
+  if (compiler() == NULL) {
+    return false;
+  }
   return compiler()->is_c2();
 }
 bool nmethod::is_compiled_by_shark() const {
-  if (is_native_method()) return false;
-  assert(compiler() != NULL, "must be");
+  if (compiler() == NULL) {
+    return false;
+  }
   return compiler()->is_shark();
 }
 
@@ -1401,6 +1404,9 @@
     // nmethods aren't scanned for GC.
     _oops_are_stale = true;
 #endif
+     // the Method may be reclaimed by class unloading now that the
+     // nmethod is in zombie state
+    set_method(NULL);
   } else {
     assert(state == not_entrant, "other cases may need to be handled differently");
   }