8178543: Optimize Klass::is_shared()
authoriklam
Fri, 14 Apr 2017 08:33:57 -0700
changeset 46413 b0f67ec8f6be
parent 46412 92fd9825e468
child 46414 5d1d862dc8d8
8178543: Optimize Klass::is_shared() Reviewed-by: coleenp, jiangli
hotspot/src/share/vm/oops/klass.cpp
hotspot/src/share/vm/oops/klass.hpp
hotspot/src/share/vm/oops/klassVtable.cpp
hotspot/src/share/vm/utilities/accessFlags.hpp
--- a/hotspot/src/share/vm/oops/klass.cpp	Tue Apr 25 18:56:45 2017 +0000
+++ b/hotspot/src/share/vm/oops/klass.cpp	Fri Apr 14 08:33:57 2017 -0700
@@ -497,10 +497,12 @@
 
   // Null out class_loader_data because we don't share that yet.
   set_class_loader_data(NULL);
+  set_is_shared();
 }
 
 void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
   assert(is_klass(), "ensure C++ vtable is restored");
+  assert(is_shared(), "must be set");
   TRACE_RESTORE_ID(this);
 
   // If an exception happened during CDS restore, some of these fields may already be
--- a/hotspot/src/share/vm/oops/klass.hpp	Tue Apr 25 18:56:45 2017 +0000
+++ b/hotspot/src/share/vm/oops/klass.hpp	Fri Apr 14 08:33:57 2017 -0700
@@ -563,6 +563,8 @@
   void set_has_vanilla_constructor()    { _access_flags.set_has_vanilla_constructor(); }
   bool has_miranda_methods () const     { return access_flags().has_miranda_methods(); }
   void set_has_miranda_methods()        { _access_flags.set_has_miranda_methods(); }
+  bool is_shared() const                { return access_flags().is_shared_class(); } // shadows MetaspaceObj::is_shared)()
+  void set_is_shared()                  { _access_flags.set_is_shared_class(); }
 
   bool is_cloneable() const;
   void set_is_cloneable();
--- a/hotspot/src/share/vm/oops/klassVtable.cpp	Tue Apr 25 18:56:45 2017 +0000
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp	Fri Apr 14 08:33:57 2017 -0700
@@ -1014,15 +1014,16 @@
 void itableMethodEntry::initialize(Method* m) {
   if (m == NULL) return;
 
+#ifdef ASSERT
   if (MetaspaceShared::is_in_shared_space((void*)&_method) &&
      !MetaspaceShared::remapped_readwrite()) {
     // At runtime initialize_itable is rerun as part of link_class_impl()
     // for a shared class loaded by the non-boot loader.
     // The dumptime itable method entry should be the same as the runtime entry.
     assert(_method == m, "sanity");
-  } else {
-    _method = m;
   }
+#endif
+  _method = m;
 }
 
 klassItable::klassItable(InstanceKlass* klass) {
--- a/hotspot/src/share/vm/utilities/accessFlags.hpp	Tue Apr 25 18:56:45 2017 +0000
+++ b/hotspot/src/share/vm/utilities/accessFlags.hpp	Fri Apr 14 08:33:57 2017 -0700
@@ -64,6 +64,7 @@
   JVM_ACC_HAS_FINALIZER           = 0x40000000,     // True if klass has a non-empty finalize() method
   JVM_ACC_IS_CLONEABLE_FAST       = (int)0x80000000,// True if klass implements the Cloneable interface and can be optimized in generated code
   JVM_ACC_HAS_FINAL_METHOD        = 0x01000000,     // True if klass has final method
+  JVM_ACC_IS_SHARED_CLASS         = 0x02000000,     // True if klass is shared
 
   // Klass* and Method* flags
   JVM_ACC_HAS_LOCAL_VARIABLE_TABLE= 0x00200000,
@@ -146,6 +147,8 @@
   bool has_finalizer           () const { return (_flags & JVM_ACC_HAS_FINALIZER          ) != 0; }
   bool has_final_method        () const { return (_flags & JVM_ACC_HAS_FINAL_METHOD       ) != 0; }
   bool is_cloneable_fast       () const { return (_flags & JVM_ACC_IS_CLONEABLE_FAST      ) != 0; }
+  bool is_shared_class         () const { return (_flags & JVM_ACC_IS_SHARED_CLASS        ) != 0; }
+
   // Klass* and Method* flags
   bool has_localvariable_table () const { return (_flags & JVM_ACC_HAS_LOCAL_VARIABLE_TABLE) != 0; }
   void set_has_localvariable_table()    { atomic_set_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); }
@@ -216,6 +219,7 @@
   void set_has_final_method()          { atomic_set_bits(JVM_ACC_HAS_FINAL_METHOD);        }
   void set_is_cloneable_fast()         { atomic_set_bits(JVM_ACC_IS_CLONEABLE_FAST);       }
   void set_has_miranda_methods()       { atomic_set_bits(JVM_ACC_HAS_MIRANDA_METHODS);     }
+  void set_is_shared_class()           { atomic_set_bits(JVM_ACC_IS_SHARED_CLASS);         }
 
  public:
   // field flags