hotspot/src/share/vm/code/codeCache.cpp
changeset 13728 882756847a04
parent 13391 30245956af37
child 13878 6e6a462a6cff
--- a/hotspot/src/share/vm/code/codeCache.cpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,9 @@
 #include "precompiled.hpp"
 #include "code/codeBlob.hpp"
 #include "code/codeCache.hpp"
+#include "code/compiledIC.hpp"
 #include "code/dependencies.hpp"
+#include "code/icBuffer.hpp"
 #include "code/nmethod.hpp"
 #include "code/pcDesc.hpp"
 #include "gc_implementation/shared/markSweep.hpp"
@@ -33,7 +35,7 @@
 #include "memory/gcLocker.hpp"
 #include "memory/iterator.hpp"
 #include "memory/resourceArea.hpp"
-#include "oops/methodOop.hpp"
+#include "oops/method.hpp"
 #include "oops/objArrayOop.hpp"
 #include "oops/oop.inline.hpp"
 #include "runtime/handles.inline.hpp"
@@ -54,6 +56,7 @@
   int stub_size;
   int relocation_size;
   int scopes_oop_size;
+  int scopes_metadata_size;
   int scopes_data_size;
   int scopes_pcs_size;
 
@@ -66,6 +69,7 @@
     stub_size        = 0;
     relocation_size  = 0;
     scopes_oop_size  = 0;
+    scopes_metadata_size  = 0;
     scopes_data_size = 0;
     scopes_pcs_size  = 0;
   }
@@ -83,6 +87,7 @@
                   code_size               * 100 / total_size,
                   stub_size               * 100 / total_size,
                   scopes_oop_size         * 100 / total_size,
+                  scopes_metadata_size    * 100 / total_size,
                   scopes_data_size        * 100 / total_size,
                   scopes_pcs_size         * 100 / total_size);
   }
@@ -98,6 +103,7 @@
       stub_size        += nm->stub_size();
 
       scopes_oop_size  += nm->oops_size();
+      scopes_metadata_size  += nm->metadata_size();
       scopes_data_size += nm->scopes_data_size();
       scopes_pcs_size  += nm->scopes_pcs_size();
     } else {
@@ -284,6 +290,12 @@
   }
 }
 
+void CodeCache::alive_nmethods_do(void f(nmethod* nm)) {
+  assert_locked_or_safepoint(CodeCache_lock);
+  FOR_ALL_ALIVE_NMETHODS(nm) {
+    f(nm);
+  }
+}
 
 int CodeCache::alignment_unit() {
   return (int)_heap->alignment_unit();
@@ -448,7 +460,7 @@
 #endif //PRODUCT
 
 
-nmethod* CodeCache::find_and_remove_saved_code(methodOop m) {
+nmethod* CodeCache::find_and_remove_saved_code(Method* m) {
   MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   nmethod* saved = _saved_nmethods;
   nmethod* prev = NULL;
@@ -468,7 +480,7 @@
       if (LogCompilation && (xtty != NULL)) {
         ttyLocker ttyl;
         xtty->begin_elem("nmethod_reconnected compile_id='%3d'", saved->compile_id());
-        xtty->method(methodOop(m));
+        xtty->method(m);
         xtty->stamp();
         xtty->end_elem();
       }
@@ -518,7 +530,7 @@
   if (LogCompilation && (xtty != NULL)) {
     ttyLocker ttyl;
     xtty->begin_elem("nmethod_disconnected compile_id='%3d'", nm->compile_id());
-    xtty->method(methodOop(nm->method()));
+    xtty->method(nm->method());
     xtty->stamp();
     xtty->end_elem();
   }
@@ -548,6 +560,32 @@
   set_needs_cache_clean(false);
   prune_scavenge_root_nmethods();
   assert(!nmethod::oops_do_marking_is_active(), "oops_do_marking_prologue must be called");
+
+#ifdef ASSERT
+  // make sure that we aren't leaking icholders
+  int count = 0;
+  FOR_ALL_BLOBS(cb) {
+    if (cb->is_nmethod()) {
+      RelocIterator iter((nmethod*)cb);
+      while(iter.next()) {
+        if (iter.type() == relocInfo::virtual_call_type) {
+          if (CompiledIC::is_icholder_call_site(iter.virtual_call_reloc())) {
+            CompiledIC *ic = CompiledIC_at(iter.reloc());
+            if (TraceCompiledIC) {
+              tty->print("noticed icholder " INTPTR_FORMAT " ", ic->cached_icholder());
+              ic->print();
+            }
+            assert(ic->cached_icholder() != NULL, "must be non-NULL");
+            count++;
+          }
+        }
+      }
+    }
+  }
+
+  assert(count + InlineCacheBuffer::pending_icholder_count() + CompiledICHolder::live_not_claimed_count() ==
+         CompiledICHolder::live_count(), "must agree");
+#endif
 }
 
 
@@ -649,8 +687,8 @@
 
   { No_Safepoint_Verifier nsv;
     for (DepChange::ContextStream str(changes, nsv); str.next(); ) {
-      klassOop d = str.klass();
-      number_of_marked_CodeBlobs += instanceKlass::cast(d)->mark_dependent_nmethods(changes);
+      Klass* d = str.klass();
+      number_of_marked_CodeBlobs += InstanceKlass::cast(d)->mark_dependent_nmethods(changes);
     }
   }
 
@@ -683,10 +721,10 @@
   int number_of_marked_CodeBlobs = 0;
 
   // Deoptimize all methods of the evolving class itself
-  objArrayOop old_methods = dependee->methods();
+  Array<Method*>* old_methods = dependee->methods();
   for (int i = 0; i < old_methods->length(); i++) {
     ResourceMark rm;
-    methodOop old_method = (methodOop) old_methods->obj_at(i);
+    Method* old_method = old_methods->at(i);
     nmethod *nm = old_method->code();
     if (nm != NULL) {
       nm->mark_for_deoptimization();
@@ -702,7 +740,7 @@
       nm->mark_for_deoptimization();
       number_of_marked_CodeBlobs++;
     } else  {
-      // flush caches in case they refer to a redefined methodOop
+      // flush caches in case they refer to a redefined Method*
       nm->clear_inline_caches();
     }
   }
@@ -721,7 +759,7 @@
 }
 
 
-int CodeCache::mark_for_deoptimization(methodOop dependee) {
+int CodeCache::mark_for_deoptimization(Method* dependee) {
   MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   int number_of_marked_CodeBlobs = 0;