src/hotspot/share/runtime/sharedRuntime.cpp
changeset 51446 0fc5fb135f2d
parent 51267 2cd8bbccbd2d
child 51591 9183040e34d8
--- a/src/hotspot/share/runtime/sharedRuntime.cpp	Mon Aug 20 14:25:02 2018 +0200
+++ b/src/hotspot/share/runtime/sharedRuntime.cpp	Mon Aug 20 17:25:45 2018 +0200
@@ -2135,17 +2135,21 @@
   static int _max_size;                       // max. arg size seen
 
   static void add_method_to_histogram(nmethod* nm) {
-    Method* m = nm->method();
-    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);
-    int count = nm->method()->compiled_invocation_count();
-    _arity_histogram[arity]  += count;
-    _size_histogram[argsize] += count;
-    _max_arity = MAX2(_max_arity, arity);
-    _max_size  = MAX2(_max_size, argsize);
+    // 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);
+      int count = nm->method()->compiled_invocation_count();
+      _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) {