< prev index next >

src/hotspot/share/runtime/sharedRuntime.cpp

Print this page
rev 51433 : 8209588: SIGSEGV in MethodArityHistogram() with -XX:+CountCompiledCalls
Reviewed-by:

@@ -2133,11 +2133,14 @@
   static int _size_histogram[MAX_ARITY];      // histogram of arg size in words
   static int _max_arity;                      // max. arity seen
   static int _max_size;                       // max. arg size seen
 
   static void add_method_to_histogram(nmethod* nm) {
-    Method* m = nm->method();
+    // These checks are taken from CodeHeapState::print_names()
+    Method* m = (nm == NULL) ? NULL : nm->method();  // nm->method() may be uninitialized, i.e. != NULL, but invalid
+    if ((nm != NULL) && (m != NULL) && !nm->is_zombie() && !nm->is_not_installed() &&
+        os::is_readable_pointer(m) && os::is_readable_pointer(m->constants())) {
     ArgumentCount args(m->signature());
     int arity   = args.size() + (m->is_static() ? 0 : 1);
     int argsize = m->size_of_parameters();
     arity   = MIN2(arity, MAX_ARITY-1);
     argsize = MIN2(argsize, MAX_ARITY-1);

@@ -2145,10 +2148,11 @@
     _arity_histogram[arity]  += count;
     _size_histogram[argsize] += count;
     _max_arity = MAX2(_max_arity, arity);
     _max_size  = MAX2(_max_size, argsize);
   }
+  }
 
   void print_histogram_helper(int n, int* histo, const char* name) {
     const int N = MIN2(5, n);
     tty->print_cr("\nHistogram of call arity (incl. rcvr, calls to compiled methods only):");
     double sum = 0;
< prev index next >