8155672: Remove instanceKlassHandles and KlassHandles
authorcoleenp
Wed, 15 Mar 2017 10:25:37 -0400
changeset 46329 53ccc37bda19
parent 46328 6061df52d610
child 46330 40e2718fac10
child 46331 e3017116b9e5
8155672: Remove instanceKlassHandles and KlassHandles Summary: Summary: Use unhandled pointers for Klass and InstanceKlass, remove handles with no implementation. Reviewed-by: dholmes, lfoltan, vlivanov, sspitsyn
hotspot/src/cpu/aarch64/vm/methodHandles_aarch64.cpp
hotspot/src/cpu/arm/vm/methodHandles_arm.cpp
hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp
hotspot/src/cpu/s390/vm/methodHandles_s390.cpp
hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp
hotspot/src/cpu/x86/vm/methodHandles_x86.cpp
hotspot/src/share/vm/aot/aotCodeHeap.cpp
hotspot/src/share/vm/aot/aotCodeHeap.hpp
hotspot/src/share/vm/aot/aotCompiledMethod.cpp
hotspot/src/share/vm/aot/aotCompiledMethod.hpp
hotspot/src/share/vm/aot/aotLoader.cpp
hotspot/src/share/vm/aot/aotLoader.hpp
hotspot/src/share/vm/c1/c1_Runtime1.cpp
hotspot/src/share/vm/ci/ciArrayKlass.cpp
hotspot/src/share/vm/ci/ciArrayKlass.hpp
hotspot/src/share/vm/ci/ciEnv.cpp
hotspot/src/share/vm/ci/ciInstanceKlass.cpp
hotspot/src/share/vm/ci/ciInstanceKlass.hpp
hotspot/src/share/vm/ci/ciKlass.cpp
hotspot/src/share/vm/ci/ciKlass.hpp
hotspot/src/share/vm/ci/ciMethod.cpp
hotspot/src/share/vm/ci/ciObjArrayKlass.cpp
hotspot/src/share/vm/ci/ciObjArrayKlass.hpp
hotspot/src/share/vm/ci/ciObjectFactory.cpp
hotspot/src/share/vm/ci/ciReplay.cpp
hotspot/src/share/vm/ci/ciType.cpp
hotspot/src/share/vm/ci/ciType.hpp
hotspot/src/share/vm/ci/ciTypeArrayKlass.cpp
hotspot/src/share/vm/ci/ciTypeArrayKlass.hpp
hotspot/src/share/vm/classfile/classFileParser.cpp
hotspot/src/share/vm/classfile/classLoader.cpp
hotspot/src/share/vm/classfile/classLoader.hpp
hotspot/src/share/vm/classfile/classLoaderData.cpp
hotspot/src/share/vm/classfile/classLoaderExt.hpp
hotspot/src/share/vm/classfile/dictionary.cpp
hotspot/src/share/vm/classfile/dictionary.hpp
hotspot/src/share/vm/classfile/javaAssertions.cpp
hotspot/src/share/vm/classfile/javaClasses.cpp
hotspot/src/share/vm/classfile/javaClasses.hpp
hotspot/src/share/vm/classfile/klassFactory.cpp
hotspot/src/share/vm/classfile/klassFactory.hpp
hotspot/src/share/vm/classfile/loaderConstraints.cpp
hotspot/src/share/vm/classfile/loaderConstraints.hpp
hotspot/src/share/vm/classfile/moduleEntry.cpp
hotspot/src/share/vm/classfile/placeholders.hpp
hotspot/src/share/vm/classfile/systemDictionary.cpp
hotspot/src/share/vm/classfile/systemDictionary.hpp
hotspot/src/share/vm/classfile/systemDictionaryShared.hpp
hotspot/src/share/vm/classfile/verificationType.cpp
hotspot/src/share/vm/classfile/verificationType.hpp
hotspot/src/share/vm/classfile/verifier.cpp
hotspot/src/share/vm/classfile/verifier.hpp
hotspot/src/share/vm/code/codeCache.cpp
hotspot/src/share/vm/code/codeCache.hpp
hotspot/src/share/vm/code/compiledIC.cpp
hotspot/src/share/vm/code/compiledIC.hpp
hotspot/src/share/vm/code/dependencies.hpp
hotspot/src/share/vm/compiler/compileBroker.cpp
hotspot/src/share/vm/gc/shared/allocTracer.cpp
hotspot/src/share/vm/gc/shared/allocTracer.hpp
hotspot/src/share/vm/gc/shared/collectedHeap.cpp
hotspot/src/share/vm/gc/shared/collectedHeap.hpp
hotspot/src/share/vm/gc/shared/collectedHeap.inline.hpp
hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
hotspot/src/share/vm/interpreter/linkResolver.cpp
hotspot/src/share/vm/interpreter/linkResolver.hpp
hotspot/src/share/vm/interpreter/rewriter.cpp
hotspot/src/share/vm/interpreter/rewriter.hpp
hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
hotspot/src/share/vm/jvmci/jvmciCompilerToVM.hpp
hotspot/src/share/vm/jvmci/jvmciEnv.cpp
hotspot/src/share/vm/jvmci/jvmciEnv.hpp
hotspot/src/share/vm/jvmci/jvmciRuntime.cpp
hotspot/src/share/vm/memory/universe.cpp
hotspot/src/share/vm/memory/universe.hpp
hotspot/src/share/vm/oops/arrayKlass.cpp
hotspot/src/share/vm/oops/arrayKlass.hpp
hotspot/src/share/vm/oops/constantPool.cpp
hotspot/src/share/vm/oops/constantPool.hpp
hotspot/src/share/vm/oops/cpCache.cpp
hotspot/src/share/vm/oops/cpCache.hpp
hotspot/src/share/vm/oops/fieldStreams.hpp
hotspot/src/share/vm/oops/instanceKlass.cpp
hotspot/src/share/vm/oops/instanceKlass.hpp
hotspot/src/share/vm/oops/instanceMirrorKlass.cpp
hotspot/src/share/vm/oops/instanceMirrorKlass.hpp
hotspot/src/share/vm/oops/klass.cpp
hotspot/src/share/vm/oops/klassVtable.cpp
hotspot/src/share/vm/oops/klassVtable.hpp
hotspot/src/share/vm/oops/method.cpp
hotspot/src/share/vm/oops/method.hpp
hotspot/src/share/vm/oops/objArrayKlass.cpp
hotspot/src/share/vm/oops/objArrayKlass.hpp
hotspot/src/share/vm/oops/typeArrayKlass.cpp
hotspot/src/share/vm/prims/jni.cpp
hotspot/src/share/vm/prims/jvm.cpp
hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp
hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp
hotspot/src/share/vm/prims/jvmtiEnv.cpp
hotspot/src/share/vm/prims/jvmtiEnvBase.cpp
hotspot/src/share/vm/prims/jvmtiExport.cpp
hotspot/src/share/vm/prims/jvmtiExport.hpp
hotspot/src/share/vm/prims/jvmtiImpl.cpp
hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp
hotspot/src/share/vm/prims/jvmtiTagMap.cpp
hotspot/src/share/vm/prims/jvmtiTagMap.hpp
hotspot/src/share/vm/prims/jvmtiThreadState.hpp
hotspot/src/share/vm/prims/methodHandles.cpp
hotspot/src/share/vm/prims/methodHandles.hpp
hotspot/src/share/vm/prims/nativeLookup.cpp
hotspot/src/share/vm/prims/stackwalk.cpp
hotspot/src/share/vm/prims/unsafe.cpp
hotspot/src/share/vm/prims/whitebox.cpp
hotspot/src/share/vm/runtime/deoptimization.cpp
hotspot/src/share/vm/runtime/fieldDescriptor.hpp
hotspot/src/share/vm/runtime/handles.cpp
hotspot/src/share/vm/runtime/handles.hpp
hotspot/src/share/vm/runtime/handles.inline.hpp
hotspot/src/share/vm/runtime/javaCalls.cpp
hotspot/src/share/vm/runtime/javaCalls.hpp
hotspot/src/share/vm/runtime/jfieldIDWorkaround.hpp
hotspot/src/share/vm/runtime/os.cpp
hotspot/src/share/vm/runtime/reflection.cpp
hotspot/src/share/vm/runtime/reflection.hpp
hotspot/src/share/vm/runtime/reflectionUtils.cpp
hotspot/src/share/vm/runtime/reflectionUtils.hpp
hotspot/src/share/vm/runtime/serviceThread.cpp
hotspot/src/share/vm/runtime/sharedRuntime.cpp
hotspot/src/share/vm/runtime/statSampler.cpp
hotspot/src/share/vm/runtime/thread.cpp
hotspot/src/share/vm/runtime/vframe.cpp
hotspot/src/share/vm/runtime/vmStructs.cpp
hotspot/src/share/vm/runtime/vm_operations.hpp
hotspot/src/share/vm/services/attachListener.cpp
hotspot/src/share/vm/services/classLoadingService.cpp
hotspot/src/share/vm/services/classLoadingService.hpp
hotspot/src/share/vm/services/diagnosticCommand.cpp
hotspot/src/share/vm/services/diagnosticFramework.cpp
hotspot/src/share/vm/services/gcNotifier.cpp
hotspot/src/share/vm/services/heapDumper.cpp
hotspot/src/share/vm/services/lowMemoryDetector.cpp
hotspot/src/share/vm/services/management.cpp
hotspot/src/share/vm/services/management.hpp
hotspot/src/share/vm/services/memoryManager.cpp
hotspot/src/share/vm/services/memoryPool.cpp
hotspot/src/share/vm/services/memoryService.cpp
hotspot/src/share/vm/services/threadService.cpp
hotspot/src/share/vm/shark/sharkRuntime.cpp
hotspot/src/share/vm/utilities/exceptions.cpp
hotspot/src/share/vm/utilities/xmlstream.cpp
hotspot/src/share/vm/utilities/xmlstream.hpp
--- a/hotspot/src/cpu/aarch64/vm/methodHandles_aarch64.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/aarch64/vm/methodHandles_aarch64.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2014, Red Hat Inc. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -63,7 +63,7 @@
                                  Register obj, SystemDictionary::WKID klass_id,
                                  const char* error_message) {
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  Klass* klass = SystemDictionary::well_known_klass(klass_id);
   Register temp = rscratch2;
   Register temp2 = rscratch1; // used by MacroAssembler::cmpptr
   Label L_ok, L_bad;
--- a/hotspot/src/cpu/arm/vm/methodHandles_arm.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/arm/vm/methodHandles_arm.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, 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
@@ -67,7 +67,7 @@
                                  Register obj, Register temp1, Register temp2, SystemDictionary::WKID klass_id,
                                  const char* error_message) {
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  Klass* klass = SystemDictionary::well_known_klass(klass_id);
   Label L_ok, L_bad;
   BLOCK_COMMENT("verify_klass {");
   __ verify_oop(obj);
--- a/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012, 2015 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -71,7 +71,7 @@
                                  Register temp_reg, Register temp2_reg,
                                  const char* error_message) {
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  Klass* klass = SystemDictionary::well_known_klass(klass_id);
   Label L_ok, L_bad;
   BLOCK_COMMENT("verify_klass {");
   __ verify_oop(obj_reg);
--- a/hotspot/src/cpu/s390/vm/methodHandles_s390.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/s390/vm/methodHandles_s390.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2016 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -73,7 +73,7 @@
                                  const char* error_message) {
 
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  KLass* klass = SystemDictionary::well_known_klass(klass_id);
 
   assert(temp_reg != Z_R0 && // Is used as base register!
          temp_reg != noreg && temp2_reg != noreg, "need valid registers!");
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, 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
@@ -71,7 +71,7 @@
                                  Register temp_reg, Register temp2_reg,
                                  const char* error_message) {
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  Klass* klass = SystemDictionary::well_known_klass(klass_id);
   bool did_save = false;
   if (temp_reg == noreg || temp2_reg == noreg) {
     temp_reg = L1;
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -65,7 +65,7 @@
                                  Register obj, SystemDictionary::WKID klass_id,
                                  const char* error_message) {
   InstanceKlass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id);
-  KlassHandle klass = SystemDictionary::well_known_klass(klass_id);
+  Klass* klass = SystemDictionary::well_known_klass(klass_id);
   Register temp = rdi;
   Register temp2 = noreg;
   LP64_ONLY(temp2 = rscratch1);  // used by MacroAssembler::cmpptr
--- a/hotspot/src/share/vm/aot/aotCodeHeap.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotCodeHeap.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -560,7 +560,7 @@
 }
 #endif
 
-Method* AOTCodeHeap::find_method(KlassHandle klass, Thread* thread, const char* method_name) {
+Method* AOTCodeHeap::find_method(Klass* klass, Thread* thread, const char* method_name) {
   int method_name_len = build_u2_from((address)method_name);
   method_name += 2;
   const char* signature_name = method_name + method_name_len;
@@ -578,14 +578,14 @@
              name == vmSymbols::class_initializer_name()) {
     // Never search superclasses for constructors
     if (klass->is_instance_klass()) {
-      m = InstanceKlass::cast(klass())->find_method(name, signature);
+      m = InstanceKlass::cast(klass)->find_method(name, signature);
     } else {
       m = NULL;
     }
   } else {
     m = klass->lookup_method(name, signature);
     if (m == NULL && klass->is_instance_klass()) {
-      m = InstanceKlass::cast(klass())->lookup_method_in_ordered_interfaces(name, signature);
+      m = InstanceKlass::cast(klass)->lookup_method_in_ordered_interfaces(name, signature);
     }
   }
   if (m == NULL) {
@@ -669,28 +669,28 @@
   }
 }
 
-bool AOTCodeHeap::load_klass_data(instanceKlassHandle kh, Thread* thread) {
+bool AOTCodeHeap::load_klass_data(InstanceKlass* ik, Thread* thread) {
   ResourceMark rm;
 
   NOT_PRODUCT( klasses_seen++; )
 
-  AOTKlassData* klass_data = find_klass(kh());
+  AOTKlassData* klass_data = find_klass(ik);
   if (klass_data == NULL) {
     return false;
   }
 
-  if (!kh->has_passed_fingerprint_check()) {
+  if (!ik->has_passed_fingerprint_check()) {
     NOT_PRODUCT( aot_klasses_fp_miss++; )
     log_trace(aot, class, fingerprint)("class  %s%s  has bad fingerprint in  %s tid=" INTPTR_FORMAT,
-                                   kh->internal_name(), kh->is_shared() ? " (shared)" : "",
+                                   ik->internal_name(), ik->is_shared() ? " (shared)" : "",
                                    _lib->name(), p2i(thread));
     sweep_dependent_methods(klass_data);
     return false;
   }
 
-  if (kh->has_been_redefined()) {
+  if (ik->has_been_redefined()) {
     log_trace(aot, class, load)("class  %s%s in %s  has been redefined tid=" INTPTR_FORMAT,
-                                   kh->internal_name(), kh->is_shared() ? " (shared)" : "",
+                                   ik->internal_name(), ik->is_shared() ? " (shared)" : "",
                                    _lib->name(), p2i(thread));
     sweep_dependent_methods(klass_data);
     return false;
@@ -698,26 +698,26 @@
 
   assert(klass_data->_class_id < _class_count, "invalid class id");
   AOTClass* aot_class = &_classes[klass_data->_class_id];
-  if (aot_class->_classloader != NULL && aot_class->_classloader != kh->class_loader_data()) {
+  if (aot_class->_classloader != NULL && aot_class->_classloader != ik->class_loader_data()) {
     log_trace(aot, class, load)("class  %s  in  %s already loaded for classloader %p vs %p tid=" INTPTR_FORMAT,
-                             kh->internal_name(), _lib->name(), aot_class->_classloader, kh->class_loader_data(), p2i(thread));
+                             ik->internal_name(), _lib->name(), aot_class->_classloader, ik->class_loader_data(), p2i(thread));
     NOT_PRODUCT( aot_klasses_cl_miss++; )
     return false;
   }
 
-  if (_lib->config()->_omitAssertions && JavaAssertions::enabled(kh->name()->as_C_string(), kh->class_loader() == NULL)) {
-    log_trace(aot, class, load)("class  %s  in  %s does not have java assertions in compiled code, but assertions are enabled for this execution.", kh->internal_name(), _lib->name());
+  if (_lib->config()->_omitAssertions && JavaAssertions::enabled(ik->name()->as_C_string(), ik->class_loader() == NULL)) {
+    log_trace(aot, class, load)("class  %s  in  %s does not have java assertions in compiled code, but assertions are enabled for this execution.", ik->internal_name(), _lib->name());
     sweep_dependent_methods(klass_data);
     return false;
   }
 
   NOT_PRODUCT( aot_klasses_found++; )
 
-  log_trace(aot, class, load)("found  %s  in  %s for classloader %p tid=" INTPTR_FORMAT, kh->internal_name(), _lib->name(), kh->class_loader_data(), p2i(thread));
+  log_trace(aot, class, load)("found  %s  in  %s for classloader %p tid=" INTPTR_FORMAT, ik->internal_name(), _lib->name(), ik->class_loader_data(), p2i(thread));
 
-  aot_class->_classloader = kh->class_loader_data();
+  aot_class->_classloader = ik->class_loader_data();
   // Set klass's Resolve (second) got cell.
-  _metaspace_got[klass_data->_got_index] = kh();
+  _metaspace_got[klass_data->_got_index] = ik;
 
   // Initialize global symbols of the DSO to the corresponding VM symbol values.
   link_global_lib_symbols();
@@ -745,7 +745,7 @@
       // aot_name format: "<u2_size>Ljava/lang/ThreadGroup;<u2_size>addUnstarted<u2_size>()V"
       int klass_len = build_u2_from((address)aot_name);
       const char* method_name = aot_name + 2 + klass_len;
-      Method* m = AOTCodeHeap::find_method(kh, thread, method_name);
+      Method* m = AOTCodeHeap::find_method(ik, thread, method_name);
       methodHandle mh(thread, m);
       if (mh->code() != NULL) { // Does it have already compiled code?
         continue; // Don't overwrite
@@ -866,7 +866,7 @@
 }
 #endif
 
-void AOTCodeHeap::flush_evol_dependents_on(instanceKlassHandle dependee) {
+void AOTCodeHeap::flush_evol_dependents_on(InstanceKlass* dependee) {
   for (int index = 0; index < _method_count; index++) {
     if (_code_to_aot[index]._state != in_use) {
       continue; // Skip uninitialized entries.
--- a/hotspot/src/share/vm/aot/aotCodeHeap.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotCodeHeap.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -253,7 +253,7 @@
   virtual void* next(void *p) const;
 
   AOTKlassData* find_klass(InstanceKlass* ik);
-  bool load_klass_data(instanceKlassHandle kh, Thread* thread);
+  bool load_klass_data(InstanceKlass* ik, Thread* thread);
   Klass* get_klass_from_got(const char* klass_name, int klass_len, const Method* method);
   void sweep_dependent_methods(AOTKlassData* klass_data);
   bool is_dependent_method(Klass* dependee, AOTCompiledMethod* aot);
@@ -289,13 +289,13 @@
     return NULL;
   }
 
-  static Method* find_method(KlassHandle klass, Thread* thread, const char* method_name);
+  static Method* find_method(Klass* klass, Thread* thread, const char* method_name);
 
   void cleanup_inline_caches();
 
   DEBUG_ONLY( int verify_icholder_relocations(); )
 
-  void flush_evol_dependents_on(instanceKlassHandle dependee);
+  void flush_evol_dependents_on(InstanceKlass* dependee);
 
   void alive_methods_do(void f(CompiledMethod* nm));
 
--- a/hotspot/src/share/vm/aot/aotCompiledMethod.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotCompiledMethod.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -143,9 +143,8 @@
       int full_len = 2 + klass_len + 2 + method_name_len + 2 + signature_len;
       if (!klass_matched || memcmp(_name, meta_name, full_len) != 0) { // Does not match?
         Thread* thread = Thread::current();
-        KlassHandle klass = KlassHandle(thread, k);
         const char* method_name = klass_name + klass_len;
-        m = AOTCodeHeap::find_method(klass, thread, method_name);
+        m = AOTCodeHeap::find_method(k, thread, method_name);
       }
       meta = ((intptr_t)m) | 1;
       *entry = (Metadata*)meta; // Should be atomic on x64
@@ -239,7 +238,7 @@
 
 // We don't have full dependencies for AOT methods, so flushing is
 // more conservative than for nmethods.
-void AOTCompiledMethod::flush_evol_dependents_on(instanceKlassHandle dependee) {
+void AOTCompiledMethod::flush_evol_dependents_on(InstanceKlass* dependee) {
   if (is_java_method()) {
     cleanup_inline_caches();
     mark_for_deoptimization();
--- a/hotspot/src/share/vm/aot/aotCompiledMethod.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotCompiledMethod.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -240,7 +240,7 @@
 
 #ifdef HOTSWAP
   // Flushing and deoptimization in case of evolution
-  void flush_evol_dependents_on(instanceKlassHandle dependee);
+  void flush_evol_dependents_on(InstanceKlass* dependee);
 #endif // HOTSWAP
 
   virtual void metadata_do(void f(Metadata*));
--- a/hotspot/src/share/vm/aot/aotLoader.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotLoader.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -37,10 +37,10 @@
 // Iterate over all AOT Libraries
 #define FOR_ALL_AOT_LIBRARIES(lib) for (GrowableArrayIterator<AOTLib*> lib = libraries()->begin(); lib != libraries()->end(); ++lib)
 
-void AOTLoader::load_for_klass(instanceKlassHandle kh, Thread* thread) {
+void AOTLoader::load_for_klass(InstanceKlass* ik, Thread* thread) {
   if (UseAOT) {
     FOR_ALL_AOT_HEAPS(heap) {
-      (*heap)->load_klass_data(kh, thread);
+      (*heap)->load_klass_data(ik, thread);
     }
   }
 }
@@ -98,7 +98,7 @@
 }
 
 // Flushing and deoptimization in case of evolution
-void AOTLoader::flush_evol_dependents_on(instanceKlassHandle dependee) {
+void AOTLoader::flush_evol_dependents_on(InstanceKlass* dependee) {
   // make non entrant and mark for deoptimization
   FOR_ALL_AOT_HEAPS(heap) {
     (*heap)->flush_evol_dependents_on(dependee);
--- a/hotspot/src/share/vm/aot/aotLoader.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/aot/aotLoader.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -58,7 +58,7 @@
   static void universe_init() NOT_AOT_RETURN;
   static void set_narrow_klass_shift() NOT_AOT_RETURN;
   static bool contains(address p) NOT_AOT({ return false; });
-  static void load_for_klass(instanceKlassHandle, Thread* thread) NOT_AOT_RETURN;
+  static void load_for_klass(InstanceKlass* ik, Thread* thread) NOT_AOT_RETURN;
   static bool find_klass(InstanceKlass* ik) NOT_AOT({ return false; });
   static uint64_t get_saved_fingerprint(InstanceKlass* ik) NOT_AOT({ return 0; });
   static void oops_do(OopClosure* f) NOT_AOT_RETURN;
@@ -69,7 +69,7 @@
 
 #ifdef HOTSWAP
   // Flushing and deoptimization in case of evolution
-  static void flush_evol_dependents_on(instanceKlassHandle dependee) NOT_AOT_RETURN;
+  static void flush_evol_dependents_on(InstanceKlass* dependee) NOT_AOT_RETURN;
 #endif // HOTSWAP
 
 };
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -331,7 +331,7 @@
 
   assert(klass->is_klass(), "not a class");
   Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
-  instanceKlassHandle h(thread, klass);
+  InstanceKlass* h = InstanceKlass::cast(klass);
   h->check_valid_for_instantiation(true, CHECK);
   // make sure klass is initialized
   h->initialize(CHECK);
@@ -857,8 +857,8 @@
   bool deoptimize_for_volatile = false;
   bool deoptimize_for_atomic = false;
   int patch_field_offset = -1;
-  KlassHandle init_klass(THREAD, NULL); // klass needed by load_klass_patching code
-  KlassHandle load_klass(THREAD, NULL); // klass needed by load_klass_patching code
+  Klass* init_klass = NULL; // klass needed by load_klass_patching code
+  Klass* load_klass = NULL; // klass needed by load_klass_patching code
   Handle mirror(THREAD, NULL);                    // oop needed by load_mirror_patching code
   Handle appendix(THREAD, NULL);                  // oop needed by appendix_patching code
   bool load_klass_or_mirror_patch_id =
@@ -905,7 +905,7 @@
       case Bytecodes::_putstatic:
       case Bytecodes::_getstatic:
         { Klass* klass = resolve_field_return_klass(caller_method, bci, CHECK);
-          init_klass = KlassHandle(THREAD, klass);
+          init_klass = klass;
           mirror = Handle(THREAD, klass->java_mirror());
         }
         break;
@@ -945,8 +945,7 @@
         break;
       default: fatal("unexpected bytecode for load_klass_or_mirror_patch_id");
     }
-    // convert to handle
-    load_klass = KlassHandle(THREAD, k);
+    load_klass = k;
   } else if (stub_id == load_appendix_patching_id) {
     Bytecode_invoke bytecode(caller_method, bci);
     Bytecodes::Code bc = bytecode.invoke_code();
@@ -1067,7 +1066,7 @@
           // initializing thread are forced to come into the VM and
           // block.
           do_patch = (code != Bytecodes::_getstatic && code != Bytecodes::_putstatic) ||
-                     InstanceKlass::cast(init_klass())->is_initialized();
+                     InstanceKlass::cast(init_klass)->is_initialized();
           NativeGeneralJump* jump = nativeGeneralJump_at(instr_pc);
           if (jump->jump_destination() == being_initialized_entry) {
             assert(do_patch == true, "initialization must be complete at this point");
@@ -1079,8 +1078,8 @@
                    n_copy->data() == (intptr_t)Universe::non_oop_word(),
                    "illegal init value");
             if (stub_id == Runtime1::load_klass_patching_id) {
-              assert(load_klass() != NULL, "klass not set");
-              n_copy->set_data((intx) (load_klass()));
+              assert(load_klass != NULL, "klass not set");
+              n_copy->set_data((intx) (load_klass));
             } else {
               assert(mirror() != NULL, "klass not set");
               // Don't need a G1 pre-barrier here since we assert above that data isn't an oop.
@@ -1131,7 +1130,7 @@
               assert(stub_id == Runtime1::load_klass_patching_id, "wrong stub id");
               metadata_Relocation* r = mds.metadata_reloc();
               Metadata** metadata_adr = r->metadata_addr();
-              *metadata_adr = load_klass();
+              *metadata_adr = load_klass;
               r->fix_metadata_relocation();
               found = true;
             }
--- a/hotspot/src/share/vm/ci/ciArrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciArrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -37,7 +37,7 @@
 // ciArrayKlass::ciArrayKlass
 //
 // Loaded array klass.
-ciArrayKlass::ciArrayKlass(KlassHandle h_k) : ciKlass(h_k) {
+ciArrayKlass::ciArrayKlass(Klass* k) : ciKlass(k) {
   assert(get_Klass()->is_array_klass(), "wrong type");
   _dimension = get_ArrayKlass()->dimension();
 }
--- a/hotspot/src/share/vm/ci/ciArrayKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciArrayKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -37,7 +37,7 @@
   jint _dimension;
 
 protected:
-  ciArrayKlass(KlassHandle h_k);
+  ciArrayKlass(Klass* k);
   ciArrayKlass(ciSymbol* name, int dimension, BasicType bt);
 
   ArrayKlass* get_ArrayKlass() {
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -426,7 +426,7 @@
   } else {
     fail_type = _unloaded_ciinstance_klass;
   }
-  KlassHandle found_klass;
+  Klass* found_klass;
   {
     ttyUnlocker ttyul;  // release tty lock to avoid ordering problems
     MutexLocker ml(Compile_lock);
@@ -438,7 +438,7 @@
       kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain,
                                                            KILL_COMPILE_ON_FATAL_(fail_type));
     }
-    found_klass = KlassHandle(THREAD, kls);
+    found_klass = kls;
   }
 
   // If we fail to find an array klass, look again for its element type.
@@ -467,22 +467,22 @@
     }
   }
 
-  if (found_klass() == NULL && !cpool.is_null() && cpool->has_preresolution()) {
+  if (found_klass == NULL && !cpool.is_null() && cpool->has_preresolution()) {
     // Look inside the constant pool for pre-resolved class entries.
     for (int i = cpool->length() - 1; i >= 1; i--) {
       if (cpool->tag_at(i).is_klass()) {
         Klass* kls = cpool->resolved_klass_at(i);
         if (kls->name() == sym) {
-          found_klass = KlassHandle(THREAD, kls);
+          found_klass = kls;
           break;
         }
       }
     }
   }
 
-  if (found_klass() != NULL) {
+  if (found_klass != NULL) {
     // Found it.  Build a CI handle.
-    return get_klass(found_klass());
+    return get_klass(found_klass);
   }
 
   if (require_local)  return NULL;
@@ -512,21 +512,21 @@
                                         bool& is_accessible,
                                         ciInstanceKlass* accessor) {
   EXCEPTION_CONTEXT;
-  KlassHandle klass; // = NULL;
+  Klass* klass = NULL;
   Symbol* klass_name = NULL;
 
   if (cpool->tag_at(index).is_symbol()) {
     klass_name = cpool->symbol_at(index);
   } else {
     // Check if it's resolved if it's not a symbol constant pool entry.
-    klass = KlassHandle(THREAD, ConstantPool::klass_at_if_loaded(cpool, index));
+    klass =  ConstantPool::klass_at_if_loaded(cpool, index);
     // Try to look it up by name.
-  if (klass.is_null()) {
+    if (klass == NULL) {
       klass_name = cpool->klass_name_at(index);
-  }
+    }
   }
 
-  if (klass.is_null()) {
+  if (klass == NULL) {
     // Not found in constant pool.  Use the name to do the lookup.
     ciKlass* k = get_klass_by_name_impl(accessor,
                                         cpool,
@@ -548,7 +548,7 @@
 
   // Check for prior unloaded klass.  The SystemDictionary's answers
   // can vary over time but the compiler needs consistency.
-  ciSymbol* name = get_symbol(klass()->name());
+  ciSymbol* name = get_symbol(klass->name());
   ciKlass* unloaded_klass = check_get_unloaded_klass(accessor, name);
   if (unloaded_klass != NULL) {
     is_accessible = false;
@@ -557,7 +557,7 @@
 
   // It is known to be accessible, since it was found in the constant pool.
   is_accessible = true;
-  return get_klass(klass());
+  return get_klass(klass);
 }
 
 // ------------------------------------------------------------------
@@ -713,10 +713,10 @@
   // Accessibility checks are performed in ciEnv::get_method_by_index_impl.
   assert(check_klass_accessibility(accessor, holder->get_Klass()), "holder not accessible");
 
-  KlassHandle h_accessor(accessor->get_instanceKlass());
-  KlassHandle h_holder(holder->get_Klass());
+  InstanceKlass* accessor_klass = accessor->get_instanceKlass();
+  Klass* holder_klass = holder->get_Klass();
   methodHandle dest_method;
-  LinkInfo link_info(h_holder, name, sig, h_accessor, LinkInfo::needs_access_check, tag);
+  LinkInfo link_info(holder_klass, name, sig, accessor_klass, LinkInfo::needs_access_check, tag);
   switch (bc) {
   case Bytecodes::_invokestatic:
     dest_method =
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -44,8 +44,8 @@
 // ciInstanceKlass::ciInstanceKlass
 //
 // Loaded instance klass.
-ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) :
-  ciKlass(h_k)
+ciInstanceKlass::ciInstanceKlass(Klass* k) :
+  ciKlass(k)
 {
   assert(get_Klass()->is_instance_klass(), "wrong type");
   assert(get_instanceKlass()->is_loaded(), "must be at least loaded");
@@ -83,7 +83,7 @@
   _java_mirror = NULL;
 
   if (is_shared()) {
-    if (h_k() != SystemDictionary::Object_klass()) {
+    if (k != SystemDictionary::Object_klass()) {
       super();
     }
     //compute_nonstatic_fields();  // done outside of constructor
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -77,7 +77,7 @@
   bool compute_injected_fields_helper();
 
 protected:
-  ciInstanceKlass(KlassHandle h_k);
+  ciInstanceKlass(Klass* k);
   ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain);
 
   InstanceKlass* get_instanceKlass() const {
--- a/hotspot/src/share/vm/ci/ciKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -35,11 +35,11 @@
 
 // ------------------------------------------------------------------
 // ciKlass::ciKlass
-ciKlass::ciKlass(KlassHandle h_k) : ciType(h_k) {
+ciKlass::ciKlass(Klass* k) : ciType(k) {
   assert(get_Klass()->is_klass(), "wrong type");
-  Klass* k = get_Klass();
-  _layout_helper = k->layout_helper();
-  Symbol* klass_name = k->name();
+  Klass* klass = get_Klass();
+  _layout_helper = klass->layout_helper();
+  Symbol* klass_name = klass->name();
   assert(klass_name != NULL, "wrong ciKlass constructor");
   _name = CURRENT_ENV->get_symbol(klass_name);
 }
@@ -48,7 +48,7 @@
 // ciKlass::ciKlass
 //
 // Nameless klass variant.
-ciKlass::ciKlass(KlassHandle h_k, ciSymbol* name) : ciType(h_k) {
+ciKlass::ciKlass(Klass* k, ciSymbol* name) : ciType(k) {
   assert(get_Klass()->is_klass(), "wrong type");
   _name = name;
   _layout_helper = Klass::_lh_neutral_value;
--- a/hotspot/src/share/vm/ci/ciKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -51,7 +51,7 @@
   jint _layout_helper;
 
 protected:
-  ciKlass(KlassHandle k_h, ciSymbol* name);
+  ciKlass(Klass* k, ciSymbol* name);
   ciKlass(ciSymbol* name, BasicType bt);
 
   Klass* get_Klass() const {
@@ -72,7 +72,7 @@
   void print_impl(outputStream* st);
 
 public:
-  ciKlass(KlassHandle k_h);
+  ciKlass(Klass* k);
 
   // What is the name of this klass?
   ciSymbol* name() const { return _name; }
--- a/hotspot/src/share/vm/ci/ciMethod.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -783,24 +783,24 @@
    check_is_loaded();
    VM_ENTRY_MARK;
 
-   KlassHandle caller_klass (THREAD, caller->get_Klass());
-   KlassHandle h_recv       (THREAD, exact_receiver->get_Klass());
-   KlassHandle h_resolved   (THREAD, holder()->get_Klass());
+   Klass* caller_klass = caller->get_Klass();
+   Klass* recv         = exact_receiver->get_Klass();
+   Klass* resolved     = holder()->get_Klass();
    Symbol* h_name      = name()->get_symbol();
    Symbol* h_signature = signature()->get_symbol();
 
-   LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass,
+   LinkInfo link_info(resolved, h_name, h_signature, caller_klass,
                       check_access ? LinkInfo::needs_access_check : LinkInfo::skip_access_check);
    methodHandle m;
    // Only do exact lookup if receiver klass has been linked.  Otherwise,
    // the vtable has not been setup, and the LinkResolver will fail.
-   if (h_recv->is_array_klass()
+   if (recv->is_array_klass()
         ||
-       InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
+       InstanceKlass::cast(recv)->is_linked() && !exact_receiver->is_interface()) {
      if (holder()->is_interface()) {
-       m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info);
+       m = LinkResolver::resolve_interface_call_or_null(recv, link_info);
      } else {
-       m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info);
+       m = LinkResolver::resolve_virtual_call_or_null(recv, link_info);
      }
    }
 
@@ -839,13 +839,13 @@
            receiver->as_instance_klass()->is_linked())) {
      VM_ENTRY_MARK;
 
-     KlassHandle caller_klass (THREAD, caller->get_Klass());
-     KlassHandle h_recv       (THREAD, receiver->get_Klass());
+     Klass* caller_klass = caller->get_Klass();
+     Klass* recv         = receiver->get_Klass();
      Symbol* h_name = name()->get_symbol();
      Symbol* h_signature = signature()->get_symbol();
 
-     LinkInfo link_info(h_recv, h_name, h_signature, caller_klass);
-     vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info);
+     LinkInfo link_info(recv, h_name, h_signature, caller_klass);
+     vtable_index = LinkResolver::resolve_virtual_vtable_index(recv, link_info);
      if (vtable_index == Method::nonvirtual_vtable_index) {
        // A statically bound method.  Return "no such index".
        vtable_index = Method::invalid_vtable_index;
--- a/hotspot/src/share/vm/ci/ciObjArrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciObjArrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -38,7 +38,7 @@
 // ciObjArrayKlass::ciObjArrayKlass
 //
 // Constructor for loaded object array klasses.
-ciObjArrayKlass::ciObjArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) {
+ciObjArrayKlass::ciObjArrayKlass(Klass* k) : ciArrayKlass(k) {
   assert(get_Klass()->is_objArray_klass(), "wrong type");
   Klass* element_Klass = get_ObjArrayKlass()->bottom_klass();
   _base_element_klass = CURRENT_ENV->get_klass(element_Klass);
--- a/hotspot/src/share/vm/ci/ciObjArrayKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciObjArrayKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -40,7 +40,7 @@
   ciKlass* _base_element_klass;
 
 protected:
-  ciObjArrayKlass(KlassHandle h_k);
+  ciObjArrayKlass(Klass* k);
   ciObjArrayKlass(ciSymbol* array_name,
                   ciKlass* base_element_klass,
                   int dimension);
--- a/hotspot/src/share/vm/ci/ciObjectFactory.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciObjectFactory.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -377,14 +377,13 @@
   }
 
   if (o->is_klass()) {
-    KlassHandle h_k(THREAD, (Klass*)o);
     Klass* k = (Klass*)o;
     if (k->is_instance_klass()) {
-      return new (arena()) ciInstanceKlass(h_k);
+      return new (arena()) ciInstanceKlass(k);
     } else if (k->is_objArray_klass()) {
-      return new (arena()) ciObjArrayKlass(h_k);
+      return new (arena()) ciObjArrayKlass(k);
     } else if (k->is_typeArray_klass()) {
-      return new (arena()) ciTypeArrayKlass(h_k);
+      return new (arena()) ciTypeArrayKlass(k);
     }
   } else if (o->is_method()) {
     methodHandle h_m(THREAD, (Method*)o);
--- a/hotspot/src/share/vm/ci/ciReplay.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciReplay.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, 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
@@ -799,8 +799,8 @@
         } else if (strcmp(field_signature, "[J") == 0) {
           value = oopFactory::new_longArray(length, CHECK);
         } else if (field_signature[0] == '[' && field_signature[1] == 'L') {
-          KlassHandle kelem = resolve_klass(field_signature + 1, CHECK);
-          value = oopFactory::new_objArray(kelem(), length, CHECK);
+          Klass* kelem = resolve_klass(field_signature + 1, CHECK);
+          value = oopFactory::new_objArray(kelem, length, CHECK);
         } else {
           report_error("unhandled array staticfield");
         }
@@ -840,8 +840,8 @@
         Handle value = java_lang_String::create_from_str(string_value, CHECK);
         java_mirror->obj_field_put(fd.offset(), value());
       } else if (field_signature[0] == 'L') {
-        KlassHandle k = resolve_klass(string_value, CHECK);
-        oop value = InstanceKlass::cast(k())->allocate_instance(CHECK);
+        Klass* k = resolve_klass(string_value, CHECK);
+        oop value = InstanceKlass::cast(k)->allocate_instance(CHECK);
         java_mirror->obj_field_put(fd.offset(), value);
       } else {
         report_error("unhandled staticfield");
--- a/hotspot/src/share/vm/ci/ciType.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciType.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -45,8 +45,8 @@
   _basic_type = basic_type;
 }
 
-ciType::ciType(KlassHandle k) : ciMetadata(k()) {
-  _basic_type = k()->is_array_klass() ? T_ARRAY : T_OBJECT;
+ciType::ciType(Klass* k) : ciMetadata(k) {
+  _basic_type = k->is_array_klass() ? T_ARRAY : T_OBJECT;
 }
 
 
--- a/hotspot/src/share/vm/ci/ciType.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciType.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -40,7 +40,7 @@
   BasicType _basic_type;
 
   ciType(BasicType t);     // for primitive and unloaded types
-  ciType(KlassHandle k);   // for subclasses (reference types)
+  ciType(Klass* k);        // for subclasses (reference types)
 
   const char* type_string() { return "ciType"; }
 
--- a/hotspot/src/share/vm/ci/ciTypeArrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciTypeArrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -33,7 +33,7 @@
 
 // ------------------------------------------------------------------
 // ciTypeArrayKlass::ciTypeArrayKlass
-ciTypeArrayKlass::ciTypeArrayKlass(KlassHandle h_k) : ciArrayKlass(h_k) {
+ciTypeArrayKlass::ciTypeArrayKlass(Klass* k) : ciArrayKlass(k) {
   assert(get_Klass()->is_typeArray_klass(), "wrong type");
   assert(element_type() == get_TypeArrayKlass()->element_type(), "");
 }
--- a/hotspot/src/share/vm/ci/ciTypeArrayKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/ci/ciTypeArrayKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -35,7 +35,7 @@
   CI_PACKAGE_ACCESS
 
 protected:
-  ciTypeArrayKlass(KlassHandle h_k);
+  ciTypeArrayKlass(Klass* k);
 
   TypeArrayKlass* get_TypeArrayKlass() {
     return (TypeArrayKlass*)get_Klass();
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -815,13 +815,13 @@
     int index;
     for (index = 0; index < itfs_len; index++) {
       const u2 interface_index = stream->get_u2(CHECK);
-      KlassHandle interf;
+      Klass* interf;
       check_property(
         valid_klass_reference_at(interface_index),
         "Interface name has bad constant pool index %u in class file %s",
         interface_index, CHECK);
       if (cp->tag_at(interface_index).is_klass()) {
-        interf = KlassHandle(THREAD, cp->resolved_klass_at(interface_index));
+        interf = cp->resolved_klass_at(interface_index);
       } else {
         Symbol* const unresolved_klass  = cp->klass_name_at(interface_index);
 
@@ -831,25 +831,24 @@
                            "Bad interface name in class file %s", CHECK);
 
         // Call resolve_super so classcircularity is checked
-        const Klass* const k =
-          SystemDictionary::resolve_super_or_fail(_class_name,
+        interf = SystemDictionary::resolve_super_or_fail(
+                                                  _class_name,
                                                   unresolved_klass,
                                                   Handle(THREAD, _loader_data->class_loader()),
                                                   _protection_domain,
                                                   false,
                                                   CHECK);
-        interf = KlassHandle(THREAD, k);
       }
 
-      if (!interf()->is_interface()) {
+      if (!interf->is_interface()) {
         THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(),
                    "Implementing class");
       }
 
-      if (InstanceKlass::cast(interf())->has_nonstatic_concrete_methods()) {
+      if (InstanceKlass::cast(interf)->has_nonstatic_concrete_methods()) {
         *has_nonstatic_concrete_methods = true;
       }
-      _local_interfaces->at_put(index, interf());
+      _local_interfaces->at_put(index, interf);
     }
 
     if (!_need_verify || itfs_len <= 1) {
--- a/hotspot/src/share/vm/classfile/classLoader.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1405,7 +1405,7 @@
   return NULL;
 }
 
-instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
+InstanceKlass* ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
   assert(name != NULL, "invariant");
   assert(THREAD->is_Java_thread(), "must be a JavaThread");
 
@@ -1512,13 +1512,13 @@
   ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
   Handle protection_domain;
 
-  instanceKlassHandle result = KlassFactory::create_from_stream(stream,
-                                                                name,
-                                                                loader_data,
-                                                                protection_domain,
-                                                                NULL, // host_klass
-                                                                NULL, // cp_patches
-                                                                THREAD);
+  InstanceKlass* result = KlassFactory::create_from_stream(stream,
+                                                           name,
+                                                           loader_data,
+                                                           protection_domain,
+                                                           NULL, // host_klass
+                                                           NULL, // cp_patches
+                                                           THREAD);
   if (HAS_PENDING_EXCEPTION) {
     if (DumpSharedSpaces) {
       tty->print_cr("Preload Error: Failed to load %s", class_name);
@@ -1891,15 +1891,15 @@
       // Construct name without extension
       TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
       // Use loader to load and initialize class
-      Klass* ik = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
-      instanceKlassHandle k (THREAD, ik);
-      if (k.not_null() && !HAS_PENDING_EXCEPTION) {
+      Klass* k = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
+      if (k != NULL && !HAS_PENDING_EXCEPTION) {
         k->initialize(THREAD);
       }
       bool exception_occurred = HAS_PENDING_EXCEPTION;
       clear_pending_exception_if_not_oom(CHECK);
-      if (CompileTheWorldPreloadClasses && k.not_null()) {
-        ConstantPool::preload_and_initialize_all_classes(k->constants(), THREAD);
+      if (CompileTheWorldPreloadClasses && k != NULL) {
+        InstanceKlass* ik = InstanceKlass::cast(k);
+        ConstantPool::preload_and_initialize_all_classes(ik->constants(), THREAD);
         if (HAS_PENDING_EXCEPTION) {
           // If something went wrong in preloading we just ignore it
           clear_pending_exception_if_not_oom(CHECK);
@@ -1908,7 +1908,7 @@
       }
 
       if (_compile_the_world_class_counter >= CompileTheWorldStartAt) {
-        if (k.is_null() || exception_occurred) {
+        if (k == NULL || exception_occurred) {
           // If something went wrong (e.g. ExceptionInInitializerError) we skip this class
           tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer);
         } else {
@@ -1916,8 +1916,9 @@
           // Preload all classes to get around uncommon traps
           // Iterate over all methods in class
           int comp_level = CompilationPolicy::policy()->initial_compile_level();
-          for (int n = 0; n < k->methods()->length(); n++) {
-            methodHandle m (THREAD, k->methods()->at(n));
+          InstanceKlass* ik = InstanceKlass::cast(k);
+          for (int n = 0; n < ik->methods()->length(); n++) {
+            methodHandle m (THREAD, ik->methods()->at(n));
             if (can_be_compiled(m, comp_level)) {
               if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) {
                 // Give sweeper a chance to keep up with CTW
--- a/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -371,7 +371,7 @@
                                                 const char* const file_name, TRAPS);
 
   // Load individual .class file
-  static instanceKlassHandle load_class(Symbol* class_name, bool search_append_only, TRAPS);
+  static InstanceKlass* load_class(Symbol* class_name, bool search_append_only, TRAPS);
 
   // If the specified package has been loaded by the system, then returns
   // the name of the directory or ZIP file that the package was loaded from.
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -760,7 +760,7 @@
     // Include the result of loader.toString() in the output. This allows
     // the user of the log to identify the class loader instance.
     JavaValue result(T_OBJECT);
-    KlassHandle spec_klass(THREAD, SystemDictionary::ClassLoader_klass());
+    Klass* spec_klass = SystemDictionary::ClassLoader_klass();
     JavaCalls::call_virtual(&result,
                             loader,
                             spec_klass,
--- a/hotspot/src/share/vm/classfile/classLoaderExt.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/classLoaderExt.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, 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
@@ -49,10 +49,10 @@
       return false;
     }
 
-    instanceKlassHandle record_result(Symbol* class_name,
-                                      ClassPathEntry* e,
-                                      const s2 classpath_index,
-                                      instanceKlassHandle result, TRAPS) {
+    InstanceKlass* record_result(Symbol* class_name,
+                                 ClassPathEntry* e,
+                                 const s2 classpath_index,
+                                 InstanceKlass* result, TRAPS) {
       if (ClassLoader::add_package(_file_name, classpath_index, THREAD)) {
 #if INCLUDE_CDS
         if (DumpSharedSpaces) {
@@ -64,7 +64,7 @@
 #endif
         return result;
       } else {
-        return instanceKlassHandle(); // NULL
+        return NULL;
       }
     }
   };
--- a/hotspot/src/share/vm/classfile/dictionary.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/dictionary.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -46,7 +46,7 @@
 }
 
 Dictionary::Dictionary(int table_size)
-  : TwoOopHashtable<Klass*, mtClass>(table_size, (int)entry_size()) {
+  : TwoOopHashtable<InstanceKlass*, mtClass>(table_size, (int)entry_size()) {
   _current_class_index = 0;
   _current_class_entry = NULL;
   _pd_cache_table = new ProtectionDomainCacheTable(defaultProtectionDomainCacheSize);
@@ -55,7 +55,7 @@
 
 Dictionary::Dictionary(int table_size, HashtableBucket<mtClass>* t,
                        int number_of_entries)
-  : TwoOopHashtable<Klass*, mtClass>(table_size, (int)entry_size(), t, number_of_entries) {
+  : TwoOopHashtable<InstanceKlass*, mtClass>(table_size, (int)entry_size(), t, number_of_entries) {
   _current_class_index = 0;
   _current_class_entry = NULL;
   _pd_cache_table = new ProtectionDomainCacheTable(defaultProtectionDomainCacheSize);
@@ -65,9 +65,9 @@
   return _pd_cache_table->get(protection_domain);
 }
 
-DictionaryEntry* Dictionary::new_entry(unsigned int hash, Klass* klass,
+DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass,
                                        ClassLoaderData* loader_data) {
-  DictionaryEntry* entry = (DictionaryEntry*)Hashtable<Klass*, mtClass>::new_entry(hash, klass);
+  DictionaryEntry* entry = (DictionaryEntry*)Hashtable<InstanceKlass*, mtClass>::new_entry(hash, klass);
   entry->set_loader_data(loader_data);
   entry->set_pd_set(NULL);
   assert(klass->is_instance_klass(), "Must be");
@@ -85,7 +85,7 @@
     entry->set_pd_set(to_delete->next());
     delete to_delete;
   }
-  Hashtable<Klass*, mtClass>::free_entry(entry);
+  Hashtable<InstanceKlass*, mtClass>::free_entry(entry);
 }
 
 
@@ -351,10 +351,10 @@
   _pd_cache_table->unlink(is_alive);
 }
 
-Klass* Dictionary::try_get_next_class() {
+InstanceKlass* Dictionary::try_get_next_class() {
   while (true) {
     if (_current_class_entry != NULL) {
-      Klass* k = _current_class_entry->klass();
+      InstanceKlass* k = _current_class_entry->klass();
       _current_class_entry = _current_class_entry->next();
       return k;
     }
@@ -371,15 +371,15 @@
 // by the compilers.
 
 void Dictionary::add_klass(Symbol* class_name, ClassLoaderData* loader_data,
-                           KlassHandle obj) {
+                           InstanceKlass* obj) {
   assert_locked_or_safepoint(SystemDictionary_lock);
-  assert(obj() != NULL, "adding NULL obj");
-  assert(obj()->name() == class_name, "sanity check on name");
+  assert(obj != NULL, "adding NULL obj");
+  assert(obj->name() == class_name, "sanity check on name");
   assert(loader_data != NULL, "Must be non-NULL");
 
   unsigned int hash = compute_hash(class_name, loader_data);
   int index = hash_to_index(hash);
-  DictionaryEntry* entry = new_entry(hash, obj(), loader_data);
+  DictionaryEntry* entry = new_entry(hash, obj, loader_data);
   add_entry(index, entry);
 }
 
@@ -410,8 +410,8 @@
 }
 
 
-Klass* Dictionary::find(int index, unsigned int hash, Symbol* name,
-                          ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
+InstanceKlass* Dictionary::find(int index, unsigned int hash, Symbol* name,
+                                ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
   DictionaryEntry* entry = get_entry(index, hash, name, loader_data);
   if (entry != NULL && entry->is_valid_protection_domain(protection_domain)) {
     return entry->klass();
@@ -421,30 +421,30 @@
 }
 
 
-Klass* Dictionary::find_class(int index, unsigned int hash,
-                                Symbol* name, ClassLoaderData* loader_data) {
+InstanceKlass* Dictionary::find_class(int index, unsigned int hash,
+                                      Symbol* name, ClassLoaderData* loader_data) {
   assert_locked_or_safepoint(SystemDictionary_lock);
   assert (index == index_for(name, loader_data), "incorrect index?");
 
   DictionaryEntry* entry = get_entry(index, hash, name, loader_data);
-  return (entry != NULL) ? entry->klass() : (Klass*)NULL;
+  return (entry != NULL) ? entry->klass() : NULL;
 }
 
 
 // Variant of find_class for shared classes.  No locking required, as
 // that table is static.
 
-Klass* Dictionary::find_shared_class(int index, unsigned int hash,
-                                       Symbol* name) {
+InstanceKlass* Dictionary::find_shared_class(int index, unsigned int hash,
+                                             Symbol* name) {
   assert (index == index_for(name, NULL), "incorrect index?");
 
   DictionaryEntry* entry = get_entry(index, hash, name, NULL);
-  return (entry != NULL) ? entry->klass() : (Klass*)NULL;
+  return (entry != NULL) ? entry->klass() : NULL;
 }
 
 
 void Dictionary::add_protection_domain(int index, unsigned int hash,
-                                       instanceKlassHandle klass,
+                                       InstanceKlass* klass,
                                        ClassLoaderData* loader_data, Handle protection_domain,
                                        TRAPS) {
   Symbol*  klass_name = klass->name();
--- a/hotspot/src/share/vm/classfile/dictionary.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/dictionary.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -41,7 +41,7 @@
 // The data structure for the system dictionary (and the shared system
 // dictionary).
 
-class Dictionary : public TwoOopHashtable<Klass*, mtClass> {
+class Dictionary : public TwoOopHashtable<InstanceKlass*, mtClass> {
   friend class VMStructs;
 private:
   // current iteration index.
@@ -56,16 +56,16 @@
 
 protected:
   DictionaryEntry* bucket(int i) const {
-    return (DictionaryEntry*)Hashtable<Klass*, mtClass>::bucket(i);
+    return (DictionaryEntry*)Hashtable<InstanceKlass*, mtClass>::bucket(i);
   }
 
   // The following method is not MT-safe and must be done under lock.
   DictionaryEntry** bucket_addr(int i) {
-    return (DictionaryEntry**)Hashtable<Klass*, mtClass>::bucket_addr(i);
+    return (DictionaryEntry**)Hashtable<InstanceKlass*, mtClass>::bucket_addr(i);
   }
 
   void add_entry(int index, DictionaryEntry* new_entry) {
-    Hashtable<Klass*, mtClass>::add_entry(index, (HashtableEntry<Klass*, mtClass>*)new_entry);
+    Hashtable<InstanceKlass*, mtClass>::add_entry(index, (HashtableEntry<InstanceKlass*, mtClass>*)new_entry);
   }
 
   static size_t entry_size();
@@ -73,21 +73,21 @@
   Dictionary(int table_size);
   Dictionary(int table_size, HashtableBucket<mtClass>* t, int number_of_entries);
 
-  DictionaryEntry* new_entry(unsigned int hash, Klass* klass, ClassLoaderData* loader_data);
+  DictionaryEntry* new_entry(unsigned int hash, InstanceKlass* klass, ClassLoaderData* loader_data);
 
   DictionaryEntry* new_entry();
 
   void free_entry(DictionaryEntry* entry);
 
-  void add_klass(Symbol* class_name, ClassLoaderData* loader_data,KlassHandle obj);
+  void add_klass(Symbol* class_name, ClassLoaderData* loader_data, InstanceKlass* obj);
 
-  Klass* find_class(int index, unsigned int hash,
-                      Symbol* name, ClassLoaderData* loader_data);
+  InstanceKlass* find_class(int index, unsigned int hash,
+                            Symbol* name, ClassLoaderData* loader_data);
 
-  Klass* find_shared_class(int index, unsigned int hash, Symbol* name);
+  InstanceKlass* find_shared_class(int index, unsigned int hash, Symbol* name);
 
   // Compiler support
-  Klass* try_get_next_class();
+  InstanceKlass* try_get_next_class();
 
   // GC support
   void oops_do(OopClosure* f);
@@ -116,13 +116,13 @@
   void do_unloading();
 
   // Protection domains
-  Klass* find(int index, unsigned int hash, Symbol* name,
-                ClassLoaderData* loader_data, Handle protection_domain, TRAPS);
+  InstanceKlass* find(int index, unsigned int hash, Symbol* name,
+                      ClassLoaderData* loader_data, Handle protection_domain, TRAPS);
   bool is_valid_protection_domain(int index, unsigned int hash,
                                   Symbol* name, ClassLoaderData* loader_data,
                                   Handle protection_domain);
   void add_protection_domain(int index, unsigned int hash,
-                             instanceKlassHandle klass, ClassLoaderData* loader_data,
+                             InstanceKlass* klass, ClassLoaderData* loader_data,
                              Handle protection_domain, TRAPS);
 
   // Sharing support
@@ -243,9 +243,9 @@
 };
 
 // An entry in the system dictionary, this describes a class as
-// { Klass*, loader, protection_domain }.
+// { InstanceKlass*, loader, protection_domain }.
 
-class DictionaryEntry : public HashtableEntry<Klass*, mtClass> {
+class DictionaryEntry : public HashtableEntry<InstanceKlass*, mtClass> {
   friend class VMStructs;
  private:
   // Contains the set of approved protection domains that can access
@@ -277,15 +277,15 @@
   // Adds a protection domain to the approved set.
   void add_protection_domain(Dictionary* dict, Handle protection_domain);
 
-  Klass* klass() const { return (Klass*)literal(); }
-  Klass** klass_addr() { return (Klass**)literal_addr(); }
+  InstanceKlass* klass() const { return (InstanceKlass*)literal(); }
+  InstanceKlass** klass_addr() { return (InstanceKlass**)literal_addr(); }
 
   DictionaryEntry* next() const {
-    return (DictionaryEntry*)HashtableEntry<Klass*, mtClass>::next();
+    return (DictionaryEntry*)HashtableEntry<InstanceKlass*, mtClass>::next();
   }
 
   DictionaryEntry** next_addr() {
-    return (DictionaryEntry**)HashtableEntry<Klass*, mtClass>::next_addr();
+    return (DictionaryEntry**)HashtableEntry<InstanceKlass*, mtClass>::next_addr();
   }
 
   ClassLoaderData* loader_data() const { return _loader_data; }
@@ -323,7 +323,7 @@
   }
 
   bool equals(const Symbol* class_name, ClassLoaderData* loader_data) const {
-    Klass* klass = (Klass*)literal();
+    InstanceKlass* klass = (InstanceKlass*)literal();
     return (klass->name() == class_name && _loader_data == loader_data);
   }
 
--- a/hotspot/src/share/vm/classfile/javaAssertions.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/javaAssertions.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -96,7 +96,7 @@
 oop JavaAssertions::createAssertionStatusDirectives(TRAPS) {
   Symbol* asd_sym = vmSymbols::java_lang_AssertionStatusDirectives();
   Klass* k = SystemDictionary::resolve_or_fail(asd_sym, true, CHECK_NULL);
-  instanceKlassHandle asd_klass (THREAD, k);
+  InstanceKlass* asd_klass = InstanceKlass::cast(k);
   asd_klass->initialize(CHECK_NULL);
   Handle h = asd_klass->allocate_instance_handle(CHECK_NULL);
 
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -735,7 +735,7 @@
 }
 
 
-void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) {
+void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {
   assert(InstanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already");
 
   // If the offset was read from the shared archive, it was fixed up already
@@ -744,7 +744,7 @@
       // During bootstrap, java.lang.Class wasn't loaded so static field
       // offsets were computed without the size added it.  Go back and
       // update all the static field offsets to included the size.
-        for (JavaFieldStream fs(InstanceKlass::cast(k())); !fs.done(); fs.next()) {
+        for (JavaFieldStream fs(InstanceKlass::cast(k)); !fs.done(); fs.next()) {
         if (fs.access_flags().is_static()) {
           int real_offset = fs.offset() + InstanceMirrorKlass::offset_of_static_fields();
           fs.set_offset(real_offset);
@@ -755,7 +755,7 @@
   create_mirror(k, Handle(), Handle(), Handle(), CHECK);
 }
 
-void java_lang_Class::initialize_mirror_fields(KlassHandle k,
+void java_lang_Class::initialize_mirror_fields(Klass* k,
                                                Handle mirror,
                                                Handle protection_domain,
                                                TRAPS) {
@@ -769,11 +769,11 @@
   set_protection_domain(mirror(), protection_domain());
 
   // Initialize static fields
-  InstanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, mirror, CHECK);
+  InstanceKlass::cast(k)->do_local_static_fields(&initialize_static_field, mirror, CHECK);
 }
 
 // Set the java.lang.reflect.Module module field in the java_lang_Class mirror
-void java_lang_Class::set_mirror_module_field(KlassHandle k, Handle mirror, Handle module, TRAPS) {
+void java_lang_Class::set_mirror_module_field(Klass* k, Handle mirror, Handle module, TRAPS) {
   if (module.is_null()) {
     // During startup, the module may be NULL only if java.base has not been defined yet.
     // Put the class on the fixup_module_list to patch later when the java.lang.reflect.Module
@@ -791,7 +791,7 @@
           set_fixup_module_field_list(list);
         }
         k->class_loader_data()->inc_keep_alive();
-        fixup_module_field_list()->push(k());
+        fixup_module_field_list()->push(k);
       } else {
         javabase_was_defined = true;
       }
@@ -814,7 +814,7 @@
   }
 }
 
-void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
+void java_lang_Class::create_mirror(Klass* k, Handle class_loader,
                                     Handle module, Handle protection_domain, TRAPS) {
   assert(k->java_mirror() == NULL, "should only assign mirror once");
   // Use this moment of initialization to cache modifier_flags also,
@@ -831,8 +831,8 @@
     Handle mirror(THREAD, mirror_oop);
 
     // Setup indirection from mirror->klass
-    if (!k.is_null()) {
-      java_lang_Class::set_klass(mirror(), k());
+    if (k != NULL) {
+      java_lang_Class::set_klass(mirror(), k);
     }
 
     InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
@@ -844,11 +844,11 @@
     if (k->is_array_klass()) {
       oop comp_mirror;
       if (k->is_typeArray_klass()) {
-        BasicType type = TypeArrayKlass::cast(k())->element_type();
+        BasicType type = TypeArrayKlass::cast(k)->element_type();
         comp_mirror = Universe::java_mirror(type);
       } else {
         assert(k->is_objArray_klass(), "Must be");
-        Klass* element_klass = ObjArrayKlass::cast(k())->element_klass();
+        Klass* element_klass = ObjArrayKlass::cast(k)->element_klass();
         assert(element_klass != NULL, "Must have an element klass");
         comp_mirror = element_klass->java_mirror();
       }
@@ -857,7 +857,7 @@
       // Two-way link between the array klass and its component mirror:
       // (array_klass) k -> mirror -> component_mirror -> array_klass -> k
       set_component_mirror(mirror(), comp_mirror);
-      set_array_klass(comp_mirror, k());
+      set_array_klass(comp_mirror, k);
     } else {
       assert(k->is_instance_klass(), "Must be");
 
@@ -881,7 +881,7 @@
 
     // Setup indirection from klass->mirror last
     // after any exceptions can happen during allocations.
-    if (!k.is_null()) {
+    if (k != NULL) {
       k->set_java_mirror(mirror());
     }
   } else {
@@ -890,11 +890,11 @@
        new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
       set_fixup_mirror_list(list);
     }
-    fixup_mirror_list()->push(k());
+    fixup_mirror_list()->push(k);
   }
 }
 
-void java_lang_Class::fixup_module_field(KlassHandle k, Handle module) {
+void java_lang_Class::fixup_module_field(Klass* k, Handle module) {
   assert(_module_offset != 0, "must have been computed already");
   java_lang_Class::set_module(k->java_mirror(), module());
 }
@@ -1876,7 +1876,7 @@
       JavaValue cause(T_OBJECT);
       JavaCalls::call_virtual(&cause,
                               throwable,
-                              KlassHandle(THREAD, throwable->klass()),
+                              throwable->klass(),
                               vmSymbols::getCause_name(),
                               vmSymbols::void_throwable_signature(),
                               THREAD);
@@ -1904,7 +1904,7 @@
   JavaValue result(T_VOID);
   JavaCalls::call_virtual(&result,
                           throwable,
-                          KlassHandle(THREAD, SystemDictionary::Throwable_klass()),
+                          SystemDictionary::Throwable_klass(),
                           vmSymbols::printStackTrace_name(),
                           vmSymbols::void_method_signature(),
                           THREAD);
@@ -2153,14 +2153,13 @@
 
 oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRAPS) {
   // Allocate java.lang.StackTraceElement instance
-  Klass* k = SystemDictionary::StackTraceElement_klass();
+  InstanceKlass* k = SystemDictionary::StackTraceElement_klass();
   assert(k != NULL, "must be loaded in 1.4+");
-  instanceKlassHandle ik (THREAD, k);
-  if (ik->should_be_initialized()) {
-    ik->initialize(CHECK_0);
+  if (k->should_be_initialized()) {
+    k->initialize(CHECK_0);
   }
 
-  Handle element = ik->allocate_instance_handle(CHECK_0);
+  Handle element = k->allocate_instance_handle(CHECK_0);
 
   int version = method->constants()->version();
   fill_in(element, method->method_holder(), method, version, bci, method->name(), CHECK_0);
@@ -2489,10 +2488,10 @@
   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
   Symbol* name = vmSymbols::java_lang_reflect_Constructor();
   Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   // Ensure it is initialized
-  klass->initialize(CHECK_NH);
-  return klass->allocate_instance_handle(THREAD);
+  ik->initialize(CHECK_NH);
+  return ik->allocate_instance_handle(THREAD);
 }
 
 oop java_lang_reflect_Constructor::clazz(oop reflect) {
@@ -2629,10 +2628,10 @@
   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
   Symbol* name = vmSymbols::java_lang_reflect_Field();
   Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   // Ensure it is initialized
-  klass->initialize(CHECK_NH);
-  return klass->allocate_instance_handle(THREAD);
+  ik->initialize(CHECK_NH);
+  return ik->allocate_instance_handle(THREAD);
 }
 
 oop java_lang_reflect_Field::clazz(oop reflect) {
@@ -2756,10 +2755,10 @@
   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
   Symbol* name = vmSymbols::java_lang_reflect_Parameter();
   Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   // Ensure it is initialized
-  klass->initialize(CHECK_NH);
-  return klass->allocate_instance_handle(THREAD);
+  ik->initialize(CHECK_NH);
+  return ik->allocate_instance_handle(THREAD);
 }
 
 oop java_lang_reflect_Parameter::name(oop param) {
@@ -2812,11 +2811,10 @@
 
   Symbol* name = vmSymbols::java_lang_reflect_Module();
   Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
-  instanceKlassHandle klass (THREAD, k);
-
-  Handle jlrmh = klass->allocate_instance_handle(CHECK_NH);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  Handle jlrmh = ik->allocate_instance_handle(CHECK_NH);
   JavaValue result(T_VOID);
-  JavaCalls::call_special(&result, jlrmh, KlassHandle(THREAD, klass()),
+  JavaCalls::call_special(&result, jlrmh, ik,
                           vmSymbols::object_initializer_name(),
                           vmSymbols::java_lang_reflect_module_init_signature(),
                           loader, module_name, CHECK_NH);
@@ -2879,11 +2877,10 @@
 
 Handle reflect_ConstantPool::create(TRAPS) {
   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
-  Klass* k = SystemDictionary::reflect_ConstantPool_klass();
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* k = SystemDictionary::reflect_ConstantPool_klass();
   // Ensure it is initialized
-  klass->initialize(CHECK_NH);
-  return klass->allocate_instance_handle(THREAD);
+  k->initialize(CHECK_NH);
+  return k->allocate_instance_handle(THREAD);
 }
 
 
@@ -2921,9 +2918,9 @@
 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
   Klass* k = SystemDictionary::box_klass(type);
   if (k == NULL)  return NULL;
-  instanceKlassHandle h (THREAD, k);
-  if (!h->is_initialized())  h->initialize(CHECK_0);
-  return h->allocate_instance(THREAD);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  if (!ik->is_initialized())  ik->initialize(CHECK_0);
+  return ik->allocate_instance(THREAD);
 }
 
 
@@ -3894,10 +3891,10 @@
   fieldDescriptor fd;
   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
-  instanceKlassHandle h_klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
-  if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
+  if (!ik->find_local_field(f_name, f_sig, &fd)) {
     tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);
     return false;
   }
@@ -3920,10 +3917,10 @@
   fieldDescriptor fd;
   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
-  instanceKlassHandle h_klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
-  if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
+  if (!ik->find_local_field(f_name, f_sig, &fd)) {
     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
     return false;
   }
@@ -3945,10 +3942,10 @@
   fieldDescriptor fd;
   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
-  instanceKlassHandle h_klass (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
-  if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
+  if (!ik->find_local_field(f_name, f_sig, &fd)) {
     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
     return false;
   }
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -209,29 +209,23 @@
   static void set_protection_domain(oop java_class, oop protection_domain);
   static void set_class_loader(oop java_class, oop class_loader);
   static void set_component_mirror(oop java_class, oop comp_mirror);
-  static void initialize_mirror_fields(KlassHandle k, Handle mirror, Handle protection_domain, TRAPS);
-  static void set_mirror_module_field(KlassHandle K, Handle mirror, Handle module, TRAPS);
+  static void initialize_mirror_fields(Klass* k, Handle mirror, Handle protection_domain, TRAPS);
+  static void set_mirror_module_field(Klass* K, Handle mirror, Handle module, TRAPS);
  public:
   static void compute_offsets();
 
   // Instance creation
-  static void create_mirror(KlassHandle k, Handle class_loader, Handle module,
+  static void create_mirror(Klass* k, Handle class_loader, Handle module,
                             Handle protection_domain, TRAPS);
-  static void fixup_mirror(KlassHandle k, TRAPS);
+  static void fixup_mirror(Klass* k, TRAPS);
   static oop  create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);
 
-  static void fixup_module_field(KlassHandle k, Handle module);
+  static void fixup_module_field(Klass* k, Handle module);
 
   // Conversion
   static Klass* as_Klass(oop java_class);
   static void set_klass(oop java_class, Klass* klass);
   static BasicType as_BasicType(oop java_class, Klass** reference_klass = NULL);
-  static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) {
-    Klass* refk_oop = NULL;
-    BasicType result = as_BasicType(java_class, &refk_oop);
-    (*reference_klass) = KlassHandle(refk_oop);
-    return result;
-  }
   static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
   static void print_signature(oop java_class, outputStream *st);
   static const char* as_external_name(oop java_class);
--- a/hotspot/src/share/vm/classfile/klassFactory.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/klassFactory.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2015, 2017, 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
@@ -37,14 +37,14 @@
 #include "trace/traceMacros.hpp"
 
 // called during initial loading of a shared class
-instanceKlassHandle KlassFactory::check_shared_class_file_load_hook(
-                                          instanceKlassHandle ik,
+InstanceKlass* KlassFactory::check_shared_class_file_load_hook(
+                                          InstanceKlass* ik,
                                           Symbol* class_name,
                                           Handle class_loader,
                                           Handle protection_domain, TRAPS) {
 #if INCLUDE_CDS && INCLUDE_JVMTI
-  assert(ik.not_null(), "sanity");
-  assert(ik()->is_shared(), "expecting a shared class");
+  assert(ik != NULL, "sanity");
+  assert(ik->is_shared(), "expecting a shared class");
 
   if (JvmtiExport::should_post_class_file_load_hook()) {
     assert(THREAD->is_Java_thread(), "must be JavaThread");
@@ -84,8 +84,8 @@
                              NULL,
                              ClassFileParser::BROADCAST, // publicity level
                              CHECK_NULL);
-      instanceKlassHandle new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
-                                                                CHECK_NULL);
+      InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
+                                                           CHECK_NULL);
       if (cached_class_file != NULL) {
         new_ik->set_cached_class_file(cached_class_file);
       }
@@ -128,14 +128,11 @@
     JvmtiThreadState* state = jt->jvmti_thread_state();
 
     if (state != NULL) {
-      KlassHandle* h_class_being_redefined =
-        state->get_class_being_redefined();
+      Klass* k = state->get_class_being_redefined();
 
-      if (h_class_being_redefined != NULL) {
-        instanceKlassHandle ikh_class_being_redefined =
-          instanceKlassHandle(THREAD, (*h_class_being_redefined)());
-
-        *cached_class_file = ikh_class_being_redefined->get_cached_class_file();
+      if (k != NULL) {
+        InstanceKlass* class_being_redefined = InstanceKlass::cast(k);
+        *cached_class_file = class_being_redefined->get_cached_class_file();
       }
     }
 
@@ -163,13 +160,13 @@
 }
 
 
-instanceKlassHandle KlassFactory::create_from_stream(ClassFileStream* stream,
-                                                     Symbol* name,
-                                                     ClassLoaderData* loader_data,
-                                                     Handle protection_domain,
-                                                     const InstanceKlass* host_klass,
-                                                     GrowableArray<Handle>* cp_patches,
-                                                     TRAPS) {
+InstanceKlass* KlassFactory::create_from_stream(ClassFileStream* stream,
+                                                Symbol* name,
+                                                ClassLoaderData* loader_data,
+                                                Handle protection_domain,
+                                                const InstanceKlass* host_klass,
+                                                GrowableArray<Handle>* cp_patches,
+                                                TRAPS) {
   assert(stream != NULL, "invariant");
   assert(loader_data != NULL, "invariant");
   assert(THREAD->is_Java_thread(), "must be a JavaThread");
@@ -200,10 +197,10 @@
                          ClassFileParser::BROADCAST, // publicity level
                          CHECK_NULL);
 
-  instanceKlassHandle result = parser.create_instance_klass(old_stream != stream, CHECK_NULL);
+  InstanceKlass* result = parser.create_instance_klass(old_stream != stream, CHECK_NULL);
   assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant");
 
-  if (result.is_null()) {
+  if (result == NULL) {
     return NULL;
   }
 
--- a/hotspot/src/share/vm/classfile/klassFactory.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/klassFactory.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2015, 2017, 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
@@ -68,16 +68,16 @@
   friend class SystemDictionary;
 
  private:
-  static instanceKlassHandle create_from_stream(ClassFileStream* stream,
-                                                Symbol* name,
-                                                ClassLoaderData* loader_data,
-                                                Handle protection_domain,
-                                                const InstanceKlass* host_klass,
-                                                GrowableArray<Handle>* cp_patches,
-                                                TRAPS);
+  static InstanceKlass* create_from_stream(ClassFileStream* stream,
+                                           Symbol* name,
+                                           ClassLoaderData* loader_data,
+                                           Handle protection_domain,
+                                           const InstanceKlass* host_klass,
+                                           GrowableArray<Handle>* cp_patches,
+                                           TRAPS);
  public:
-  static instanceKlassHandle check_shared_class_file_load_hook(
-                                          instanceKlassHandle ik,
+  static InstanceKlass* check_shared_class_file_load_hook(
+                                          InstanceKlass* ik,
                                           Symbol* class_name,
                                           Handle class_loader,
                                           Handle protection_domain, TRAPS);
--- a/hotspot/src/share/vm/classfile/loaderConstraints.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/loaderConstraints.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -36,15 +36,15 @@
 }
 
 LoaderConstraintTable::LoaderConstraintTable(int nof_buckets)
-  : Hashtable<Klass*, mtClass>(nof_buckets, sizeof(LoaderConstraintEntry)) {};
+  : Hashtable<InstanceKlass*, mtClass>(nof_buckets, sizeof(LoaderConstraintEntry)) {};
 
 
 LoaderConstraintEntry* LoaderConstraintTable::new_entry(
                                  unsigned int hash, Symbol* name,
-                                 Klass* klass, int num_loaders,
+                                 InstanceKlass* klass, int num_loaders,
                                  int max_loaders) {
   LoaderConstraintEntry* entry;
-  entry = (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::new_entry(hash, klass);
+  entry = (LoaderConstraintEntry*)Hashtable<InstanceKlass*, mtClass>::new_entry(hash, klass);
   entry->set_name(name);
   entry->set_num_loaders(num_loaders);
   entry->set_max_loaders(max_loaders);
@@ -54,7 +54,7 @@
 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) {
   // decrement name refcount before freeing
   entry->name()->decrement_refcount();
-  Hashtable<Klass*, mtClass>::free_entry(entry);
+  Hashtable<InstanceKlass*, mtClass>::free_entry(entry);
 }
 
 // Enhanced Class Redefinition support
@@ -106,7 +106,7 @@
     LoaderConstraintEntry** p = bucket_addr(index);
     while(*p) {
       LoaderConstraintEntry* probe = *p;
-      Klass* klass = probe->klass();
+      InstanceKlass* klass = probe->klass();
       // Remove klass that is no longer alive
       if (klass != NULL &&
           klass->class_loader_data()->is_unloading()) {
@@ -186,14 +186,14 @@
 }
 
 bool LoaderConstraintTable::add_entry(Symbol* class_name,
-                                      Klass* klass1, Handle class_loader1,
-                                      Klass* klass2, Handle class_loader2) {
+                                      InstanceKlass* klass1, Handle class_loader1,
+                                      InstanceKlass* klass2, Handle class_loader2) {
   int failure_code = 0; // encode different reasons for failing
 
   if (klass1 != NULL && klass2 != NULL && klass1 != klass2) {
     failure_code = 1;
   } else {
-    Klass* klass = klass1 != NULL ? klass1 : klass2;
+    InstanceKlass* klass = klass1 != NULL ? klass1 : klass2;
 
     LoaderConstraintEntry** pp1 = find_loader_constraint(class_name,
                                                          class_loader1);
@@ -295,11 +295,11 @@
 
 // return true if the constraint was updated, false if the constraint is
 // violated
-bool LoaderConstraintTable::check_or_update(instanceKlassHandle k,
-                                                   Handle loader,
-                                                   Symbol* name) {
+bool LoaderConstraintTable::check_or_update(InstanceKlass* k,
+                                            Handle loader,
+                                            Symbol* name) {
   LoaderConstraintEntry* p = *(find_loader_constraint(name, loader));
-  if (p && p->klass() != NULL && p->klass() != k()) {
+  if (p && p->klass() != NULL && p->klass() != k) {
     if (log_is_enabled(Info, class, loader, constraints)) {
       ResourceMark rm;
       outputStream* out = Log(class, loader, constraints)::info_stream();
@@ -311,7 +311,7 @@
     return false;
   } else {
     if (p && p->klass() == NULL) {
-      p->set_klass(k());
+      p->set_klass(k);
       if (log_is_enabled(Info, class, loader, constraints)) {
         ResourceMark rm;
         outputStream* out = Log(class, loader, constraints)::info_stream();
@@ -325,11 +325,12 @@
   }
 }
 
-Klass* LoaderConstraintTable::find_constrained_klass(Symbol* name,
+InstanceKlass* LoaderConstraintTable::find_constrained_klass(Symbol* name,
                                                        Handle loader) {
   LoaderConstraintEntry *p = *(find_loader_constraint(name, loader));
   if (p != NULL && p->klass() != NULL) {
-    if (p->klass()->is_instance_klass() && !InstanceKlass::cast(p->klass())->is_loaded()) {
+    assert(p->klass()->is_instance_klass(), "sanity");
+    if (p->klass()->is_loaded()) {
       // Only return fully loaded classes.  Classes found through the
       // constraints might still be in the process of loading.
       return NULL;
@@ -357,7 +358,7 @@
 
 void LoaderConstraintTable::extend_loader_constraint(LoaderConstraintEntry* p,
                                                      Handle loader,
-                                                     Klass* klass) {
+                                                     InstanceKlass* klass) {
   ensure_loader_constraint_capacity(p, 1);
   int num = p->num_loaders();
   p->set_loader(num, loader());
@@ -383,7 +384,7 @@
 void LoaderConstraintTable::merge_loader_constraints(
                                                    LoaderConstraintEntry** pp1,
                                                    LoaderConstraintEntry** pp2,
-                                                   Klass* klass) {
+                                                   InstanceKlass* klass) {
   // make sure *pp1 has higher capacity
   if ((*pp1)->max_loaders() < (*pp2)->max_loaders()) {
     LoaderConstraintEntry** tmp = pp2;
@@ -447,13 +448,13 @@
                                 probe != NULL;
                                 probe = probe->next()) {
       if (probe->klass() != NULL) {
-        InstanceKlass* ik = InstanceKlass::cast(probe->klass());
+        InstanceKlass* ik = probe->klass();
         guarantee(ik->name() == probe->name(), "name should match");
         Symbol* name = ik->name();
         ClassLoaderData* loader_data = ik->class_loader_data();
         unsigned int d_hash = dictionary->compute_hash(name, loader_data);
         int d_index = dictionary->hash_to_index(d_hash);
-        Klass* k = dictionary->find_class(d_index, d_hash, name, loader_data);
+        InstanceKlass* k = dictionary->find_class(d_index, d_hash, name, loader_data);
         if (k != NULL) {
           // We found the class in the system dictionary, so we should
           // make sure that the Klass* matches what we already have.
--- a/hotspot/src/share/vm/classfile/loaderConstraints.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/loaderConstraints.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -32,7 +32,7 @@
 class LoaderConstraintEntry;
 class Symbol;
 
-class LoaderConstraintTable : public Hashtable<Klass*, mtClass> {
+class LoaderConstraintTable : public Hashtable<InstanceKlass*, mtClass> {
   friend class VMStructs;
 private:
 
@@ -49,43 +49,41 @@
   LoaderConstraintTable(int nof_buckets);
 
   LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name,
-                                   Klass* klass, int num_loaders,
+                                   InstanceKlass* klass, int num_loaders,
                                    int max_loaders);
   void free_entry(LoaderConstraintEntry *entry);
 
   LoaderConstraintEntry* bucket(int i) {
-    return (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::bucket(i);
+    return (LoaderConstraintEntry*)Hashtable<InstanceKlass*, mtClass>::bucket(i);
   }
 
   LoaderConstraintEntry** bucket_addr(int i) {
-    return (LoaderConstraintEntry**)Hashtable<Klass*, mtClass>::bucket_addr(i);
+    return (LoaderConstraintEntry**)Hashtable<InstanceKlass*, mtClass>::bucket_addr(i);
   }
 
   // Enhanced Class Redefinition support
   void classes_do(KlassClosure* f);
 
   // Check class loader constraints
-  bool add_entry(Symbol* name, Klass* klass1, Handle loader1,
-                                    Klass* klass2, Handle loader2);
+  bool add_entry(Symbol* name, InstanceKlass* klass1, Handle loader1,
+                                    InstanceKlass* klass2, Handle loader2);
 
   // Note:  The main entry point for this module is via SystemDictionary.
   // SystemDictionary::check_signature_loaders(Symbol* signature,
   //                                           Handle loader1, Handle loader2,
   //                                           bool is_method, TRAPS)
 
-  Klass* find_constrained_klass(Symbol* name, Handle loader);
+  InstanceKlass* find_constrained_klass(Symbol* name, Handle loader);
 
   // Class loader constraints
 
   void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree);
   void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader,
-                                Klass* klass);
+                                InstanceKlass* klass);
   void merge_loader_constraints(LoaderConstraintEntry** pp1,
-                                LoaderConstraintEntry** pp2, Klass* klass);
+                                LoaderConstraintEntry** pp2, InstanceKlass* klass);
 
-  bool check_or_update(instanceKlassHandle k, Handle loader,
-                              Symbol* name);
-
+  bool check_or_update(InstanceKlass* k, Handle loader, Symbol* name);
 
   void purge_loader_constraints();
 
@@ -95,7 +93,7 @@
 #endif
 };
 
-class LoaderConstraintEntry : public HashtableEntry<Klass*, mtClass> {
+class LoaderConstraintEntry : public HashtableEntry<InstanceKlass*, mtClass> {
   friend class VMStructs;
 private:
   Symbol*                _name;                   // class name
@@ -108,19 +106,19 @@
 
 public:
 
-  Klass* klass() { return literal(); }
-  Klass** klass_addr() { return literal_addr(); }
-  void set_klass(Klass* k) { set_literal(k); }
+  InstanceKlass* klass() { return literal(); }
+  InstanceKlass** klass_addr() { return literal_addr(); }
+  void set_klass(InstanceKlass* k) { set_literal(k); }
 
   LoaderConstraintEntry* next() {
-    return (LoaderConstraintEntry*)HashtableEntry<Klass*, mtClass>::next();
+    return (LoaderConstraintEntry*)HashtableEntry<InstanceKlass*, mtClass>::next();
   }
 
   LoaderConstraintEntry** next_addr() {
-    return (LoaderConstraintEntry**)HashtableEntry<Klass*, mtClass>::next_addr();
+    return (LoaderConstraintEntry**)HashtableEntry<InstanceKlass*, mtClass>::next_addr();
   }
   void set_next(LoaderConstraintEntry* next) {
-    HashtableEntry<Klass*, mtClass>::set_next(next);
+    HashtableEntry<InstanceKlass*, mtClass>::set_next(next);
   }
 
   Symbol* name() { return _name; }
--- a/hotspot/src/share/vm/classfile/moduleEntry.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -428,7 +428,7 @@
   for (int i = 0; i < list_length; i++) {
     Klass* k = list->at(i);
     assert(k->is_klass(), "List should only hold classes");
-    java_lang_Class::fixup_module_field(KlassHandle(k), module_handle);
+    java_lang_Class::fixup_module_field(k, module_handle);
     k->class_loader_data()->dec_keep_alive();
   }
 
--- a/hotspot/src/share/vm/classfile/placeholders.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/placeholders.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -163,7 +163,7 @@
   bool              _havesupername; // distinguish between null supername, and unknown
   Symbol*           _supername;
   Thread*           _definer;       // owner of define token
-  Klass*            _instanceKlass; // InstanceKlass from successful define
+  InstanceKlass*    _instanceKlass; // InstanceKlass from successful define
   SeenThread*       _superThreadQ;  // doubly-linked queue of Threads loading a superclass for this class
   SeenThread*       _loadInstanceThreadQ;  // loadInstance thread
                                     // can be multiple threads if classloader object lock broken by application
@@ -193,8 +193,8 @@
   Thread*            definer()             const {return _definer; }
   void               set_definer(Thread* definer) { _definer = definer; }
 
-  Klass*             instance_klass()      const {return _instanceKlass; }
-  void               set_instance_klass(Klass* ik) { _instanceKlass = ik; }
+  InstanceKlass*     instance_klass()      const {return _instanceKlass; }
+  void               set_instance_klass(InstanceKlass* ik) { _instanceKlass = ik; }
 
   SeenThread*        superThreadQ()        const { return _superThreadQ; }
   void               set_superThreadQ(SeenThread* SeenThread) { _superThreadQ = SeenThread; }
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -120,10 +120,10 @@
 }
 
 void SystemDictionary::compute_java_system_loader(TRAPS) {
-  KlassHandle system_klass(THREAD, WK_KLASS(ClassLoader_klass));
+  Klass* system_klass = WK_KLASS(ClassLoader_klass);
   JavaValue result(T_OBJECT);
   JavaCalls::call_static(&result,
-                         KlassHandle(THREAD, WK_KLASS(ClassLoader_klass)),
+                         WK_KLASS(ClassLoader_klass),
                          vmSymbols::getSystemClassLoader_name(),
                          vmSymbols::void_classloader_signature(),
                          CHECK);
@@ -184,16 +184,15 @@
 Klass* SystemDictionary::resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS) {
   Klass* klass = resolve_or_null(class_name, class_loader, protection_domain, THREAD);
   if (HAS_PENDING_EXCEPTION || klass == NULL) {
-    KlassHandle k_h(THREAD, klass);
     // can return a null klass
-    klass = handle_resolution_exception(class_name, throw_error, k_h, THREAD);
+    klass = handle_resolution_exception(class_name, throw_error, klass, THREAD);
   }
   return klass;
 }
 
 Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name,
                                                      bool throw_error,
-                                                     KlassHandle klass_h, TRAPS) {
+                                                     Klass* klass, TRAPS) {
   if (HAS_PENDING_EXCEPTION) {
     // If we have a pending exception we forward it to the caller, unless throw_error is true,
     // in which case we have to check whether the pending exception is a ClassNotFoundException,
@@ -201,7 +200,7 @@
     // And chain the original ClassNotFoundException
     if (throw_error && PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass())) {
       ResourceMark rm(THREAD);
-      assert(klass_h() == NULL, "Should not have result with exception pending");
+      assert(klass == NULL, "Should not have result with exception pending");
       Handle e(THREAD, PENDING_EXCEPTION);
       CLEAR_PENDING_EXCEPTION;
       THROW_MSG_CAUSE_NULL(vmSymbols::java_lang_NoClassDefFoundError(), class_name->as_C_string(), e);
@@ -210,7 +209,7 @@
     }
   }
   // Class not found, throw appropriate error or exception depending on value of throw_error
-  if (klass_h() == NULL) {
+  if (klass == NULL) {
     ResourceMark rm(THREAD);
     if (throw_error) {
       THROW_MSG_NULL(vmSymbols::java_lang_NoClassDefFoundError(), class_name->as_C_string());
@@ -218,7 +217,7 @@
       THROW_MSG_NULL(vmSymbols::java_lang_ClassNotFoundException(), class_name->as_C_string());
     }
   }
-  return (Klass*)klass_h();
+  return klass;
 }
 
 
@@ -256,9 +255,9 @@
 // Forwards to resolve_instance_class_or_null
 
 Klass* SystemDictionary::resolve_array_class_or_null(Symbol* class_name,
-                                                       Handle class_loader,
-                                                       Handle protection_domain,
-                                                       TRAPS) {
+                                                     Handle class_loader,
+                                                     Handle protection_domain,
+                                                     TRAPS) {
   assert(FieldType::is_array(class_name), "must be array");
   Klass* k = NULL;
   FieldArrayInfo fd;
@@ -398,11 +397,9 @@
   assert(class_name != NULL, "null super class for resolving");
   // Resolve the super class or interface, check results on return
   Klass* superk = SystemDictionary::resolve_or_null(class_name,
-                                                 class_loader,
-                                                 protection_domain,
-                                                 THREAD);
-
-  KlassHandle superk_h(THREAD, superk);
+                                                    class_loader,
+                                                    protection_domain,
+                                                    THREAD);
 
   // Clean up of placeholders moved so that each classloadAction registrar self-cleans up
   // It is no longer necessary to keep the placeholder table alive until update_dictionary
@@ -415,15 +412,15 @@
     placeholders()->find_and_remove(p_index, p_hash, child_name, loader_data, PlaceholderTable::LOAD_SUPER, THREAD);
     SystemDictionary_lock->notify_all();
   }
-  if (HAS_PENDING_EXCEPTION || superk_h() == NULL) {
+  if (HAS_PENDING_EXCEPTION || superk == NULL) {
     // can null superk
-    superk_h = KlassHandle(THREAD, handle_resolution_exception(class_name, true, superk_h, THREAD));
+    superk = handle_resolution_exception(class_name, true, superk, THREAD);
   }
 
-  return superk_h();
+  return superk;
 }
 
-void SystemDictionary::validate_protection_domain(instanceKlassHandle klass,
+void SystemDictionary::validate_protection_domain(InstanceKlass* klass,
                                                   Handle class_loader,
                                                   Handle protection_domain,
                                                   TRAPS) {
@@ -438,11 +435,11 @@
     log->print_cr("Checking package access");
     log->print("class loader: "); class_loader()->print_value_on(log);
     log->print(" protection domain: "); protection_domain()->print_value_on(log);
-    log->print(" loading: "); klass()->print_value_on(log);
+    log->print(" loading: "); klass->print_value_on(log);
     log->cr();
   }
 
-  KlassHandle system_loader(THREAD, SystemDictionary::ClassLoader_klass());
+  InstanceKlass* system_loader = SystemDictionary::ClassLoader_klass();
   JavaCalls::call_special(&result,
                          class_loader,
                          system_loader,
@@ -540,11 +537,10 @@
 // Returns non-null Klass* if other thread has completed load
 // and we are done,
 // If return null Klass* and no pending exception, the caller must load the class
-instanceKlassHandle SystemDictionary::handle_parallel_super_load(
+InstanceKlass* SystemDictionary::handle_parallel_super_load(
     Symbol* name, Symbol* superclassname, Handle class_loader,
     Handle protection_domain, Handle lockObject, TRAPS) {
 
-  instanceKlassHandle nh = instanceKlassHandle(); // null Handle
   ClassLoaderData* loader_data = class_loader_data(class_loader);
   unsigned int d_hash = dictionary()->compute_hash(name, loader_data);
   int d_index = dictionary()->hash_to_index(d_hash);
@@ -564,20 +560,14 @@
                                                           class_loader,
                                                           protection_domain,
                                                           true,
-                                                          CHECK_(nh));
+                                                          CHECK_NULL);
 
   // parallelCapable class loaders do NOT wait for parallel superclass loads to complete
   // Serial class loaders and bootstrap classloader do wait for superclass loads
  if (!class_loader.is_null() && is_parallelCapable(class_loader)) {
     MutexLocker mu(SystemDictionary_lock, THREAD);
     // Check if classloading completed while we were loading superclass or waiting
-    Klass* check = find_class(d_index, d_hash, name, loader_data);
-    if (check != NULL) {
-      // Klass is already loaded, so just return it
-      return(instanceKlassHandle(THREAD, check));
-    } else {
-      return nh;
-    }
+    return find_class(d_index, d_hash, name, loader_data);
   }
 
   // must loop to both handle other placeholder updates
@@ -587,10 +577,10 @@
   while (super_load_in_progress) {
     MutexLocker mu(SystemDictionary_lock, THREAD);
     // Check if classloading completed while we were loading superclass or waiting
-    Klass* check = find_class(d_index, d_hash, name, loader_data);
+    InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
     if (check != NULL) {
       // Klass is already loaded, so just return it
-      return(instanceKlassHandle(THREAD, check));
+      return check;
     } else {
       placeholder = placeholders()->get_entry(p_index, p_hash, name, loader_data);
       if (placeholder && placeholder->super_load_in_progress() ){
@@ -619,17 +609,17 @@
       }
     }
   }
-  return (nh);
+  return NULL;
 }
 
 static void post_class_load_event(const Ticks& start_time,
-                                  instanceKlassHandle k,
+                                  InstanceKlass* k,
                                   const ClassLoaderData* init_cld) {
 #if INCLUDE_TRACE
   EventClassLoad event(UNTIMED);
   if (event.should_commit()) {
     event.set_starttime(start_time);
-    event.set_loadedClass(k());
+    event.set_loadedClass(k);
     event.set_definingClassLoader(k->class_loader_data());
     event.set_initiatingClassLoader(init_cld);
     event.commit();
@@ -637,12 +627,12 @@
 #endif // INCLUDE_TRACE
 }
 
-static void class_define_event(instanceKlassHandle k,
+static void class_define_event(InstanceKlass* k,
                                const ClassLoaderData* def_cld) {
 #if INCLUDE_TRACE
   EventClassDefine event;
   if (event.should_commit()) {
-    event.set_definedClass(k());
+    event.set_definedClass(k);
     event.set_definingClassLoader(def_cld);
     event.commit();
   }
@@ -708,17 +698,17 @@
   bool class_has_been_loaded   = false;
   bool super_load_in_progress  = false;
   bool havesupername = false;
-  instanceKlassHandle k;
+  InstanceKlass* k = NULL;
   PlaceholderEntry* placeholder;
   Symbol* superclassname = NULL;
 
   {
     MutexLocker mu(SystemDictionary_lock, THREAD);
-    Klass* check = find_class(d_index, d_hash, name, loader_data);
+    InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
     if (check != NULL) {
       // Klass is already loaded, so just return it
       class_has_been_loaded = true;
-      k = instanceKlassHandle(THREAD, check);
+      k = check;
     } else {
       placeholder = placeholders()->get_entry(p_index, p_hash, name, loader_data);
       if (placeholder && placeholder->super_load_in_progress()) {
@@ -733,12 +723,15 @@
 
   // If the class is in the placeholder table, class loading is in progress
   if (super_load_in_progress && havesupername==true) {
-    k = SystemDictionary::handle_parallel_super_load(name, superclassname,
-        class_loader, protection_domain, lockObject, THREAD);
+    k = handle_parallel_super_load(name,
+                                   superclassname,
+                                   class_loader,
+                                   protection_domain,
+                                   lockObject, THREAD);
     if (HAS_PENDING_EXCEPTION) {
       return NULL;
     }
-    if (!k.is_null()) {
+    if (k != NULL) {
       class_has_been_loaded = true;
     }
   }
@@ -795,10 +788,10 @@
                 double_lock_wait(lockObject, THREAD);
               }
               // Check if classloading completed while we were waiting
-              Klass* check = find_class(d_index, d_hash, name, loader_data);
+              InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
               if (check != NULL) {
                 // Klass is already loaded, so just return it
-                k = instanceKlassHandle(THREAD, check);
+                k = check;
                 class_has_been_loaded = true;
               }
               // check if other thread failed to load and cleaned up
@@ -820,10 +813,10 @@
         // i.e. now that we hold the LOAD_INSTANCE token on loading this class/CL
         // one final check if the load has already completed
         // class loaders holding the ObjectLock shouldn't find the class here
-        Klass* check = find_class(d_index, d_hash, name, loader_data);
+        InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
         if (check != NULL) {
         // Klass is already loaded, so return it after checking/adding protection domain
-          k = instanceKlassHandle(THREAD, check);
+          k = check;
           class_has_been_loaded = true;
         }
       }
@@ -850,13 +843,13 @@
       // with the new cleaner mechanism, even with AllowParallelDefineClass
       // Bootstrap goes through here to allow for an extra guarantee check
       if (UnsyncloadClass || (class_loader.is_null())) {
-        if (k.is_null() && HAS_PENDING_EXCEPTION
+        if (k == NULL && HAS_PENDING_EXCEPTION
           && PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
           MutexLocker mu(SystemDictionary_lock, THREAD);
-          Klass* check = find_class(d_index, d_hash, name, loader_data);
+          InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
           if (check != NULL) {
             // Klass is already loaded, so just use it
-            k = instanceKlassHandle(THREAD, check);
+            k = check;
             CLEAR_PENDING_EXCEPTION;
             guarantee((!class_loader.is_null()), "dup definition for bootstrap loader?");
           }
@@ -865,7 +858,7 @@
 
       // If everything was OK (no exceptions, no null return value), and
       // class_loader is NOT the defining loader, do a little more bookkeeping.
-      if (!HAS_PENDING_EXCEPTION && !k.is_null() &&
+      if (!HAS_PENDING_EXCEPTION && k != NULL &&
         k->class_loader() != class_loader()) {
 
         check_constraints(d_index, d_hash, k, class_loader, false, THREAD);
@@ -883,7 +876,7 @@
           if (JvmtiExport::should_post_class_load()) {
             Thread *thread = THREAD;
             assert(thread->is_Java_thread(), "thread->is_Java_thread()");
-            JvmtiExport::post_class_load((JavaThread *) thread, k());
+            JvmtiExport::post_class_load((JavaThread *) thread, k);
           }
         }
       }
@@ -899,7 +892,7 @@
     }
   }
 
-  if (HAS_PENDING_EXCEPTION || k.is_null()) {
+  if (HAS_PENDING_EXCEPTION || k == NULL) {
     return NULL;
   }
 
@@ -910,12 +903,12 @@
     ClassLoaderData* loader_data = k->class_loader_data();
     MutexLocker mu(SystemDictionary_lock, THREAD);
     Klass* kk = find_class(name, loader_data);
-    assert(kk == k(), "should be present in dictionary");
+    assert(kk == k, "should be present in dictionary");
   }
 #endif
 
   // return if the protection domain in NULL
-  if (protection_domain() == NULL) return k();
+  if (protection_domain() == NULL) return k;
 
   // Check the protection domain has the right access
   {
@@ -930,14 +923,14 @@
     if (dictionary()->is_valid_protection_domain(d_index, d_hash, name,
                                                  loader_data,
                                                  protection_domain)) {
-      return k();
+      return k;
     }
   }
 
   // Verify protection domain. If it fails an exception is thrown
   validate_protection_domain(k, class_loader, protection_domain, CHECK_NULL);
 
-  return k();
+  return k;
 }
 
 
@@ -1019,13 +1012,13 @@
 // does not publish the classes via the SystemDictionary.
 // Handles unsafe_DefineAnonymousClass and redefineclasses
 // RedefinedClasses do not add to the class hierarchy
-Klass* SystemDictionary::parse_stream(Symbol* class_name,
-                                      Handle class_loader,
-                                      Handle protection_domain,
-                                      ClassFileStream* st,
-                                      const InstanceKlass* host_klass,
-                                      GrowableArray<Handle>* cp_patches,
-                                      TRAPS) {
+InstanceKlass* SystemDictionary::parse_stream(Symbol* class_name,
+                                              Handle class_loader,
+                                              Handle protection_domain,
+                                              ClassFileStream* st,
+                                              const InstanceKlass* host_klass,
+                                              GrowableArray<Handle>* cp_patches,
+                                              TRAPS) {
 
   Ticks class_load_start_time = Ticks::now();
 
@@ -1049,15 +1042,15 @@
   // already be present in the SystemDictionary, otherwise we would not
   // throw potential ClassFormatErrors.
 
-  instanceKlassHandle k = KlassFactory::create_from_stream(st,
-                                                           class_name,
-                                                           loader_data,
-                                                           protection_domain,
-                                                           host_klass,
-                                                           cp_patches,
-                                                           CHECK_NULL);
-
-  if (host_klass != NULL && k.not_null()) {
+  InstanceKlass* k = KlassFactory::create_from_stream(st,
+                                                      class_name,
+                                                      loader_data,
+                                                      protection_domain,
+                                                      host_klass,
+                                                      cp_patches,
+                                                      CHECK_NULL);
+
+  if (host_klass != NULL && k != NULL) {
     // If it's anonymous, initialize it now, since nobody else will.
 
     {
@@ -1083,7 +1076,7 @@
     // notify jvmti
     if (JvmtiExport::should_post_class_load()) {
         assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
-        JvmtiExport::post_class_load((JavaThread *) THREAD, k());
+        JvmtiExport::post_class_load((JavaThread *) THREAD, k);
     }
 
     post_class_load_event(class_load_start_time, k, loader_data);
@@ -1091,7 +1084,7 @@
   assert(host_klass != NULL || NULL == cp_patches,
          "cp_patches only found with host_klass");
 
-  return k();
+  return k;
 }
 
 // Add a klass to the system from a stream (called by jni_DefineClass and
@@ -1099,11 +1092,11 @@
 // Note: class_name can be NULL. In that case we do not know the name of
 // the class until we have parsed the stream.
 
-Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
-                                             Handle class_loader,
-                                             Handle protection_domain,
-                                             ClassFileStream* st,
-                                             TRAPS) {
+InstanceKlass* SystemDictionary::resolve_from_stream(Symbol* class_name,
+                                                     Handle class_loader,
+                                                     Handle protection_domain,
+                                                     ClassFileStream* st,
+                                                     TRAPS) {
 
   HandleMark hm(THREAD);
 
@@ -1127,9 +1120,7 @@
   // Note that we do this even though this klass might
   // already be present in the SystemDictionary, otherwise we would not
   // throw potential ClassFormatErrors.
-  //
-
- instanceKlassHandle k;
+ InstanceKlass* k = NULL;
 
 #if INCLUDE_CDS
   k = SystemDictionaryShared::lookup_from_stream(class_name,
@@ -1139,7 +1130,7 @@
                                                  CHECK_NULL);
 #endif
 
-  if (k.is_null()) {
+  if (k == NULL) {
     if (st->buffer() == NULL) {
       return NULL;
     }
@@ -1152,7 +1143,7 @@
                                          CHECK_NULL);
   }
 
-  assert(k.not_null(), "no klass created");
+  assert(k != NULL, "no klass created");
   Symbol* h_name = k->name();
   assert(class_name == NULL || class_name == h_name, "name mismatch");
 
@@ -1160,11 +1151,11 @@
   // If a class loader supports parallel classloading handle parallel define requests
   // find_or_define_instance_class may return a different InstanceKlass
   if (is_parallelCapable(class_loader)) {
-    instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, THREAD);
-    if (!HAS_PENDING_EXCEPTION && defined_k() != k()) {
+    InstanceKlass* defined_k = find_or_define_instance_class(h_name, class_loader, k, THREAD);
+    if (!HAS_PENDING_EXCEPTION && defined_k != k) {
       // If a parallel capable class loader already defined this class, register 'k' for cleanup.
-      assert(defined_k.not_null(), "Should have a klass if there's no exception");
-      loader_data->add_to_deallocate_list(k());
+      assert(defined_k != NULL, "Should have a klass if there's no exception");
+      loader_data->add_to_deallocate_list(k);
       k = defined_k;
     }
   } else {
@@ -1173,8 +1164,8 @@
 
   // If defining the class throws an exception register 'k' for cleanup.
   if (HAS_PENDING_EXCEPTION) {
-    assert(k.not_null(), "Must have an instance klass here!");
-    loader_data->add_to_deallocate_list(k());
+    assert(k != NULL, "Must have an instance klass here!");
+    loader_data->add_to_deallocate_list(k);
     return NULL;
   }
 
@@ -1183,10 +1174,10 @@
     MutexLocker mu(SystemDictionary_lock, THREAD);
 
     Klass* check = find_class(h_name, k->class_loader_data());
-    assert(check == k(), "should be present in the dictionary");
+    assert(check == k, "should be present in the dictionary");
   } );
 
-  return k();
+  return k;
 }
 
 #if INCLUDE_CDS
@@ -1201,7 +1192,7 @@
 // If there is a shared dictionary, then find the entry for the
 // given shared system class, if any.
 
-Klass* SystemDictionary::find_shared_class(Symbol* class_name) {
+InstanceKlass* SystemDictionary::find_shared_class(Symbol* class_name) {
   if (shared_dictionary() != NULL) {
     unsigned int d_hash = shared_dictionary()->compute_hash(class_name, NULL);
     int d_index = shared_dictionary()->hash_to_index(d_hash);
@@ -1219,16 +1210,16 @@
 // subclasses (yet).  [Classes in the shared space are not part of the
 // object hierarchy until loaded.]
 
-instanceKlassHandle SystemDictionary::load_shared_class(
+InstanceKlass* SystemDictionary::load_shared_class(
                  Symbol* class_name, Handle class_loader, TRAPS) {
-  instanceKlassHandle ik (THREAD, find_shared_class(class_name));
+  InstanceKlass* ik = find_shared_class(class_name);
   // Make sure we only return the boot class for the NULL classloader.
-  if (ik.not_null() &&
+  if (ik != NULL &&
       ik->is_shared_boot_class() && class_loader.is_null()) {
     Handle protection_domain;
     return load_shared_class(ik, class_loader, protection_domain, THREAD);
   }
-  return instanceKlassHandle();
+  return NULL;
 }
 
 // Check if a shared class can be loaded by the specific classloader:
@@ -1238,7 +1229,7 @@
 //   - Class from -Xbootclasspath/a. The class has no defined PackageEntry, or must
 //     be defined in an unnamed module.
 bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
-                                               instanceKlassHandle ik,
+                                               InstanceKlass* ik,
                                                Handle class_loader, TRAPS) {
   assert(!ModuleEntryTable::javabase_moduleEntry()->is_patched(),
          "Cannot use sharing if java.base is patched");
@@ -1315,18 +1306,17 @@
   }
 }
 
-instanceKlassHandle SystemDictionary::load_shared_class(instanceKlassHandle ik,
-                                                        Handle class_loader,
-                                                        Handle protection_domain, TRAPS) {
-  instanceKlassHandle nh = instanceKlassHandle(); // null Handle
-
-  if (ik.not_null()) {
+InstanceKlass* SystemDictionary::load_shared_class(InstanceKlass* ik,
+                                                   Handle class_loader,
+                                                   Handle protection_domain, TRAPS) {
+
+  if (ik != NULL) {
     Symbol* class_name = ik->name();
 
     bool visible = is_shared_class_visible(
-                            class_name, ik, class_loader, CHECK_(nh));
+                            class_name, ik, class_loader, CHECK_NULL);
     if (!visible) {
-      return nh;
+      return NULL;
     }
 
     // Resolve the superclass and interfaces. They must be the same
@@ -1339,11 +1329,11 @@
     if (ik->super() != NULL) {
       Symbol*  cn = ik->super()->name();
       Klass *s = resolve_super_or_fail(class_name, cn,
-                                       class_loader, protection_domain, true, CHECK_(nh));
+                                       class_loader, protection_domain, true, CHECK_NULL);
       if (s != ik->super()) {
         // The dynamically resolved super class is not the same as the one we used during dump time,
         // so we cannot use ik.
-        return nh;
+        return NULL;
       } else {
         assert(s->is_shared(), "must be");
       }
@@ -1354,19 +1344,19 @@
     for (int index = 0; index < num_interfaces; index++) {
       Klass* k = interfaces->at(index);
       Symbol*  name  = k->name();
-      Klass* i = resolve_super_or_fail(class_name, name, class_loader, protection_domain, false, CHECK_(nh));
+      Klass* i = resolve_super_or_fail(class_name, name, class_loader, protection_domain, false, CHECK_NULL);
       if (k != i) {
         // The dynamically resolved interface class is not the same as the one we used during dump time,
         // so we cannot use ik.
-        return nh;
+        return NULL;
       } else {
         assert(i->is_shared(), "must be");
       }
     }
 
-    instanceKlassHandle new_ik = KlassFactory::check_shared_class_file_load_hook(
-        ik, class_name, class_loader, protection_domain, CHECK_(nh));
-    if (new_ik.not_null()) {
+    InstanceKlass* new_ik = KlassFactory::check_shared_class_file_load_hook(
+        ik, class_name, class_loader, protection_domain, CHECK_NULL);
+    if (new_ik != NULL) {
       // The class is changed by CFLH. Return the new class. The shared class is
       // not used.
       return new_ik;
@@ -1391,16 +1381,16 @@
       ObjectLocker ol(lockObject, THREAD, true);
       // prohibited package check assumes all classes loaded from archive call
       // restore_unshareable_info which calls ik->set_package()
-      ik->restore_unshareable_info(loader_data, protection_domain, CHECK_(nh));
+      ik->restore_unshareable_info(loader_data, protection_domain, CHECK_NULL);
     }
 
     if (log_is_enabled(Info, class, load)) {
-      ik()->print_loading_log(LogLevel::Info, loader_data, NULL, NULL);
+      ik->print_loading_log(LogLevel::Info, loader_data, NULL, NULL);
     }
     // No 'else' here as logging levels are not mutually exclusive
 
     if (log_is_enabled(Debug, class, load)) {
-      ik()->print_loading_log(LogLevel::Debug, loader_data, NULL, NULL);
+      ik->print_loading_log(LogLevel::Debug, loader_data, NULL, NULL);
     }
 
     // For boot loader, ensure that GetSystemPackage knows that a class in this
@@ -1421,12 +1411,12 @@
     }
 
     // notify a class loaded from shared object
-    ClassLoadingService::notify_class_loaded(ik(), true /* shared class */);
+    ClassLoadingService::notify_class_loaded(ik, true /* shared class */);
   }
 
   ik->set_has_passed_fingerprint_check(false);
   if (UseAOT && ik->supers_have_passed_fingerprint_checks()) {
-    uint64_t aot_fp = AOTLoader::get_saved_fingerprint(ik());
+    uint64_t aot_fp = AOTLoader::get_saved_fingerprint(ik);
     uint64_t cds_fp = ik->get_stored_fingerprint();
     if (aot_fp != 0 && aot_fp == cds_fp) {
       // This class matches with a class saved in an AOT library
@@ -1440,8 +1430,7 @@
 }
 #endif // INCLUDE_CDS
 
-instanceKlassHandle SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS) {
-  instanceKlassHandle nh = instanceKlassHandle(); // null Handle
+InstanceKlass* SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS) {
 
   if (class_loader.is_null()) {
     ResourceMark rm;
@@ -1473,14 +1462,14 @@
           // and its package will be checked later by
           // ModuleEntryTable::verify_javabase_packages.
           if (ModuleEntryTable::javabase_defined()) {
-            return nh;
+            return NULL;
           }
         } else {
           // Check that the class' package is defined within java.base.
           ModuleEntry* mod_entry = pkg_entry->module();
           Symbol* mod_entry_name = mod_entry->name();
           if (mod_entry_name->fast_compare(vmSymbols::java_base()) != 0) {
-            return nh;
+            return NULL;
           }
         }
       }
@@ -1506,7 +1495,7 @@
 
     // Search the shared system dictionary for classes preloaded into the
     // shared spaces.
-    instanceKlassHandle k;
+    InstanceKlass* k = NULL;
     {
 #if INCLUDE_CDS
       PerfTraceTime vmtimer(ClassLoader::perf_shared_classload_time());
@@ -1514,24 +1503,24 @@
 #endif
     }
 
-    if (k.is_null()) {
+    if (k == NULL) {
       // Use VM class loader
       PerfTraceTime vmtimer(ClassLoader::perf_sys_classload_time());
-      k = ClassLoader::load_class(class_name, search_only_bootloader_append, CHECK_(nh));
+      k = ClassLoader::load_class(class_name, search_only_bootloader_append, CHECK_NULL);
     }
 
     // find_or_define_instance_class may return a different InstanceKlass
-    if (!k.is_null()) {
-      instanceKlassHandle defined_k =
+    if (k != NULL) {
+      InstanceKlass* defined_k =
         find_or_define_instance_class(class_name, class_loader, k, THREAD);
-      if (!HAS_PENDING_EXCEPTION && defined_k() != k()) {
+      if (!HAS_PENDING_EXCEPTION && defined_k != k) {
         // If a parallel capable class loader already defined this class, register 'k' for cleanup.
-        assert(defined_k.not_null(), "Should have a klass if there's no exception");
-        loader_data->add_to_deallocate_list(k());
+        assert(defined_k != NULL, "Should have a klass if there's no exception");
+        loader_data->add_to_deallocate_list(k);
         k = defined_k;
       } else if (HAS_PENDING_EXCEPTION) {
-        loader_data->add_to_deallocate_list(k());
-        return nh;
+        loader_data->add_to_deallocate_list(k);
+        return NULL;
       }
     }
     return k;
@@ -1549,13 +1538,13 @@
                                jt->get_thread_stat()->perf_timers_addr(),
                                PerfClassTraceTime::CLASS_LOAD);
 
-    Handle s = java_lang_String::create_from_symbol(class_name, CHECK_(nh));
+    Handle s = java_lang_String::create_from_symbol(class_name, CHECK_NULL);
     // Translate to external class name format, i.e., convert '/' chars to '.'
-    Handle string = java_lang_String::externalize_classname(s, CHECK_(nh));
+    Handle string = java_lang_String::externalize_classname(s, CHECK_NULL);
 
     JavaValue result(T_OBJECT);
 
-    KlassHandle spec_klass (THREAD, SystemDictionary::ClassLoader_klass());
+    InstanceKlass* spec_klass = SystemDictionary::ClassLoader_klass();
 
     // Call public unsynchronized loadClass(String) directly for all class loaders
     // for parallelCapable class loaders. JDK >=7, loadClass(String, boolean) will
@@ -1581,7 +1570,7 @@
                               vmSymbols::loadClassInternal_name(),
                               vmSymbols::string_class_signature(),
                               string,
-                              CHECK_(nh));
+                              CHECK_NULL);
     } else {
       JavaCalls::call_virtual(&result,
                               class_loader,
@@ -1589,7 +1578,7 @@
                               vmSymbols::loadClass_name(),
                               vmSymbols::string_class_signature(),
                               string,
-                              CHECK_(nh));
+                              CHECK_NULL);
     }
 
     assert(result.get_type() == T_OBJECT, "just checking");
@@ -1598,8 +1587,7 @@
     // Primitive classes return null since forName() can not be
     // used to obtain any of the Class objects representing primitives or void
     if ((obj != NULL) && !(java_lang_Class::is_primitive(obj))) {
-      instanceKlassHandle k =
-                instanceKlassHandle(THREAD, java_lang_Class::as_Klass(obj));
+      InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(obj));
       // For user defined Java class loaders, check that the name returned is
       // the same as that requested.  This check is done for the bootstrap
       // loader when parsing the class file.
@@ -1608,11 +1596,11 @@
       }
     }
     // Class is not found or has the wrong name, return NULL
-    return nh;
+    return NULL;
   }
 }
 
-void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) {
+void SystemDictionary::define_instance_class(InstanceKlass* k, TRAPS) {
 
   HandleMark hm(THREAD);
   ClassLoaderData* loader_data = k->class_loader_data();
@@ -1677,7 +1665,7 @@
   // notify jvmti
   if (JvmtiExport::should_post_class_load()) {
       assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
-      JvmtiExport::post_class_load((JavaThread *) THREAD, k());
+      JvmtiExport::post_class_load((JavaThread *) THREAD, k);
 
   }
   class_define_event(k, loader_data);
@@ -1703,16 +1691,16 @@
 // placeholders()->find_and_add(PlaceholderTable::DEFINE_CLASS),
 // you need to find_and_remove it before returning.
 // So be careful to not exit with a CHECK_ macro betweeen these calls.
-instanceKlassHandle SystemDictionary::find_or_define_instance_class(Symbol* class_name, Handle class_loader, instanceKlassHandle k, TRAPS) {
-
-  instanceKlassHandle nh = instanceKlassHandle(); // null Handle
+InstanceKlass* SystemDictionary::find_or_define_instance_class(Symbol* class_name, Handle class_loader,
+                                                               InstanceKlass* k, TRAPS) {
+
   Symbol*  name_h = k->name(); // passed in class_name may be null
   ClassLoaderData* loader_data = class_loader_data(class_loader);
 
   unsigned int d_hash = dictionary()->compute_hash(name_h, loader_data);
   int d_index = dictionary()->hash_to_index(d_hash);
 
-// Hold SD lock around find_class and placeholder creation for DEFINE_CLASS
+  // Hold SD lock around find_class and placeholder creation for DEFINE_CLASS
   unsigned int p_hash = placeholders()->compute_hash(name_h, loader_data);
   int p_index = placeholders()->hash_to_index(p_hash);
   PlaceholderEntry* probe;
@@ -1721,9 +1709,9 @@
     MutexLocker mu(SystemDictionary_lock, THREAD);
     // First check if class already defined
     if (UnsyncloadClass || (is_parallelDefine(class_loader))) {
-      Klass* check = find_class(d_index, d_hash, name_h, loader_data);
+      InstanceKlass* check = find_class(d_index, d_hash, name_h, loader_data);
       if (check != NULL) {
-        return(instanceKlassHandle(THREAD, check));
+        return check;
       }
     }
 
@@ -1743,10 +1731,10 @@
         placeholders()->find_and_remove(p_index, p_hash, name_h, loader_data, PlaceholderTable::DEFINE_CLASS, THREAD);
         SystemDictionary_lock->notify_all();
 #ifdef ASSERT
-        Klass* check = find_class(d_index, d_hash, name_h, loader_data);
+        InstanceKlass* check = find_class(d_index, d_hash, name_h, loader_data);
         assert(check != NULL, "definer missed recording success");
 #endif
-        return(instanceKlassHandle(THREAD, probe->instance_klass()));
+        return probe->instance_klass();
     } else {
       // This thread will define the class (even if earlier thread tried and had an error)
       probe->set_definer(THREAD);
@@ -1767,7 +1755,7 @@
         linkage_exception = Handle(THREAD,PENDING_EXCEPTION);
         CLEAR_PENDING_EXCEPTION;
       } else {
-        probe->set_instance_klass(k());
+        probe->set_instance_klass(k);
       }
       probe->set_definer(NULL);
       placeholders()->find_and_remove(p_index, p_hash, name_h, loader_data, PlaceholderTable::DEFINE_CLASS, THREAD);
@@ -1777,7 +1765,7 @@
 
   // Can't throw exception while holding lock due to rank ordering
   if (linkage_exception() != NULL) {
-    THROW_OOP_(linkage_exception(), nh); // throws exception and returns
+    THROW_OOP_(linkage_exception(), NULL); // throws exception and returns
   }
 
   return k;
@@ -1817,15 +1805,14 @@
 // ----------------------------------------------------------------------------
 // Lookup
 
-Klass* SystemDictionary::find_class(int index, unsigned int hash,
-                                      Symbol* class_name,
-                                      ClassLoaderData* loader_data) {
+InstanceKlass* SystemDictionary::find_class(int index, unsigned int hash,
+                                            Symbol* class_name,
+                                            ClassLoaderData* loader_data) {
   assert_locked_or_safepoint(SystemDictionary_lock);
   assert (index == dictionary()->index_for(class_name, loader_data),
           "incorrect index?");
 
-  Klass* k = dictionary()->find_class(index, hash, class_name, loader_data);
-  return k;
+  return dictionary()->find_class(index, hash, class_name, loader_data);
 }
 
 
@@ -1840,7 +1827,7 @@
 
 
 // Used for assertions and verification only
-Klass* SystemDictionary::find_class(Symbol* class_name, ClassLoaderData* loader_data) {
+InstanceKlass* SystemDictionary::find_class(Symbol* class_name, ClassLoaderData* loader_data) {
   #ifndef ASSERT
   guarantee(VerifyBeforeGC      ||
             VerifyDuringGC      ||
@@ -1868,8 +1855,8 @@
 // is held, to ensure that the compiler is not using the class hierachy, and that deoptimization will kick in
 // before a new class is used.
 
-void SystemDictionary::add_to_hierarchy(instanceKlassHandle k, TRAPS) {
-  assert(k.not_null(), "just checking");
+void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
+  assert(k != NULL, "just checking");
   assert_locked_or_safepoint(Compile_lock);
 
   // Link into hierachy. Make sure the vtables are initialized before linking into
@@ -2150,8 +2137,7 @@
   if (UseSharedSpaces) {
     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Object_klass), scan, CHECK);
     // Initialize the constant pool for the Object_class
-    InstanceKlass* ik = InstanceKlass::cast(Object_klass());
-    ik->constants()->restore_unshareable_info(CHECK);
+    Object_klass()->constants()->restore_unshareable_info(CHECK);
     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
   } else {
     initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
@@ -2231,7 +2217,7 @@
 // if initiating loader, then ok if InstanceKlass matches existing entry
 
 void SystemDictionary::check_constraints(int d_index, unsigned int d_hash,
-                                         instanceKlassHandle k,
+                                         InstanceKlass* k,
                                          Handle class_loader, bool defining,
                                          TRAPS) {
   const char *linkage_error1 = NULL;
@@ -2242,8 +2228,8 @@
 
     MutexLocker mu(SystemDictionary_lock, THREAD);
 
-    Klass* check = find_class(d_index, d_hash, name, loader_data);
-    if (check != (Klass*)NULL) {
+    InstanceKlass* check = find_class(d_index, d_hash, name, loader_data);
+    if (check != NULL) {
       // if different InstanceKlass - duplicate class definition,
       // else - ok, class loaded by a different thread in parallel,
       // we should only have found it if it was done loading and ok to use
@@ -2251,9 +2237,9 @@
       // also holds array classes
 
       assert(check->is_instance_klass(), "noninstance in systemdictionary");
-      if ((defining == true) || (k() != check)) {
-        linkage_error1 = "loader (instance of  ";
-        linkage_error2 = "): attempted  duplicate class definition for name: \"";
+      if ((defining == true) || (k != check)) {
+        linkage_error1 = "loader (instance of ";
+        linkage_error2 = "): attempted duplicate class definition for name: \"";
       } else {
         return;
       }
@@ -2292,7 +2278,7 @@
 // have been called.
 void SystemDictionary::update_dictionary(int d_index, unsigned int d_hash,
                                          int p_index, unsigned int p_hash,
-                                         instanceKlassHandle k,
+                                         InstanceKlass* k,
                                          Handle class_loader,
                                          TRAPS) {
   // Compile_lock prevents systemDictionary updates during compilations
@@ -2324,7 +2310,7 @@
   }
 
   // Make a new system dictionary entry.
-  Klass* sd_check = find_class(d_index, d_hash, name, loader_data);
+  InstanceKlass* sd_check = find_class(d_index, d_hash, name, loader_data);
   if (sd_check == NULL) {
     dictionary()->add_klass(name, loader_data, k);
     notice_modification();
@@ -2415,8 +2401,8 @@
   // Better never do a GC while we're holding these oops
   NoSafepointVerifier nosafepoint;
 
-  Klass* klass1 = find_class(d_index1, d_hash1, constraint_name, loader_data1);
-  Klass* klass2 = find_class(d_index2, d_hash2, constraint_name, loader_data2);
+  InstanceKlass* klass1 = find_class(d_index1, d_hash1, constraint_name, loader_data1);
+  InstanceKlass* klass2 = find_class(d_index2, d_hash2, constraint_name, loader_data2);
   return constraints()->add_entry(constraint_name, klass1, class_loader1,
                                   klass2, class_loader2);
   }
@@ -2576,7 +2562,7 @@
 
 // Helper for unpacking the return value from linkMethod and linkCallSite.
 static methodHandle unpack_method_and_appendix(Handle mname,
-                                               KlassHandle accessing_klass,
+                                               Klass* accessing_klass,
                                                objArrayHandle appendix_box,
                                                Handle* appendix_result,
                                                TRAPS) {
@@ -2600,7 +2586,7 @@
       // MethodName is dropped we need a way to make sure the
       // class_loader containing this method is kept alive.
       // FIXME: the appendix might also preserve this dependency.
-      ClassLoaderData* this_key = InstanceKlass::cast(accessing_klass())->class_loader_data();
+      ClassLoaderData* this_key = accessing_klass->class_loader_data();
       this_key->record_dependency(m->method_holder(), CHECK_NULL); // Can throw OOM
       return methodHandle(THREAD, m);
     }
@@ -2609,10 +2595,10 @@
   return empty;
 }
 
-methodHandle SystemDictionary::find_method_handle_invoker(KlassHandle klass,
+methodHandle SystemDictionary::find_method_handle_invoker(Klass* klass,
                                                           Symbol* name,
                                                           Symbol* signature,
-                                                          KlassHandle accessing_klass,
+                                                          Klass* accessing_klass,
                                                           Handle *appendix_result,
                                                           Handle *method_type_result,
                                                           TRAPS) {
@@ -2628,15 +2614,15 @@
   assert(appendix_box->obj_at(0) == NULL, "");
 
   // This should not happen.  JDK code should take care of that.
-  if (accessing_klass.is_null() || method_type.is_null()) {
+  if (accessing_klass == NULL || method_type.is_null()) {
     THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty);
   }
 
   // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName
   JavaCallArguments args;
-  args.push_oop(Handle(THREAD, accessing_klass()->java_mirror()));
+  args.push_oop(Handle(THREAD, accessing_klass->java_mirror()));
   args.push_int(ref_kind);
-  args.push_oop(Handle(THREAD, klass()->java_mirror()));
+  args.push_oop(Handle(THREAD, klass->java_mirror()));
   args.push_oop(name_str);
   args.push_oop(method_type);
   args.push_oop(appendix_box);
@@ -2675,7 +2661,7 @@
 // Because of class loader constraints, all method handle usage must be
 // consistent with this loader.
 Handle SystemDictionary::find_method_handle_type(Symbol* signature,
-                                                 KlassHandle accessing_klass,
+                                                 Klass* accessing_klass,
                                                  TRAPS) {
   Handle empty;
   vmIntrinsics::ID null_iid = vmIntrinsics::_none;  // distinct from all method handle invoker intrinsics
@@ -2691,9 +2677,9 @@
   }
 
   Handle class_loader, protection_domain;
-  if (accessing_klass.not_null()) {
-    class_loader      = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader());
-    protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain());
+  if (accessing_klass != NULL) {
+    class_loader      = Handle(THREAD, accessing_klass->class_loader());
+    protection_domain = Handle(THREAD, accessing_klass->protection_domain());
   }
   bool can_be_cached = true;
   int npts = ArgumentCount(signature).size();
@@ -2724,15 +2710,14 @@
       pts->obj_at_put(arg++, mirror);
 
     // Check accessibility.
-    if (ss.is_object() && accessing_klass.not_null()) {
+    if (ss.is_object() && accessing_klass != NULL) {
       Klass* sel_klass = java_lang_Class::as_Klass(mirror);
       mirror = NULL;  // safety
       // Emulate ConstantPool::verify_constant_pool_resolve.
       if (sel_klass->is_objArray_klass())
         sel_klass = ObjArrayKlass::cast(sel_klass)->bottom_klass();
       if (sel_klass->is_instance_klass()) {
-        KlassHandle sel_kh(THREAD, sel_klass);
-        LinkResolver::check_klass_accessability(accessing_klass, sel_kh, CHECK_(empty));
+        LinkResolver::check_klass_accessability(accessing_klass, sel_klass, CHECK_(empty));
       }
     }
   }
@@ -2765,9 +2750,9 @@
 }
 
 // Ask Java code to find or construct a method handle constant.
-Handle SystemDictionary::link_method_handle_constant(KlassHandle caller,
+Handle SystemDictionary::link_method_handle_constant(Klass* caller,
                                                      int ref_kind, //e.g., JVM_REF_invokeVirtual
-                                                     KlassHandle callee,
+                                                     Klass* callee,
                                                      Symbol* name_sym,
                                                      Symbol* signature,
                                                      TRAPS) {
@@ -2776,7 +2761,7 @@
   Handle type;
   if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') {
     type = find_method_handle_type(signature, caller, CHECK_(empty));
-  } else if (caller.is_null()) {
+  } else if (caller == NULL) {
     // This should not happen.  JDK code should take care of that.
     THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty);
   } else {
@@ -2813,7 +2798,7 @@
 
 // Ask Java code to find or construct a java.lang.invoke.CallSite for the given
 // name and signature, as interpreted relative to the given class loader.
-methodHandle SystemDictionary::find_dynamic_call_site_invoker(KlassHandle caller,
+methodHandle SystemDictionary::find_dynamic_call_site_invoker(Klass* caller,
                                                               Handle bootstrap_specifier,
                                                               Symbol* name,
                                                               Symbol* type,
@@ -2844,7 +2829,7 @@
   Handle method_type = find_method_handle_type(type, caller, CHECK_(empty));
 
   // This should not happen.  JDK code should take care of that.
-  if (caller.is_null() || method_type.is_null()) {
+  if (caller == NULL || method_type.is_null()) {
     THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty);
   }
 
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -259,7 +259,7 @@
   static Klass* resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS);
 protected:
   // handle error translation for resolve_or_null results
-  static Klass* handle_resolution_exception(Symbol* class_name, bool throw_error, KlassHandle klass_h, TRAPS);
+  static Klass* handle_resolution_exception(Symbol* class_name, bool throw_error, Klass* klass, TRAPS);
 
 public:
 
@@ -282,11 +282,11 @@
   // Parse new stream. This won't update the system dictionary or
   // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses.
   // Also used by Unsafe_DefineAnonymousClass
-  static Klass* parse_stream(Symbol* class_name,
-                             Handle class_loader,
-                             Handle protection_domain,
-                             ClassFileStream* st,
-                             TRAPS) {
+  static InstanceKlass* parse_stream(Symbol* class_name,
+                                     Handle class_loader,
+                                     Handle protection_domain,
+                                     ClassFileStream* st,
+                                     TRAPS) {
     return parse_stream(class_name,
                         class_loader,
                         protection_domain,
@@ -295,20 +295,20 @@
                         NULL, // cp_patches
                         THREAD);
   }
-  static Klass* parse_stream(Symbol* class_name,
-                             Handle class_loader,
-                             Handle protection_domain,
-                             ClassFileStream* st,
-                             const InstanceKlass* host_klass,
-                             GrowableArray<Handle>* cp_patches,
-                             TRAPS);
+  static InstanceKlass* parse_stream(Symbol* class_name,
+                                     Handle class_loader,
+                                     Handle protection_domain,
+                                     ClassFileStream* st,
+                                     const InstanceKlass* host_klass,
+                                     GrowableArray<Handle>* cp_patches,
+                                     TRAPS);
 
   // Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
-  static Klass* resolve_from_stream(Symbol* class_name,
-                                    Handle class_loader,
-                                    Handle protection_domain,
-                                    ClassFileStream* st,
-                                    TRAPS);
+  static InstanceKlass* resolve_from_stream(Symbol* class_name,
+                                            Handle class_loader,
+                                            Handle protection_domain,
+                                            ClassFileStream* st,
+                                            TRAPS);
 
   // Lookup an already loaded class. If not found NULL is returned.
   static Klass* find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
@@ -516,10 +516,10 @@
   // JSR 292
   // find a java.lang.invoke.MethodHandle.invoke* method for a given signature
   // (asks Java to compute it if necessary, except in a compiler thread)
-  static methodHandle find_method_handle_invoker(KlassHandle klass,
+  static methodHandle find_method_handle_invoker(Klass* klass,
                                                  Symbol* name,
                                                  Symbol* signature,
-                                                 KlassHandle accessing_klass,
+                                                 Klass* accessing_klass,
                                                  Handle *appendix_result,
                                                  Handle *method_type_result,
                                                  TRAPS);
@@ -531,19 +531,19 @@
   // find a java.lang.invoke.MethodType object for a given signature
   // (asks Java to compute it if necessary, except in a compiler thread)
   static Handle    find_method_handle_type(Symbol* signature,
-                                           KlassHandle accessing_klass,
+                                           Klass* accessing_klass,
                                            TRAPS);
 
   // ask Java to compute a java.lang.invoke.MethodHandle object for a given CP entry
-  static Handle    link_method_handle_constant(KlassHandle caller,
+  static Handle    link_method_handle_constant(Klass* caller,
                                                int ref_kind, //e.g., JVM_REF_invokeVirtual
-                                               KlassHandle callee,
+                                               Klass* callee,
                                                Symbol* name,
                                                Symbol* signature,
                                                TRAPS);
 
   // ask Java to create a dynamic call site, while linking an invokedynamic op
-  static methodHandle find_dynamic_call_site_invoker(KlassHandle caller,
+  static methodHandle find_dynamic_call_site_invoker(Klass* caller,
                                                      Handle bootstrap_method,
                                                      Symbol* name,
                                                      Symbol* type,
@@ -615,7 +615,7 @@
   static Klass* try_get_next_class();
 
 protected:
-  static void validate_protection_domain(instanceKlassHandle klass,
+  static void validate_protection_domain(InstanceKlass* klass,
                                          Handle class_loader,
                                          Handle protection_domain, TRAPS);
 
@@ -631,48 +631,48 @@
   // Basic loading operations
   static Klass* resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
   static Klass* resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
-  static instanceKlassHandle handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);
+  static InstanceKlass* handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);
   // Wait on SystemDictionary_lock; unlocks lockObject before
   // waiting; relocks lockObject with correct recursion count
   // after waiting, but before reentering SystemDictionary_lock
   // to preserve lock order semantics.
   static void double_lock_wait(Handle lockObject, TRAPS);
-  static void define_instance_class(instanceKlassHandle k, TRAPS);
-  static instanceKlassHandle find_or_define_instance_class(Symbol* class_name,
+  static void define_instance_class(InstanceKlass* k, TRAPS);
+  static InstanceKlass* find_or_define_instance_class(Symbol* class_name,
                                                 Handle class_loader,
-                                                instanceKlassHandle k, TRAPS);
-  static bool is_shared_class_visible(Symbol* class_name, instanceKlassHandle ik,
+                                                InstanceKlass* k, TRAPS);
+  static bool is_shared_class_visible(Symbol* class_name, InstanceKlass* ik,
                                       Handle class_loader, TRAPS);
-  static instanceKlassHandle load_shared_class(instanceKlassHandle ik,
-                                               Handle class_loader,
-                                               Handle protection_domain,
-                                               TRAPS);
-  static instanceKlassHandle load_instance_class(Symbol* class_name, Handle class_loader, TRAPS);
+  static InstanceKlass* load_shared_class(InstanceKlass* ik,
+                                          Handle class_loader,
+                                          Handle protection_domain,
+                                          TRAPS);
+  static InstanceKlass* load_instance_class(Symbol* class_name, Handle class_loader, TRAPS);
   static Handle compute_loader_lock_object(Handle class_loader, TRAPS);
   static void check_loader_lock_contention(Handle loader_lock, TRAPS);
   static bool is_parallelCapable(Handle class_loader);
   static bool is_parallelDefine(Handle class_loader);
 
 public:
-  static instanceKlassHandle load_shared_class(Symbol* class_name,
-                                               Handle class_loader,
-                                               TRAPS);
+  static InstanceKlass* load_shared_class(Symbol* class_name,
+                                          Handle class_loader,
+                                          TRAPS);
   static bool is_system_class_loader(oop class_loader);
   static bool is_platform_class_loader(oop class_loader);
 
 protected:
-  static Klass* find_shared_class(Symbol* class_name);
+  static InstanceKlass* find_shared_class(Symbol* class_name);
 
   // Setup link to hierarchy
-  static void add_to_hierarchy(instanceKlassHandle k, TRAPS);
+  static void add_to_hierarchy(InstanceKlass* k, TRAPS);
 
   // We pass in the hashtable index so we can calculate it outside of
   // the SystemDictionary_lock.
 
   // Basic find on loaded classes
-  static Klass* find_class(int index, unsigned int hash,
-                             Symbol* name, ClassLoaderData* loader_data);
-  static Klass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
+  static InstanceKlass* find_class(int index, unsigned int hash,
+                                   Symbol* name, ClassLoaderData* loader_data);
+  static InstanceKlass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
 
   // Basic find on classes in the midst of being loaded
   static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data);
@@ -697,11 +697,11 @@
 
   // Class loader constraints
   static void check_constraints(int index, unsigned int hash,
-                                instanceKlassHandle k, Handle loader,
+                                InstanceKlass* k, Handle loader,
                                 bool defining, TRAPS);
   static void update_dictionary(int d_index, unsigned int d_hash,
                                 int p_index, unsigned int p_hash,
-                                instanceKlassHandle k, Handle loader,
+                                InstanceKlass* k, Handle loader,
                                 TRAPS);
 
   // Variables holding commonly used klasses (preloaded)
--- a/hotspot/src/share/vm/classfile/systemDictionaryShared.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/systemDictionaryShared.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, 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
@@ -33,10 +33,10 @@
 class SystemDictionaryShared: public SystemDictionary {
 public:
   static void initialize(TRAPS) {}
-  static instanceKlassHandle find_or_load_shared_class(Symbol* class_name,
-                                                       Handle class_loader,
-                                                       TRAPS) {
-    return instanceKlassHandle();
+  static InstanceKlass* find_or_load_shared_class(Symbol* class_name,
+                                                  Handle class_loader,
+                                                  TRAPS) {
+    return NULL;
   }
   static void roots_oops_do(OopClosure* blk) {}
   static void oops_do(OopClosure* f) {}
@@ -45,7 +45,7 @@
     return (class_loader == NULL);
   }
   static bool is_shared_class_visible_for_classloader(
-                                      instanceKlassHandle ik,
+                                      InstanceKlass* ik,
                                       Handle class_loader,
                                       const char* pkg_string,
                                       Symbol* pkg_name,
@@ -86,7 +86,7 @@
                   Symbol* from_name, bool from_field_is_protected,
                   bool from_is_array, bool from_is_object) {return false;}
   static void finalize_verification_constraints() {}
-  static void check_verification_constraints(instanceKlassHandle klass,
+  static void check_verification_constraints(InstanceKlass* klass,
                                               TRAPS) {}
 };
 
--- a/hotspot/src/share/vm/classfile/verificationType.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/verificationType.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -42,18 +42,16 @@
   }
 }
 
-bool VerificationType::resolve_and_check_assignability(instanceKlassHandle klass, Symbol* name,
+bool VerificationType::resolve_and_check_assignability(InstanceKlass* klass, Symbol* name,
          Symbol* from_name, bool from_field_is_protected, bool from_is_array, bool from_is_object, TRAPS) {
   HandleMark hm(THREAD);
-  Klass* obj = SystemDictionary::resolve_or_fail(
+  Klass* this_class = SystemDictionary::resolve_or_fail(
       name, Handle(THREAD, klass->class_loader()),
       Handle(THREAD, klass->protection_domain()), true, CHECK_false);
   if (log_is_enabled(Debug, class, resolve)) {
-    Verifier::trace_class_resolution(obj, klass());
+    Verifier::trace_class_resolution(this_class, klass);
   }
 
-  KlassHandle this_class(THREAD, obj);
-
   if (this_class->is_interface() && (!from_field_is_protected ||
       from_name != vmSymbols::java_lang_Object())) {
     // If we are not trying to access a protected field or method in
@@ -68,9 +66,9 @@
         from_name, Handle(THREAD, klass->class_loader()),
         Handle(THREAD, klass->protection_domain()), true, CHECK_false);
     if (log_is_enabled(Debug, class, resolve)) {
-      Verifier::trace_class_resolution(from_class, klass());
+      Verifier::trace_class_resolution(from_class, klass);
     }
-    return InstanceKlass::cast(from_class)->is_subclass_of(this_class());
+    return InstanceKlass::cast(from_class)->is_subclass_of(this_class);
   }
 
   return false;
@@ -79,7 +77,7 @@
 bool VerificationType::is_reference_assignable_from(
     const VerificationType& from, ClassVerifier* context,
     bool from_field_is_protected, TRAPS) const {
-  instanceKlassHandle klass = context->current_class();
+  InstanceKlass* klass = context->current_class();
   if (from.is_null()) {
     // null is assignable to any reference
     return true;
@@ -94,7 +92,7 @@
       return true;
     }
 
-    if (DumpSharedSpaces && SystemDictionaryShared::add_verification_constraint(klass(),
+    if (DumpSharedSpaces && SystemDictionaryShared::add_verification_constraint(klass,
               name(), from.name(), from_field_is_protected, from.is_array(),
               from.is_object())) {
       // If add_verification_constraint() returns true, the resolution/check should be
@@ -102,7 +100,7 @@
       return true;
     }
 
-    return resolve_and_check_assignability(klass(), name(), from.name(),
+    return resolve_and_check_assignability(klass, name(), from.name(),
           from_field_is_protected, from.is_array(), from.is_object(), THREAD);
   } else if (is_array() && from.is_array()) {
     VerificationType comp_this = get_component(context, CHECK_false);
--- a/hotspot/src/share/vm/classfile/verificationType.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/verificationType.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -336,7 +336,7 @@
     TRAPS) const;
 
  public:
-  static bool resolve_and_check_assignability(instanceKlassHandle klass, Symbol* name,
+  static bool resolve_and_check_assignability(InstanceKlass* klass, Symbol* name,
                                               Symbol* from_name, bool from_field_is_protected,
                                               bool from_is_array, bool from_is_object,
                                               TRAPS);
--- a/hotspot/src/share/vm/classfile/verifier.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/verifier.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -125,7 +125,7 @@
   st->print_cr("End class verification for: %s", klassName);
 }
 
-bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, bool should_verify_class, TRAPS) {
+bool Verifier::verify(InstanceKlass* klass, Verifier::Mode mode, bool should_verify_class, TRAPS) {
   HandleMark hm(THREAD);
   ResourceMark rm(THREAD);
 
@@ -203,13 +203,13 @@
     return true; // verifcation succeeded
   } else { // VerifyError or ClassFormatError to be created and thrown
     ResourceMark rm(THREAD);
-    instanceKlassHandle kls =
+    Klass* kls =
       SystemDictionary::resolve_or_fail(exception_name, true, CHECK_false);
     if (log_is_enabled(Debug, class, resolve)) {
-      Verifier::trace_class_resolution(kls(), klass());
+      Verifier::trace_class_resolution(kls, klass);
     }
 
-    while (!kls.is_null()) {
+    while (kls != NULL) {
       if (kls == klass) {
         // If the class being verified is the exception we're creating
         // or one of it's superclasses, we're in trouble and are going
@@ -224,7 +224,7 @@
   }
 }
 
-bool Verifier::is_eligible_for_verification(instanceKlassHandle klass, bool should_verify_class) {
+bool Verifier::is_eligible_for_verification(InstanceKlass* klass, bool should_verify_class) {
   Symbol* name = klass->name();
   Klass* refl_magic_klass = SystemDictionary::reflect_MagicAccessorImpl_klass();
 
@@ -243,7 +243,7 @@
     // already been rewritten to contain constant pool cache indices,
     // which the verifier can't understand.
     // Shared classes shouldn't have stackmaps either.
-    !klass()->is_shared() &&
+    !klass->is_shared() &&
 
     // As of the fix for 4486457 we disable verification for all of the
     // dynamically-generated bytecodes associated with the 1.4
@@ -256,7 +256,7 @@
 }
 
 Symbol* Verifier::inference_verify(
-    instanceKlassHandle klass, char* message, size_t message_len, TRAPS) {
+    InstanceKlass* klass, char* message, size_t message_len, TRAPS) {
   JavaThread* thread = (JavaThread*)THREAD;
   JNIEnv *env = thread->jni_environment();
 
@@ -559,7 +559,7 @@
 // Methods in ClassVerifier
 
 ClassVerifier::ClassVerifier(
-    instanceKlassHandle klass, TRAPS)
+    InstanceKlass* klass, TRAPS)
     : _thread(THREAD), _exception_type(NULL), _message(NULL), _klass(klass) {
   _this_type = VerificationType::reference_type(klass->name());
   // Create list to hold symbols in reference area.
@@ -2001,13 +2001,13 @@
     true, THREAD);
 
   if (log_is_enabled(Debug, class, resolve)) {
-    instanceKlassHandle cur_class = current_class();
-    Verifier::trace_class_resolution(kls, cur_class());
+    InstanceKlass* cur_class = InstanceKlass::cast(current_class());
+    Verifier::trace_class_resolution(kls, cur_class);
   }
   return kls;
 }
 
-bool ClassVerifier::is_protected_access(instanceKlassHandle this_class,
+bool ClassVerifier::is_protected_access(InstanceKlass* this_class,
                                         Klass* target_class,
                                         Symbol* field_name,
                                         Symbol* field_sig,
@@ -2170,7 +2170,7 @@
 }
 
 bool ClassVerifier::name_in_supers(
-    Symbol* ref_name, instanceKlassHandle current) {
+    Symbol* ref_name, InstanceKlass* current) {
   Klass* super = current->super();
   while (super != NULL) {
     if (super->name() == ref_name) {
@@ -2600,8 +2600,8 @@
         Klass::find_overpass);
       // Do nothing if method is not found.  Let resolution detect the error.
       if (m != NULL) {
-        instanceKlassHandle mh(THREAD, m->method_holder());
-        if (m->is_protected() && !mh->is_same_class_package(_klass())) {
+        InstanceKlass* mh = m->method_holder();
+        if (m->is_protected() && !mh->is_same_class_package(_klass)) {
           bool assignable = current_type().is_assignable_from(
             objectref_type, this, true, CHECK_VERIFY(this));
           if (!assignable) {
@@ -2631,7 +2631,7 @@
 }
 
 bool ClassVerifier::is_same_or_direct_interface(
-    instanceKlassHandle klass,
+    InstanceKlass* klass,
     VerificationType klass_type,
     VerificationType ref_class_type) {
   if (ref_class_type.equals(klass_type)) return true;
--- a/hotspot/src/share/vm/classfile/verifier.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/classfile/verifier.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, 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
@@ -51,7 +51,7 @@
    * error.
    */
   static void log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name, TRAPS);
-  static bool verify(instanceKlassHandle klass, Mode mode, bool should_verify_class, TRAPS);
+  static bool verify(InstanceKlass* klass, Mode mode, bool should_verify_class, TRAPS);
 
   // Return false if the class is loaded by the bootstrap loader,
   // or if defineClass was called requesting skipping verification
@@ -65,9 +65,9 @@
   static void trace_class_resolution(Klass* resolve_class, InstanceKlass* verify_class);
 
  private:
-  static bool is_eligible_for_verification(instanceKlassHandle klass, bool should_verify_class);
+  static bool is_eligible_for_verification(InstanceKlass* klass, bool should_verify_class);
   static Symbol* inference_verify(
-    instanceKlassHandle klass, char* msg, size_t msg_len, TRAPS);
+    InstanceKlass* klass, char* msg, size_t msg_len, TRAPS);
 };
 
 class RawBytecodeStream;
@@ -275,7 +275,7 @@
   }
 
   bool is_protected_access(
-    instanceKlassHandle this_class, Klass* target_class,
+    InstanceKlass* this_class, Klass* target_class,
     Symbol* field_name, Symbol* field_sig, bool is_method);
 
   void verify_cp_index(u2 bci, const constantPoolHandle& cp, int index, TRAPS);
@@ -344,11 +344,11 @@
   void verify_astore(u2 index, StackMapFrame* current_frame, TRAPS);
   void verify_iinc  (u2 index, StackMapFrame* current_frame, TRAPS);
 
-  bool name_in_supers(Symbol* ref_name, instanceKlassHandle current);
+  bool name_in_supers(Symbol* ref_name, InstanceKlass* current);
 
   VerificationType object_type() const;
 
-  instanceKlassHandle _klass;  // the class being verified
+  InstanceKlass*      _klass;  // the class being verified
   methodHandle        _method; // current method being verified
   VerificationType    _this_type; // the verification type of the current class
 
@@ -362,7 +362,7 @@
   // that a class has been verified and prepared for execution.
   bool was_recursively_verified() { return _klass->is_rewritten(); }
 
-  bool is_same_or_direct_interface(instanceKlassHandle klass,
+  bool is_same_or_direct_interface(InstanceKlass* klass,
     VerificationType klass_type, VerificationType ref_class_type);
 
  public:
@@ -372,14 +372,14 @@
   };
 
   // constructor
-  ClassVerifier(instanceKlassHandle klass, TRAPS);
+  ClassVerifier(InstanceKlass* klass, TRAPS);
 
   // destructor
   ~ClassVerifier();
 
   Thread* thread()             { return _thread; }
   const methodHandle& method() { return _method; }
-  instanceKlassHandle current_class() const { return _klass; }
+  InstanceKlass* current_class() const { return _klass; }
   VerificationType current_type() const { return _this_type; }
 
   // Verifies the class.  If a verify or class file format error occurs,
--- a/hotspot/src/share/vm/code/codeCache.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/code/codeCache.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -1141,7 +1141,7 @@
 }
 
 #ifdef HOTSWAP
-int CodeCache::mark_for_evol_deoptimization(instanceKlassHandle dependee) {
+int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
   MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
   int number_of_marked_CodeBlobs = 0;
 
@@ -1162,7 +1162,7 @@
     CompiledMethod* nm = iter.method();
     if (nm->is_marked_for_deoptimization()) {
       // ...Already marked in the previous pass; don't count it again.
-    } else if (nm->is_evol_dependent_on(dependee())) {
+    } else if (nm->is_evol_dependent_on(dependee)) {
       ResourceMark rm;
       nm->mark_for_deoptimization();
       number_of_marked_CodeBlobs++;
@@ -1218,7 +1218,7 @@
 }
 
 // Flushes compiled methods dependent on dependee.
-void CodeCache::flush_dependents_on(instanceKlassHandle dependee) {
+void CodeCache::flush_dependents_on(InstanceKlass* dependee) {
   assert_lock_strong(Compile_lock);
 
   if (number_of_nmethods_with_dependencies() == 0) return;
@@ -1239,7 +1239,7 @@
 
 #ifdef HOTSWAP
 // Flushes compiled methods dependent on dependee in the evolutionary sense
-void CodeCache::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
+void CodeCache::flush_evol_dependents_on(InstanceKlass* ev_k) {
   // --- Compile_lock is not held. However we are at a safepoint.
   assert_locked_or_safepoint(Compile_lock);
   if (number_of_nmethods_with_dependencies() == 0 && !UseAOT) return;
@@ -1249,7 +1249,7 @@
   // holding the CodeCache_lock.
 
   // Compute the dependent nmethods
-  if (mark_for_evol_deoptimization(ev_k_h) > 0) {
+  if (mark_for_evol_deoptimization(ev_k) > 0) {
     // At least one nmethod has been marked for deoptimization
 
     // All this already happens inside a VM_Operation, so we'll do all the work here.
--- a/hotspot/src/share/vm/code/codeCache.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/code/codeCache.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -260,7 +260,7 @@
  private:
   static int  mark_for_deoptimization(KlassDepChange& changes);
 #ifdef HOTSWAP
-  static int  mark_for_evol_deoptimization(instanceKlassHandle dependee);
+  static int  mark_for_evol_deoptimization(InstanceKlass* dependee);
 #endif // HOTSWAP
 
  public:
@@ -269,10 +269,10 @@
   static void make_marked_nmethods_not_entrant();
 
   // Flushing and deoptimization
-  static void flush_dependents_on(instanceKlassHandle dependee);
+  static void flush_dependents_on(InstanceKlass* dependee);
 #ifdef HOTSWAP
   // Flushing and deoptimization in case of evolution
-  static void flush_evol_dependents_on(instanceKlassHandle dependee);
+  static void flush_evol_dependents_on(InstanceKlass* dependee);
 #endif // HOTSWAP
   // Support for fullspeed debugging
   static void flush_dependents_on_method(methodHandle dependee);
--- a/hotspot/src/share/vm/code/compiledIC.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -457,7 +457,7 @@
 // null check, while a static_bound won't. A static_bound (but not optimized) must
 // therefore use the unverified entry point.
 void CompiledIC::compute_monomorphic_entry(const methodHandle& method,
-                                           KlassHandle receiver_klass,
+                                           Klass* receiver_klass,
                                            bool is_optimized,
                                            bool static_bound,
                                            bool caller_is_nmethod,
@@ -494,7 +494,7 @@
   bool far_c2a = entry != NULL && caller_is_nmethod && method_code->is_far_code();
   if (entry != NULL && !far_c2a) {
     // Call to near compiled code (nmethod or aot).
-    info.set_compiled_entry(entry, (static_bound || is_optimized) ? NULL : receiver_klass(), is_optimized);
+    info.set_compiled_entry(entry, (static_bound || is_optimized) ? NULL : receiver_klass, is_optimized);
   } else {
     if (is_optimized) {
       if (far_c2a) {
@@ -507,7 +507,7 @@
     } else {
       // Use icholder entry
       assert(method_code == NULL || method_code->is_compiled(), "must be compiled");
-      CompiledICHolder* holder = new CompiledICHolder(method(), receiver_klass());
+      CompiledICHolder* holder = new CompiledICHolder(method(), receiver_klass);
       info.set_icholder_entry(method()->get_c2i_unverified_entry(), holder);
     }
   }
--- a/hotspot/src/share/vm/code/compiledIC.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -266,7 +266,7 @@
   // allocation in the code cache fails.
   bool set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS);
 
-  static void compute_monomorphic_entry(const methodHandle& method, KlassHandle receiver_klass,
+  static void compute_monomorphic_entry(const methodHandle& method, Klass* receiver_klass,
                                         bool is_optimized, bool static_bound, bool caller_is_nmethod,
                                         CompiledICInfo& info, TRAPS);
 
--- a/hotspot/src/share/vm/code/dependencies.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/code/dependencies.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -737,13 +737,13 @@
 class KlassDepChange : public DepChange {
  private:
   // each change set is rooted in exactly one new type (at present):
-  KlassHandle _new_type;
+  Klass* _new_type;
 
   void initialize();
 
  public:
   // notes the new type, marks it and all its super-types
-  KlassDepChange(KlassHandle new_type)
+  KlassDepChange(Klass* new_type)
     : _new_type(new_type)
   {
     initialize();
@@ -759,7 +759,7 @@
     nm->mark_for_deoptimization(/*inc_recompile_counts=*/true);
   }
 
-  Klass* new_type() { return _new_type(); }
+  Klass* new_type() { return _new_type; }
 
   // involves_context(k) is true if k is new_type or any of the super types
   bool involves_context(Klass* k);
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -683,7 +683,7 @@
                                        AbstractCompiler* comp, bool compiler_thread, TRAPS) {
   JavaThread* thread = NULL;
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_0);
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* klass = InstanceKlass::cast(k);
   instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_0);
   Handle string = java_lang_String::create_from_str(name, CHECK_0);
 
--- a/hotspot/src/share/vm/gc/shared/allocTracer.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/gc/shared/allocTracer.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, 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
@@ -28,19 +28,19 @@
 #include "trace/tracing.hpp"
 #include "utilities/globalDefinitions.hpp"
 
-void AllocTracer::send_allocation_outside_tlab_event(KlassHandle klass, size_t alloc_size) {
+void AllocTracer::send_allocation_outside_tlab_event(Klass* klass, size_t alloc_size) {
   EventObjectAllocationOutsideTLAB event;
   if (event.should_commit()) {
-    event.set_objectClass(klass());
+    event.set_objectClass(klass);
     event.set_allocationSize(alloc_size);
     event.commit();
   }
 }
 
-void AllocTracer::send_allocation_in_new_tlab_event(KlassHandle klass, size_t tlab_size, size_t alloc_size) {
+void AllocTracer::send_allocation_in_new_tlab_event(Klass* klass, size_t tlab_size, size_t alloc_size) {
   EventObjectAllocationInNewTLAB event;
   if (event.should_commit()) {
-    event.set_objectClass(klass());
+    event.set_objectClass(klass);
     event.set_allocationSize(alloc_size);
     event.set_tlabSize(tlab_size);
     event.commit();
--- a/hotspot/src/share/vm/gc/shared/allocTracer.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/gc/shared/allocTracer.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, 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
@@ -30,8 +30,8 @@
 
 class AllocTracer : AllStatic {
   public:
-    static void send_allocation_outside_tlab_event(KlassHandle klass, size_t alloc_size);
-    static void send_allocation_in_new_tlab_event(KlassHandle klass, size_t tlab_size, size_t alloc_size);
+    static void send_allocation_outside_tlab_event(Klass* klass, size_t alloc_size);
+    static void send_allocation_in_new_tlab_event(Klass* klass, size_t tlab_size, size_t alloc_size);
     static void send_allocation_requiring_gc_event(size_t size, uint gcId);
 };
 
--- a/hotspot/src/share/vm/gc/shared/collectedHeap.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/gc/shared/collectedHeap.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, 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
@@ -279,7 +279,7 @@
 }
 #endif
 
-HeapWord* CollectedHeap::allocate_from_tlab_slow(KlassHandle klass, Thread* thread, size_t size) {
+HeapWord* CollectedHeap::allocate_from_tlab_slow(Klass* klass, Thread* thread, size_t size) {
 
   // Retain tlab and allocate object in shared space if
   // the amount free in the tlab is too large to discard.
--- a/hotspot/src/share/vm/gc/shared/collectedHeap.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/gc/shared/collectedHeap.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, 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
@@ -138,28 +138,28 @@
   virtual void resize_all_tlabs();
 
   // Allocate from the current thread's TLAB, with broken-out slow path.
-  inline static HeapWord* allocate_from_tlab(KlassHandle klass, Thread* thread, size_t size);
-  static HeapWord* allocate_from_tlab_slow(KlassHandle klass, Thread* thread, size_t size);
+  inline static HeapWord* allocate_from_tlab(Klass* klass, Thread* thread, size_t size);
+  static HeapWord* allocate_from_tlab_slow(Klass* klass, Thread* thread, size_t size);
 
   // Allocate an uninitialized block of the given size, or returns NULL if
   // this is impossible.
-  inline static HeapWord* common_mem_allocate_noinit(KlassHandle klass, size_t size, TRAPS);
+  inline static HeapWord* common_mem_allocate_noinit(Klass* klass, size_t size, TRAPS);
 
   // Like allocate_init, but the block returned by a successful allocation
   // is guaranteed initialized to zeros.
-  inline static HeapWord* common_mem_allocate_init(KlassHandle klass, size_t size, TRAPS);
+  inline static HeapWord* common_mem_allocate_init(Klass* klass, size_t size, TRAPS);
 
   // Helper functions for (VM) allocation.
-  inline static void post_allocation_setup_common(KlassHandle klass, HeapWord* obj);
-  inline static void post_allocation_setup_no_klass_install(KlassHandle klass,
+  inline static void post_allocation_setup_common(Klass* klass, HeapWord* obj);
+  inline static void post_allocation_setup_no_klass_install(Klass* klass,
                                                             HeapWord* objPtr);
 
-  inline static void post_allocation_setup_obj(KlassHandle klass, HeapWord* obj, int size);
+  inline static void post_allocation_setup_obj(Klass* klass, HeapWord* obj, int size);
 
-  inline static void post_allocation_setup_array(KlassHandle klass,
+  inline static void post_allocation_setup_array(Klass* klass,
                                                  HeapWord* obj, int length);
 
-  inline static void post_allocation_setup_class(KlassHandle klass, HeapWord* obj, int size);
+  inline static void post_allocation_setup_class(Klass* klass, HeapWord* obj, int size);
 
   // Clears an allocated object.
   inline static void init_obj(HeapWord* obj, size_t size);
@@ -299,10 +299,10 @@
   GCCause::Cause gc_cause() { return _gc_cause; }
 
   // General obj/array allocation facilities.
-  inline static oop obj_allocate(KlassHandle klass, int size, TRAPS);
-  inline static oop array_allocate(KlassHandle klass, int size, int length, TRAPS);
-  inline static oop array_allocate_nozero(KlassHandle klass, int size, int length, TRAPS);
-  inline static oop class_allocate(KlassHandle klass, int size, TRAPS);
+  inline static oop obj_allocate(Klass* klass, int size, TRAPS);
+  inline static oop array_allocate(Klass* klass, int size, int length, TRAPS);
+  inline static oop array_allocate_nozero(Klass* klass, int size, int length, TRAPS);
+  inline static oop class_allocate(Klass* klass, int size, TRAPS);
 
   // Raw memory allocation facilities
   // The obj and array allocate methods are covers for these methods.
--- a/hotspot/src/share/vm/gc/shared/collectedHeap.inline.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/gc/shared/collectedHeap.inline.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, 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
@@ -40,26 +40,26 @@
 
 // Inline allocation implementations.
 
-void CollectedHeap::post_allocation_setup_common(KlassHandle klass,
+void CollectedHeap::post_allocation_setup_common(Klass* klass,
                                                  HeapWord* obj_ptr) {
   post_allocation_setup_no_klass_install(klass, obj_ptr);
   oop obj = (oop)obj_ptr;
 #if ! INCLUDE_ALL_GCS
-  obj->set_klass(klass());
+  obj->set_klass(klass);
 #else
   // Need a release store to ensure array/class length, mark word, and
   // object zeroing are visible before setting the klass non-NULL, for
   // concurrent collectors.
-  obj->release_set_klass(klass());
+  obj->release_set_klass(klass);
 #endif
 }
 
-void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
+void CollectedHeap::post_allocation_setup_no_klass_install(Klass* klass,
                                                            HeapWord* obj_ptr) {
   oop obj = (oop)obj_ptr;
 
   assert(obj != NULL, "NULL object pointer");
-  if (UseBiasedLocking && (klass() != NULL)) {
+  if (UseBiasedLocking && (klass != NULL)) {
     obj->set_mark(klass->prototype_header());
   } else {
     // May be bootstrapping
@@ -68,7 +68,7 @@
 }
 
 // Support for jvmti and dtrace
-inline void post_allocation_notify(KlassHandle klass, oop obj, int size) {
+inline void post_allocation_notify(Klass* klass, oop obj, int size) {
   // support low memory notifications (no-op if not enabled)
   LowMemoryDetector::detect_low_memory_for_collected_pools();
 
@@ -77,13 +77,13 @@
 
   if (DTraceAllocProbes) {
     // support for Dtrace object alloc event (no-op most of the time)
-    if (klass() != NULL && klass()->name() != NULL) {
+    if (klass != NULL && klass->name() != NULL) {
       SharedRuntime::dtrace_object_alloc(obj, size);
     }
   }
 }
 
-void CollectedHeap::post_allocation_setup_obj(KlassHandle klass,
+void CollectedHeap::post_allocation_setup_obj(Klass* klass,
                                               HeapWord* obj_ptr,
                                               int size) {
   post_allocation_setup_common(klass, obj_ptr);
@@ -94,7 +94,7 @@
   post_allocation_notify(klass, obj, size);
 }
 
-void CollectedHeap::post_allocation_setup_class(KlassHandle klass,
+void CollectedHeap::post_allocation_setup_class(Klass* klass,
                                                 HeapWord* obj_ptr,
                                                 int size) {
   // Set oop_size field before setting the _klass field because a
@@ -110,7 +110,7 @@
   post_allocation_notify(klass, new_cls, size);
 }
 
-void CollectedHeap::post_allocation_setup_array(KlassHandle klass,
+void CollectedHeap::post_allocation_setup_array(Klass* klass,
                                                 HeapWord* obj_ptr,
                                                 int length) {
   // Set array length before setting the _klass field because a
@@ -125,7 +125,7 @@
   post_allocation_notify(klass, new_obj, new_obj->size());
 }
 
-HeapWord* CollectedHeap::common_mem_allocate_noinit(KlassHandle klass, size_t size, TRAPS) {
+HeapWord* CollectedHeap::common_mem_allocate_noinit(Klass* klass, size_t size, TRAPS) {
 
   // Clear unhandled oops for memory allocation.  Memory allocation might
   // not take out a lock if from tlab, so clear here.
@@ -186,13 +186,13 @@
   }
 }
 
-HeapWord* CollectedHeap::common_mem_allocate_init(KlassHandle klass, size_t size, TRAPS) {
+HeapWord* CollectedHeap::common_mem_allocate_init(Klass* klass, size_t size, TRAPS) {
   HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
   init_obj(obj, size);
   return obj;
 }
 
-HeapWord* CollectedHeap::allocate_from_tlab(KlassHandle klass, Thread* thread, size_t size) {
+HeapWord* CollectedHeap::allocate_from_tlab(Klass* klass, Thread* thread, size_t size) {
   assert(UseTLAB, "should use UseTLAB");
 
   HeapWord* obj = thread->tlab().allocate(size);
@@ -211,7 +211,7 @@
   Copy::fill_to_aligned_words(obj + hs, size - hs);
 }
 
-oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
+oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) {
   debug_only(check_for_valid_allocation_state());
   assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
   assert(size >= 0, "int won't convert to size_t");
@@ -221,7 +221,7 @@
   return (oop)obj;
 }
 
-oop CollectedHeap::class_allocate(KlassHandle klass, int size, TRAPS) {
+oop CollectedHeap::class_allocate(Klass* klass, int size, TRAPS) {
   debug_only(check_for_valid_allocation_state());
   assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
   assert(size >= 0, "int won't convert to size_t");
@@ -231,7 +231,7 @@
   return (oop)obj;
 }
 
-oop CollectedHeap::array_allocate(KlassHandle klass,
+oop CollectedHeap::array_allocate(Klass* klass,
                                   int size,
                                   int length,
                                   TRAPS) {
@@ -244,7 +244,7 @@
   return (oop)obj;
 }
 
-oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
+oop CollectedHeap::array_allocate_nozero(Klass* klass,
                                          int size,
                                          int length,
                                          TRAPS) {
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -138,8 +138,8 @@
 // Allocation
 
 IRT_ENTRY(void, InterpreterRuntime::_new(JavaThread* thread, ConstantPool* pool, int index))
-  Klass* k_oop = pool->klass_at(index, CHECK);
-  instanceKlassHandle klass (THREAD, k_oop);
+  Klass* k = pool->klass_at(index, CHECK);
+  InstanceKlass* klass = InstanceKlass::cast(k);
 
   // Make sure we are not instantiating an abstract klass
   klass->check_valid_for_instantiation(true, CHECK);
@@ -461,8 +461,8 @@
     Exceptions::debug_check_abort(h_exception);
 
     // exception handler lookup
-    KlassHandle h_klass(THREAD, h_exception->klass());
-    handler_bci = Method::fast_exception_handler_bci_for(h_method, h_klass, current_bci, THREAD);
+    Klass* klass = h_exception->klass();
+    handler_bci = Method::fast_exception_handler_bci_for(h_method, klass, current_bci, THREAD);
     if (HAS_PENDING_EXCEPTION) {
       // We threw an exception while trying to find the exception handler.
       // Transfer the new exception to the exception handle which will
@@ -1070,15 +1070,15 @@
     // non-static field accessors have an object, but we need a handle
     h_obj = Handle(thread, obj);
   }
-  instanceKlassHandle h_cp_entry_f1(thread, (Klass*)cp_entry->f1_as_klass());
-  jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_cp_entry_f1, cp_entry->f2_as_index(), is_static);
-  JvmtiExport::post_field_access(thread, method(thread), bcp(thread), h_cp_entry_f1, h_obj, fid);
+  InstanceKlass* cp_entry_f1 = InstanceKlass::cast(cp_entry->f1_as_klass());
+  jfieldID fid = jfieldIDWorkaround::to_jfieldID(cp_entry_f1, cp_entry->f2_as_index(), is_static);
+  JvmtiExport::post_field_access(thread, method(thread), bcp(thread), cp_entry_f1, h_obj, fid);
 IRT_END
 
 IRT_ENTRY(void, InterpreterRuntime::post_field_modification(JavaThread *thread,
   oopDesc* obj, ConstantPoolCacheEntry *cp_entry, jvalue *value))
 
-  Klass* k = (Klass*)cp_entry->f1_as_klass();
+  Klass* k = cp_entry->f1_as_klass();
 
   // check the access_flags for the field in the klass
   InstanceKlass* ik = InstanceKlass::cast(k);
@@ -1103,8 +1103,7 @@
   bool is_static = (obj == NULL);
 
   HandleMark hm(thread);
-  instanceKlassHandle h_klass(thread, k);
-  jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_klass, cp_entry->f2_as_index(), is_static);
+  jfieldID fid = jfieldIDWorkaround::to_jfieldID(ik, cp_entry->f2_as_index(), is_static);
   jvalue fvalue;
 #ifdef _LP64
   fvalue = *value;
@@ -1128,7 +1127,7 @@
     h_obj = Handle(thread, obj);
   }
 
-  JvmtiExport::post_raw_field_modification(thread, method(thread), bcp(thread), h_klass, h_obj,
+  JvmtiExport::post_raw_field_modification(thread, method(thread), bcp(thread), ik, h_obj,
                                            fid, sig_type, &fvalue);
 IRT_END
 
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -55,14 +55,14 @@
 // Implementation of CallInfo
 
 
-void CallInfo::set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS) {
+void CallInfo::set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS) {
   int vtable_index = Method::nonvirtual_vtable_index;
   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
 }
 
 
-void CallInfo::set_interface(KlassHandle resolved_klass,
-                             KlassHandle selected_klass,
+void CallInfo::set_interface(Klass* resolved_klass,
+                             Klass* selected_klass,
                              const methodHandle& resolved_method,
                              const methodHandle& selected_method,
                              int itable_index, TRAPS) {
@@ -75,8 +75,8 @@
   set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
 }
 
-void CallInfo::set_virtual(KlassHandle resolved_klass,
-                           KlassHandle selected_klass,
+void CallInfo::set_virtual(Klass* resolved_klass,
+                           Klass* selected_klass,
                            const methodHandle& resolved_method,
                            const methodHandle& selected_method,
                            int vtable_index, TRAPS) {
@@ -93,7 +93,7 @@
   set_handle(SystemDictionary::MethodHandle_klass(), resolved_method, resolved_appendix, resolved_method_type, CHECK);
 }
 
-void CallInfo::set_handle(KlassHandle resolved_klass,
+void CallInfo::set_handle(Klass* resolved_klass,
                           const methodHandle& resolved_method,
                           Handle resolved_appendix,
                           Handle resolved_method_type, TRAPS) {
@@ -110,8 +110,8 @@
   _resolved_method_type = resolved_method_type;
 }
 
-void CallInfo::set_common(KlassHandle resolved_klass,
-                          KlassHandle selected_klass,
+void CallInfo::set_common(Klass* resolved_klass,
+                          Klass* selected_klass,
                           const methodHandle& resolved_method,
                           const methodHandle& selected_method,
                           CallKind kind,
@@ -162,8 +162,8 @@
 
 #ifdef ASSERT
     // Ensure that this is really the case.
-    KlassHandle object_klass = SystemDictionary::Object_klass();
-    Method * object_resolved_method = object_klass()->vtable()->method_at(index);
+    Klass* object_klass = SystemDictionary::Object_klass();
+    Method * object_resolved_method = object_klass->vtable()->method_at(index);
     assert(object_resolved_method->name() == resolved_method->name(),
       "Object and interface method names should match at vtable index %d, %s != %s",
       index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string());
@@ -225,14 +225,13 @@
 
 LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, methodHandle current_method, TRAPS) {
    // resolve klass
-  Klass* result = pool->klass_ref_at(index, CHECK);
-  _resolved_klass = KlassHandle(THREAD, result);
+  _resolved_klass = pool->klass_ref_at(index, CHECK);
 
   // Get name, signature, and static klass
   _name          = pool->name_ref_at(index);
   _signature     = pool->signature_ref_at(index);
   _tag           = pool->tag_ref_at(index);
-  _current_klass = KlassHandle(THREAD, pool->pool_holder());
+  _current_klass = pool->pool_holder();
   _current_method = current_method;
 
   // Coming from the constant pool always checks access
@@ -241,14 +240,13 @@
 
 LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, TRAPS) {
    // resolve klass
-  Klass* result = pool->klass_ref_at(index, CHECK);
-  _resolved_klass = KlassHandle(THREAD, result);
+  _resolved_klass = pool->klass_ref_at(index, CHECK);
 
   // Get name, signature, and static klass
   _name          = pool->name_ref_at(index);
   _signature     = pool->signature_ref_at(index);
   _tag           = pool->tag_ref_at(index);
-  _current_klass = KlassHandle(THREAD, pool->pool_holder());
+  _current_klass = pool->pool_holder();
   _current_method = methodHandle();
 
   // Coming from the constant pool always checks access
@@ -256,7 +254,7 @@
 }
 
 char* LinkInfo::method_string() const {
-  return Method::name_and_sig_as_C_string(_resolved_klass(), _name, _signature);
+  return Method::name_and_sig_as_C_string(_resolved_klass, _name, _signature);
 }
 
 #ifndef PRODUCT
@@ -266,20 +264,20 @@
                 _resolved_klass->name()->as_C_string(),
                 _name->as_C_string(),
                 _signature->as_C_string(),
-                _current_klass.is_null() ? "(none)" : _current_klass->name()->as_C_string(),
+                _current_klass == NULL ? "(none)" : _current_klass->name()->as_C_string(),
                 _check_access ? "true" : "false");
 }
 #endif // PRODUCT
 //------------------------------------------------------------------------------------------------------------------------
 // Klass resolution
 
-void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
+void LinkResolver::check_klass_accessability(Klass* ref_klass, Klass* sel_klass, TRAPS) {
   Reflection::VerifyClassAccessResults vca_result =
-    Reflection::verify_class_access(ref_klass(), InstanceKlass::cast(sel_klass()), true);
+    Reflection::verify_class_access(ref_klass, InstanceKlass::cast(sel_klass), true);
   if (vca_result != Reflection::ACCESS_OK) {
     ResourceMark rm(THREAD);
-    char* msg = Reflection::verify_class_access_msg(ref_klass(),
-                                                    InstanceKlass::cast(sel_klass()),
+    char* msg = Reflection::verify_class_access_msg(ref_klass,
+                                                    InstanceKlass::cast(sel_klass),
                                                     vca_result);
     if (msg == NULL) {
       Exceptions::fthrow(
@@ -308,7 +306,7 @@
 methodHandle LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
                                                     bool checkpolymorphism,
                                                     bool in_imethod_resolve, TRAPS) {
-  KlassHandle klass = link_info.resolved_klass();
+  Klass* klass = link_info.resolved_klass();
   Symbol* name = link_info.name();
   Symbol* signature = link_info.signature();
 
@@ -320,7 +318,7 @@
     return methodHandle(THREAD, result);
   }
 
-  InstanceKlass* ik = InstanceKlass::cast(klass());
+  InstanceKlass* ik = InstanceKlass::cast(klass);
 
   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
   // ignore static and non-public methods of java.lang.Object,
@@ -358,7 +356,7 @@
 
 // returns first instance method
 // Looks up method in classes, then looks up local default methods
-methodHandle LinkResolver::lookup_instance_method_in_klasses(KlassHandle klass,
+methodHandle LinkResolver::lookup_instance_method_in_klasses(Klass* klass,
                                                              Symbol* name,
                                                              Symbol* signature, TRAPS) {
   Method* result = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
@@ -374,7 +372,7 @@
   }
 
   if (result == NULL) {
-    Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
+    Array<Method*>* default_methods = InstanceKlass::cast(klass)->default_methods();
     if (default_methods != NULL) {
       result = InstanceKlass::find_method(default_methods, name, signature);
       assert(result == NULL || !result->is_static(), "static defaults not allowed");
@@ -383,13 +381,13 @@
   return methodHandle(THREAD, result);
 }
 
-int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
+int LinkResolver::vtable_index_of_interface_method(Klass* klass,
                                                    const methodHandle& resolved_method) {
 
   int vtable_index = Method::invalid_vtable_index;
   Symbol* name = resolved_method->name();
   Symbol* signature = resolved_method->signature();
-  InstanceKlass* ik = InstanceKlass::cast(klass());
+  InstanceKlass* ik = InstanceKlass::cast(klass);
 
   // First check in default method array
   if (!resolved_method->is_abstract() && ik->default_methods() != NULL) {
@@ -410,7 +408,7 @@
 }
 
 methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
-  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass()());
+  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass());
 
   // Specify 'true' in order to skip default methods when searching the
   // interfaces.  Function lookup_method_in_klasses() already looked for
@@ -425,7 +423,7 @@
                                              Handle *appendix_result_or_null,
                                              Handle *method_type_result,
                                              TRAPS) {
-  KlassHandle klass = link_info.resolved_klass();
+  Klass* klass = link_info.resolved_klass();
   Symbol* name = link_info.name();
   Symbol* full_signature = link_info.signature();
 
@@ -436,8 +434,8 @@
                   vmIntrinsics::name_at(iid), klass->external_name(),
                   name->as_C_string(), full_signature->as_C_string());
   }
-  if ((klass() == SystemDictionary::MethodHandle_klass() ||
-       klass() == SystemDictionary::VarHandle_klass()) &&
+  if ((klass == SystemDictionary::MethodHandle_klass() ||
+       klass == SystemDictionary::VarHandle_klass()) &&
       iid != vmIntrinsics::_none) {
     if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
       // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
@@ -531,9 +529,9 @@
   return NULL;
 }
 
-void LinkResolver::check_method_accessability(KlassHandle ref_klass,
-                                              KlassHandle resolved_klass,
-                                              KlassHandle sel_klass,
+void LinkResolver::check_method_accessability(Klass* ref_klass,
+                                              Klass* resolved_klass,
+                                              Klass* sel_klass,
                                               const methodHandle& sel_method,
                                               TRAPS) {
 
@@ -547,7 +545,7 @@
   // We'll check for the method name first, as that's most likely
   // to be false (so we'll short-circuit out of these tests).
   if (sel_method->name() == vmSymbols::clone_name() &&
-      sel_klass() == SystemDictionary::Object_klass() &&
+      sel_klass == SystemDictionary::Object_klass() &&
       resolved_klass->is_array_klass()) {
     // We need to change "protected" to "public".
     assert(flags.is_protected(), "clone not protected?");
@@ -558,9 +556,9 @@
   }
 //  assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
 
-  if (!Reflection::verify_field_access(ref_klass(),
-                                       resolved_klass(),
-                                       sel_klass(),
+  if (!Reflection::verify_field_access(ref_klass,
+                                       resolved_klass,
+                                       sel_klass,
                                        flags,
                                        true)) {
     ResourceMark rm(THREAD);
@@ -586,22 +584,21 @@
   // It appears to fail when applied to an invokeinterface call site.
   // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
   // resolve klass
-  KlassHandle resolved_klass;
   if (code == Bytecodes::_invokedynamic) {
-    resolved_klass = SystemDictionary::MethodHandle_klass();
+    Klass* resolved_klass = SystemDictionary::MethodHandle_klass();
     Symbol* method_name = vmSymbols::invoke_name();
     Symbol* method_signature = pool->signature_ref_at(index);
-    KlassHandle  current_klass(THREAD, pool->pool_holder());
+    Klass*  current_klass = pool->pool_holder();
     LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
     return resolve_method(link_info, code, THREAD);
   }
 
   LinkInfo link_info(pool, index, methodHandle(), CHECK_NULL);
-  resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   if (pool->has_preresolution()
-      || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
-          MethodHandles::is_signature_polymorphic_name(resolved_klass(), link_info.name()))) {
+      || (resolved_klass == SystemDictionary::MethodHandle_klass() &&
+          MethodHandles::is_signature_polymorphic_name(resolved_klass, link_info.name()))) {
     Method* result = ConstantPool::method_at_if_loaded(pool, index);
     if (result != NULL) {
       return methodHandle(THREAD, result);
@@ -652,8 +649,8 @@
 }
 
 void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig,
-                                                  KlassHandle current_klass,
-                                                  KlassHandle sel_klass, TRAPS) {
+                                                  Klass* current_klass,
+                                                  Klass* sel_klass, TRAPS) {
   Handle ref_loader(THREAD, current_klass->class_loader());
   Handle sel_loader(THREAD, sel_klass->class_loader());
 
@@ -686,14 +683,14 @@
                                           Bytecodes::Code code, TRAPS) {
 
   Handle nested_exception;
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   // 1. For invokevirtual, cannot call an interface method
   if (code == Bytecodes::_invokevirtual && resolved_klass->is_interface()) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
-        resolved_klass()->external_name());
+        resolved_klass->external_name());
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -727,21 +724,21 @@
   if (resolved_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG_CAUSE_(vmSymbols::java_lang_NoSuchMethodError(),
-                    Method::name_and_sig_as_C_string(resolved_klass(),
+                    Method::name_and_sig_as_C_string(resolved_klass,
                                                      link_info.name(),
                                                      link_info.signature()),
                     nested_exception, NULL);
   }
 
-  // 6. access checks, access checking may be turned off when calling from within the VM.
-  KlassHandle current_klass = link_info.current_klass();
+  // 5. access checks, access checking may be turned off when calling from within the VM.
+  Klass* current_klass = link_info.current_klass();
   if (link_info.check_access()) {
-    assert(current_klass.not_null() , "current_klass should not be null");
+    assert(current_klass != NULL , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
     check_method_accessability(current_klass,
                                resolved_klass,
-                               KlassHandle(THREAD, resolved_method->method_holder()),
+                               resolved_method->method_holder(),
                                resolved_method,
                                CHECK_NULL);
 
@@ -753,8 +750,8 @@
 }
 
 static void trace_method_resolution(const char* prefix,
-                                    KlassHandle klass,
-                                    KlassHandle resolved_klass,
+                                    Klass* klass,
+                                    Klass* resolved_klass,
                                     const methodHandle& method,
                                     bool logitables,
                                     int index = -1) {
@@ -768,9 +765,9 @@
   }
   st->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
             prefix,
-            (klass.is_null() ? "<NULL>" : klass->internal_name()),
-            (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-            Method::name_and_sig_as_C_string(resolved_klass(),
+            (klass == NULL ? "<NULL>" : klass->internal_name()),
+            (resolved_klass == NULL ? "<NULL>" : resolved_klass->internal_name()),
+            Method::name_and_sig_as_C_string(resolved_klass,
                                              method->name(),
                                              method->signature()),
             method->method_holder()->internal_name());
@@ -785,13 +782,13 @@
 // Do linktime resolution of a method in the interface within the context of the specied bytecode.
 methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info, Bytecodes::Code code, TRAPS) {
 
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
 
   // check if klass is interface
   if (!resolved_klass->is_interface()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
+    jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass->external_name());
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -816,21 +813,21 @@
     // no method found
     ResourceMark rm(THREAD);
     THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
+                   Method::name_and_sig_as_C_string(resolved_klass,
                                                     link_info.name(),
                                                     link_info.signature()));
   }
 
   if (link_info.check_access()) {
     // JDK8 adds non-public interface methods, and accessability check requirement
-    KlassHandle current_klass = link_info.current_klass();
+    Klass* current_klass = link_info.current_klass();
 
-    assert(current_klass.not_null() , "current_klass should not be null");
+    assert(current_klass != NULL , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
     check_method_accessability(current_klass,
                                resolved_klass,
-                               KlassHandle(THREAD, resolved_method->method_holder()),
+                               resolved_method->method_holder(),
                                resolved_method,
                                CHECK_NULL);
 
@@ -841,7 +838,7 @@
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                  resolved_method->name(), resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
@@ -850,12 +847,12 @@
     ResourceMark rm(THREAD);
     char buf[200];
 
-    KlassHandle current_klass = link_info.current_klass();
+    Klass* current_klass = link_info.current_klass();
     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s, caller-class:%s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()),
-                                                  (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
+                                                  (current_klass == NULL ? "<NULL>" : current_klass->internal_name()));
      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -873,14 +870,14 @@
 //------------------------------------------------------------------------------------------------------------------------
 // Field resolution
 
-void LinkResolver::check_field_accessability(KlassHandle ref_klass,
-                                             KlassHandle resolved_klass,
-                                             KlassHandle sel_klass,
+void LinkResolver::check_field_accessability(Klass* ref_klass,
+                                             Klass* resolved_klass,
+                                             Klass* sel_klass,
                                              const fieldDescriptor& fd,
                                              TRAPS) {
-  if (!Reflection::verify_field_access(ref_klass(),
-                                       resolved_klass(),
-                                       sel_klass(),
+  if (!Reflection::verify_field_access(ref_klass,
+                                       resolved_klass,
+                                       sel_klass,
                                        fd.access_flags(),
                                        true)) {
     ResourceMark rm(THREAD);
@@ -913,19 +910,19 @@
   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);
   // Check if there's a resolved klass containing the field
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   Symbol* field = link_info.name();
   Symbol* sig = link_info.signature();
 
-  if (resolved_klass.is_null()) {
+  if (resolved_klass == NULL) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   }
 
   // Resolve instance field
-  KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd));
+  Klass* sel_klass = resolved_klass->find_field(field, sig, &fd);
   // check if field exists; i.e., if a klass containing the field def has been selected
-  if (sel_klass.is_null()) {
+  if (sel_klass == NULL) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   }
@@ -935,14 +932,14 @@
     return;
 
   // check access
-  KlassHandle current_klass = link_info.current_klass();
+  Klass* current_klass = link_info.current_klass();
   check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
 
   // check for errors
   if (is_static != fd.is_static()) {
     ResourceMark rm(THREAD);
     char msg[200];
-    jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
+    jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string());
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
   }
 
@@ -954,10 +951,10 @@
     ResourceMark rm(THREAD);
     stringStream ss;
 
-    if (sel_klass() != current_klass()) {
+    if (sel_klass != current_klass) {
       ss.print("Update to %s final field %s.%s attempted from a different class (%s) than the field's declaring class",
-                is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string(),
-                current_klass()->external_name());
+                is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
+                current_klass->external_name());
       THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
     }
 
@@ -973,7 +970,7 @@
 
       if (is_initialized_static_final_update || is_initialized_instance_final_update) {
         ss.print("Update to %s final field %s.%s attempted from a different method (%s) than the initializer method %s ",
-                 is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string(),
+                 is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
                  m()->name()->as_C_string(),
                  is_static ? "<clinit>" : "<init>");
         THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), ss.as_string());
@@ -991,7 +988,7 @@
     sel_klass->initialize(CHECK);
   }
 
-  if (sel_klass() != current_klass()) {
+  if (sel_klass != current_klass) {
     check_field_loader_constraints(field, sig, current_klass, sel_klass, CHECK);
   }
 
@@ -1017,7 +1014,7 @@
   methodHandle resolved_method = linktime_resolve_static_method(link_info, CHECK);
 
   // The resolved class can change as a result of this resolution.
-  KlassHandle resolved_klass(THREAD, resolved_method->method_holder());
+  Klass* resolved_klass = resolved_method->method_holder();
 
   // Initialize klass (this should only happen if everything is ok)
   if (initialize_class && resolved_klass->should_be_initialized()) {
@@ -1036,7 +1033,7 @@
 // throws linktime exceptions
 methodHandle LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) {
 
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   methodHandle resolved_method;
   if (!resolved_klass->is_interface()) {
     resolved_method = resolve_method(link_info, Bytecodes::_invokestatic, CHECK_NULL);
@@ -1049,7 +1046,7 @@
   if (!resolved_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
+    jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass,
                                                       resolved_method->name(),
                                                       resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
@@ -1078,7 +1075,7 @@
   // superclass.method, which can also resolve to a default method
   // and the selected method is recalculated relative to the direct superclass
   // superinterface.method, which explicitly does not check shadowing
-  KlassHandle resolved_klass = link_info.resolved_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
   methodHandle resolved_method;
 
   if (!resolved_klass->is_interface()) {
@@ -1089,7 +1086,7 @@
 
   // check if method name is <init>, that it is found in same klass as static type
   if (resolved_method->name() == vmSymbols::object_initializer_name() &&
-      resolved_method->method_holder() != resolved_klass()) {
+      resolved_method->method_holder() != resolved_klass) {
     ResourceMark rm(THREAD);
     Exceptions::fthrow(
       THREAD_AND_LOCATION,
@@ -1103,24 +1100,25 @@
   }
 
   // check if invokespecial's interface method reference is in an indirect superinterface
-  KlassHandle current_klass = link_info.current_klass();
-  if (!current_klass.is_null() && resolved_klass->is_interface()) {
-    Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
-                                  current_klass() :
-                                  InstanceKlass::cast(current_klass())->host_klass();
+  Klass* current_klass = link_info.current_klass();
+  if (current_klass != NULL && resolved_klass->is_interface()) {
+    InstanceKlass* ck = InstanceKlass::cast(current_klass);
+    InstanceKlass *klass_to_check = !ck->is_anonymous() ?
+                                    ck :
+                                    InstanceKlass::cast(ck->host_klass());
     // Disable verification for the dynamically-generated reflection bytecodes.
     bool is_reflect = klass_to_check->is_subclass_of(
                         SystemDictionary::reflect_MagicAccessorImpl_klass());
 
     if (!is_reflect &&
-        !InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
+        !klass_to_check->is_same_or_direct_interface(resolved_klass)) {
       ResourceMark rm(THREAD);
       char buf[200];
       jio_snprintf(buf, sizeof(buf),
                    "Interface method reference: %s, is in an indirect superinterface of %s",
-                   Method::name_and_sig_as_C_string(resolved_klass(),
-                                                         resolved_method->name(),
-                                                         resolved_method->signature()),
+                   Method::name_and_sig_as_C_string(resolved_klass,
+                                                    resolved_method->name(),
+                                                    resolved_method->signature()),
                    current_klass->external_name());
       THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
     }
@@ -1132,7 +1130,7 @@
     char buf[200];
     jio_snprintf(buf, sizeof(buf),
                  "Expecting non-static method %s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
@@ -1149,8 +1147,8 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_special_method(CallInfo& result,
                                                   const methodHandle& resolved_method,
-                                                  KlassHandle resolved_klass,
-                                                  KlassHandle current_klass,
+                                                  Klass* resolved_klass,
+                                                  Klass* current_klass,
                                                   bool check_access, TRAPS) {
 
   // resolved method is selected method unless we have an old-style lookup
@@ -1160,33 +1158,29 @@
   methodHandle sel_method(THREAD, resolved_method());
 
   // check if this is an old-style super call and do a new lookup if so
-  { KlassHandle method_klass  = KlassHandle(THREAD,
-                                            resolved_method->method_holder());
-
-    if (check_access &&
-        // a) check if ACC_SUPER flag is set for the current class
-        (current_klass->is_super() || !AllowNonVirtualCalls) &&
-        // b) check if the class of the resolved_klass is a superclass
-        // (not supertype in order to exclude interface classes) of the current class.
-        // This check is not performed for super.invoke for interface methods
-        // in super interfaces.
-        current_klass->is_subclass_of(resolved_klass()) &&
-        current_klass() != resolved_klass() &&
-        // c) check if the method is not <init>
-        resolved_method->name() != vmSymbols::object_initializer_name()) {
-      // Lookup super method
-      KlassHandle super_klass(THREAD, current_klass->super());
-      sel_method = lookup_instance_method_in_klasses(super_klass,
-                           resolved_method->name(),
-                           resolved_method->signature(), CHECK);
-      // check if found
-      if (sel_method.is_null()) {
-        ResourceMark rm(THREAD);
-        THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-                  Method::name_and_sig_as_C_string(resolved_klass(),
-                                            resolved_method->name(),
-                                            resolved_method->signature()));
-      }
+  if (check_access &&
+      // a) check if ACC_SUPER flag is set for the current class
+      (current_klass->is_super() || !AllowNonVirtualCalls) &&
+      // b) check if the class of the resolved_klass is a superclass
+      // (not supertype in order to exclude interface classes) of the current class.
+      // This check is not performed for super.invoke for interface methods
+      // in super interfaces.
+      current_klass->is_subclass_of(resolved_klass) &&
+      current_klass != resolved_klass &&
+      // c) check if the method is not <init>
+      resolved_method->name() != vmSymbols::object_initializer_name()) {
+    // Lookup super method
+    Klass* super_klass = current_klass->super();
+    sel_method = lookup_instance_method_in_klasses(super_klass,
+                         resolved_method->name(),
+                         resolved_method->signature(), CHECK);
+    // check if found
+    if (sel_method.is_null()) {
+      ResourceMark rm(THREAD);
+      THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
+                Method::name_and_sig_as_C_string(resolved_klass,
+                                          resolved_method->name(),
+                                          resolved_method->signature()));
     }
   }
 
@@ -1194,9 +1188,9 @@
   if (sel_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
-                                                                                                             resolved_method->name(),
-                                                                                                             resolved_method->signature()));
+    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass,
+                                                                                      resolved_method->name(),
+                                                                                      resolved_method->signature()));
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1204,7 +1198,7 @@
   if (sel_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
+              Method::name_and_sig_as_C_string(resolved_klass,
                                                sel_method->name(),
                                                sel_method->signature()));
   }
@@ -1218,7 +1212,7 @@
   result.set_static(resolved_klass, sel_method, CHECK);
 }
 
-void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass,
+void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, Klass* receiver_klass,
                                         const LinkInfo& link_info,
                                         bool check_null_and_abstract, TRAPS) {
   methodHandle resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
@@ -1238,18 +1232,18 @@
   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
 
   // check if private interface method
-  KlassHandle resolved_klass = link_info.resolved_klass();
-  KlassHandle current_klass = link_info.current_klass();
+  Klass* resolved_klass = link_info.resolved_klass();
+  Klass* current_klass = link_info.current_klass();
 
   // This is impossible, if resolve_klass is an interface, we've thrown icce in resolve_method
   if (resolved_klass->is_interface() && resolved_method->is_private()) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokevirtual: method %s, caller-class:%s",
-                 Method::name_and_sig_as_C_string(resolved_klass(),
+                 Method::name_and_sig_as_C_string(resolved_klass,
                                                   resolved_method->name(),
                                                   resolved_method->signature()),
-                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
+                   (current_klass == NULL ? "<NULL>" : current_klass->internal_name()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1257,9 +1251,9 @@
   if (resolved_method->is_static()) {
     ResourceMark rm(THREAD);
     char buf[200];
-    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
-                                                                                                             resolved_method->name(),
-                                                                                                             resolved_method->signature()));
+    jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass,
+                                                                                           resolved_method->name(),
+                                                                                           resolved_method->signature()));
     THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1274,9 +1268,9 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
                                                   const methodHandle& resolved_method,
-                                                  KlassHandle resolved_klass,
+                                                  Klass* resolved_klass,
                                                   Handle recv,
-                                                  KlassHandle recv_klass,
+                                                  Klass* recv_klass,
                                                   bool check_null_and_abstract,
                                                   TRAPS) {
 
@@ -1325,18 +1319,18 @@
   if (selected_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      resolved_method->name(),
-                                                      resolved_method->signature()));
+              Method::name_and_sig_as_C_string(resolved_klass,
+                                               resolved_method->name(),
+                                               resolved_method->signature()));
   }
 
   // check if abstract
   if (check_null_and_abstract && selected_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      selected_method->name(),
-                                                      selected_method->signature()));
+              Method::name_and_sig_as_C_string(resolved_klass,
+                                               selected_method->name(),
+                                               selected_method->signature()));
   }
 
   if (log_develop_is_enabled(Trace, vtables)) {
@@ -1348,7 +1342,7 @@
   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
 }
 
-void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass,
                                           const LinkInfo& link_info,
                                           bool check_null_and_abstract, TRAPS) {
   // throws linktime exceptions
@@ -1370,9 +1364,9 @@
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
                                                     const methodHandle& resolved_method,
-                                                    KlassHandle resolved_klass,
+                                                    Klass* resolved_klass,
                                                     Handle recv,
-                                                    KlassHandle recv_klass,
+                                                    Klass* recv_klass,
                                                     bool check_null_and_abstract, TRAPS) {
   // check if receiver exists
   if (check_null_and_abstract && recv.is_null()) {
@@ -1380,12 +1374,12 @@
   }
 
   // check if receiver klass implements the resolved interface
-  if (!recv_klass->is_subtype_of(resolved_klass())) {
+  if (!recv_klass->is_subtype_of(resolved_klass)) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
-                 recv_klass()->external_name(),
-                 resolved_klass()->external_name());
+                 recv_klass->external_name(),
+                 resolved_klass->external_name());
     THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
@@ -1405,7 +1399,7 @@
   if (sel_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-                   Method::name_and_sig_as_C_string(recv_klass(),
+                   Method::name_and_sig_as_C_string(recv_klass,
                                                     resolved_method->name(),
                                                     resolved_method->signature()));
   }
@@ -1414,7 +1408,7 @@
   if (!sel_method->is_public()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
-              Method::name_and_sig_as_C_string(recv_klass(),
+              Method::name_and_sig_as_C_string(recv_klass,
                                                sel_method->name(),
                                                sel_method->signature()));
   }
@@ -1422,9 +1416,9 @@
   if (check_null_and_abstract && sel_method->is_abstract()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(recv_klass(),
-                                                      sel_method->name(),
-                                                      sel_method->signature()));
+              Method::name_and_sig_as_C_string(recv_klass,
+                                               sel_method->name(),
+                                               sel_method->signature()));
   }
 
   if (log_develop_is_enabled(Trace, itables)) {
@@ -1468,7 +1462,7 @@
 }
 
 methodHandle LinkResolver::resolve_virtual_call_or_null(
-                                                 KlassHandle receiver_klass,
+                                                 Klass* receiver_klass,
                                                  const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1481,7 +1475,7 @@
 }
 
 methodHandle LinkResolver::resolve_interface_call_or_null(
-                                                 KlassHandle receiver_klass,
+                                                 Klass* receiver_klass,
                                                  const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1493,7 +1487,7 @@
   return info.selected_method();
 }
 
-int LinkResolver::resolve_virtual_vtable_index(KlassHandle receiver_klass,
+int LinkResolver::resolve_virtual_vtable_index(Klass* receiver_klass,
                                                const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
@@ -1548,7 +1542,7 @@
 void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
                              const methodHandle& attached_method,
                              Bytecodes::Code byte, TRAPS) {
-  KlassHandle defc = attached_method->method_holder();
+  Klass* defc = attached_method->method_holder();
   Symbol* name = attached_method->name();
   Symbol* type = attached_method->signature();
   LinkInfo link_info(defc, name, type);
@@ -1589,14 +1583,14 @@
                                           TRAPS) {
 
   LinkInfo link_info(pool, index, CHECK);
-  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
+  Klass* recvrKlass = recv.is_null() ? (Klass*)NULL : recv->klass();
   resolve_virtual_call(result, recv, recvrKlass, link_info, /*check_null_or_abstract*/true, CHECK);
 }
 
 
 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, TRAPS) {
   LinkInfo link_info(pool, index, CHECK);
-  KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
+  Klass* recvrKlass = recv.is_null() ? (Klass*)NULL : recv->klass();
   resolve_interface_call(result, recv, recvrKlass, link_info, true, CHECK);
 }
 
@@ -1616,9 +1610,9 @@
                                        const LinkInfo& link_info,
                                        TRAPS) {
   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
-  KlassHandle resolved_klass = link_info.resolved_klass();
-  assert(resolved_klass() == SystemDictionary::MethodHandle_klass() ||
-         resolved_klass() == SystemDictionary::VarHandle_klass(), "");
+  Klass* resolved_klass = link_info.resolved_klass();
+  assert(resolved_klass == SystemDictionary::MethodHandle_klass() ||
+         resolved_klass == SystemDictionary::VarHandle_klass(), "");
   assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
   Handle       resolved_appendix;
   Handle       resolved_method_type;
@@ -1655,7 +1649,7 @@
 void LinkResolver::resolve_invokedynamic(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) {
   Symbol* method_name       = pool->name_ref_at(index);
   Symbol* method_signature  = pool->signature_ref_at(index);
-  KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
+  Klass* current_klass = pool->pool_holder();
 
   // Resolve the bootstrap specifier (BSM + optional arguments).
   Handle bootstrap_specifier;
@@ -1693,7 +1687,7 @@
 void LinkResolver::resolve_dynamic_call(CallInfo& result,
                                         Handle bootstrap_specifier,
                                         Symbol* method_name, Symbol* method_signature,
-                                        KlassHandle current_klass,
+                                        Klass* current_klass,
                                         TRAPS) {
   // JSR 292:  this must resolve to an implicitly generated method MH.linkToCallSite(*...)
   // The appendix argument is likely to be a freshly-created CallSite.
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -47,8 +47,8 @@
     unknown_kind = -1
   };
  private:
-  KlassHandle  _resolved_klass;         // static receiver klass, resolved from a symbolic reference
-  KlassHandle  _selected_klass;         // dynamic receiver class (same as static, or subklass)
+  Klass*       _resolved_klass;         // static receiver klass, resolved from a symbolic reference
+  Klass*       _selected_klass;         // dynamic receiver class (same as static, or subklass)
   methodHandle _resolved_method;        // static target method
   methodHandle _selected_method;        // dynamic (actual) target method
   CallKind     _call_kind;              // kind of call (static(=bytecode static/special +
@@ -57,21 +57,21 @@
   Handle       _resolved_appendix;      // extra argument in constant pool (if CPCE::has_appendix)
   Handle       _resolved_method_type;   // MethodType (for invokedynamic and invokehandle call sites)
 
-  void set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS);
-  void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass,
+  void set_static(Klass* resolved_klass, const methodHandle& resolved_method, TRAPS);
+  void set_interface(Klass* resolved_klass, Klass* selected_klass,
                      const methodHandle& resolved_method,
                      const methodHandle& selected_method,
                      int itable_index, TRAPS);
-  void set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass,
+  void set_virtual(Klass* resolved_klass, Klass* selected_klass,
                    const methodHandle& resolved_method,
                    const methodHandle& selected_method,
                    int vtable_index, TRAPS);
   void set_handle(const methodHandle& resolved_method,
                   Handle resolved_appendix, Handle resolved_method_type, TRAPS);
-  void set_handle(KlassHandle resolved_klass,
+  void set_handle(Klass* resolved_klass,
                   const methodHandle& resolved_method,
                   Handle resolved_appendix, Handle resolved_method_type, TRAPS);
-  void set_common(KlassHandle resolved_klass, KlassHandle selected_klass,
+  void set_common(Klass* resolved_klass, Klass* selected_klass,
                   const methodHandle& resolved_method,
                   const methodHandle& selected_method,
                   CallKind kind,
@@ -91,8 +91,8 @@
   // does not queue the method for compilation
   CallInfo(Method* resolved_method, Klass* resolved_klass = NULL);
 
-  KlassHandle  resolved_klass() const            { return _resolved_klass; }
-  KlassHandle  selected_klass() const            { return _selected_klass; }
+  Klass*  resolved_klass() const                 { return _resolved_klass; }
+  Klass*  selected_klass() const                 { return _selected_klass; }
   methodHandle resolved_method() const           { return _resolved_method; }
   methodHandle selected_method() const           { return _selected_method; }
   Handle       resolved_appendix() const         { return _resolved_appendix; }
@@ -135,8 +135,8 @@
 class LinkInfo : public StackObj {
   Symbol*     _name;            // extracted from JVM_CONSTANT_NameAndType
   Symbol*     _signature;
-  KlassHandle _resolved_klass;  // class that the constant pool entry points to
-  KlassHandle _current_klass;   // class that owns the constant pool
+  Klass*      _resolved_klass;  // class that the constant pool entry points to
+  Klass*      _current_klass;   // class that owns the constant pool
   methodHandle _current_method;  // sending method
   bool        _check_access;
   constantTag _tag;
@@ -151,14 +151,14 @@
   LinkInfo(const constantPoolHandle& pool, int index, TRAPS);
 
   // Condensed information from other call sites within the vm.
-  LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, KlassHandle current_klass,
+  LinkInfo(Klass* resolved_klass, Symbol* name, Symbol* signature, Klass* current_klass,
            AccessCheck check_access = needs_access_check,
            constantTag tag = JVM_CONSTANT_Invalid) :
     _resolved_klass(resolved_klass),
-    _name(name), _signature(signature), _current_klass(current_klass), _current_method(NULL),
+    _name(name), _signature(signature), _current_klass(current_klass), _current_method(methodHandle()),
     _check_access(check_access == needs_access_check), _tag(tag) {}
 
-  LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, methodHandle current_method,
+  LinkInfo(Klass* resolved_klass, Symbol* name, Symbol* signature, methodHandle current_method,
            AccessCheck check_access = needs_access_check,
            constantTag tag = JVM_CONSTANT_Invalid) :
     _resolved_klass(resolved_klass),
@@ -166,16 +166,16 @@
     _check_access(check_access == needs_access_check), _tag(tag) {}
 
   // Case where we just find the method and don't check access against the current class
-  LinkInfo(KlassHandle resolved_klass, Symbol*name, Symbol* signature) :
+  LinkInfo(Klass* resolved_klass, Symbol*name, Symbol* signature) :
     _resolved_klass(resolved_klass),
-    _name(name), _signature(signature), _current_klass(NULL), _current_method(NULL),
+    _name(name), _signature(signature), _current_klass(NULL), _current_method(methodHandle()),
     _check_access(false), _tag(JVM_CONSTANT_Invalid) {}
 
   // accessors
   Symbol* name() const               { return _name; }
   Symbol* signature() const          { return _signature; }
-  KlassHandle resolved_klass() const { return _resolved_klass; }
-  KlassHandle current_klass() const  { return _current_klass; }
+  Klass* resolved_klass() const      { return _resolved_klass; }
+  Klass* current_klass() const       { return _current_klass; }
   methodHandle current_method() const { return _current_method; }
   constantTag tag() const            { return _tag; }
   bool check_access() const          { return _check_access; }
@@ -206,7 +206,7 @@
  JVMCI_ONLY(public:) // Needed for CompilerToVM.resolveMethod()
   // Not Linktime so doesn't take LinkInfo
   static methodHandle lookup_instance_method_in_klasses (
-                                       KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
+                                       Klass* klass, Symbol* name, Symbol* signature, TRAPS);
  JVMCI_ONLY(private:)
 
   // Similar loader constraint checking functions that throw
@@ -215,8 +215,8 @@
                                               const methodHandle& resolved_method,
                                               const char* method_type, TRAPS);
   static void check_field_loader_constraints(Symbol* field, Symbol* sig,
-                                             KlassHandle current_klass,
-                                             KlassHandle sel_klass, TRAPS);
+                                             Klass* current_klass,
+                                             Klass* sel_klass, TRAPS);
 
   static methodHandle resolve_interface_method(const LinkInfo& link_info, Bytecodes::Code code, TRAPS);
   static methodHandle resolve_method          (const LinkInfo& link_info, Bytecodes::Code code, TRAPS);
@@ -228,29 +228,29 @@
 
   static void runtime_resolve_special_method    (CallInfo& result,
                                                  const methodHandle& resolved_method,
-                                                 KlassHandle resolved_klass,
-                                                 KlassHandle current_klass,
+                                                 Klass* resolved_klass,
+                                                 Klass* current_klass,
                                                  bool check_access, TRAPS);
   static void runtime_resolve_virtual_method    (CallInfo& result,
                                                  const methodHandle& resolved_method,
-                                                 KlassHandle resolved_klass,
+                                                 Klass* resolved_klass,
                                                  Handle recv,
-                                                 KlassHandle recv_klass,
+                                                 Klass* recv_klass,
                                                  bool check_null_and_abstract, TRAPS);
   static void runtime_resolve_interface_method  (CallInfo& result,
                                                  const methodHandle& resolved_method,
-                                                 KlassHandle resolved_klass,
+                                                 Klass* resolved_klass,
                                                  Handle recv,
-                                                 KlassHandle recv_klass,
+                                                 Klass* recv_klass,
                                                  bool check_null_and_abstract, TRAPS);
 
-  static void check_field_accessability(KlassHandle ref_klass,
-                                        KlassHandle resolved_klass,
-                                        KlassHandle sel_klass,
+  static void check_field_accessability(Klass* ref_klass,
+                                        Klass* resolved_klass,
+                                        Klass* sel_klass,
                                         const fieldDescriptor& fd, TRAPS);
-  static void check_method_accessability(KlassHandle ref_klass,
-                                         KlassHandle resolved_klass,
-                                         KlassHandle sel_klass,
+  static void check_method_accessability(Klass* ref_klass,
+                                         Klass* resolved_klass,
+                                         Klass* sel_klass,
                                          const methodHandle& sel_method, TRAPS);
 
   // runtime resolving from constant pool
@@ -268,7 +268,7 @@
                                       const constantPoolHandle& pool, int index, TRAPS);
  public:
   // constant pool resolving
-  static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS);
+  static void check_klass_accessability(Klass* ref_klass, Klass* sel_klass, TRAPS);
 
   // static resolving calls (will not run any Java code);
   // used only from Bytecode_invoke::static_target
@@ -291,31 +291,31 @@
   static void resolve_special_call  (CallInfo& result,
                                      const LinkInfo& link_info,
                                      TRAPS);
-  static void resolve_virtual_call  (CallInfo& result, Handle recv, KlassHandle recv_klass,
+  static void resolve_virtual_call  (CallInfo& result, Handle recv, Klass* recv_klass,
                                      const LinkInfo& link_info,
                                      bool check_null_and_abstract, TRAPS);
-  static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+  static void resolve_interface_call(CallInfo& result, Handle recv, Klass* recv_klass,
                                      const LinkInfo& link_info,
                                      bool check_null_and_abstract, TRAPS);
   static void resolve_handle_call   (CallInfo& result,
                                      const LinkInfo& link_info, TRAPS);
   static void resolve_dynamic_call  (CallInfo& result, Handle bootstrap_specifier,
                                      Symbol* method_name, Symbol* method_signature,
-                                     KlassHandle current_klass, TRAPS);
+                                     Klass* current_klass, TRAPS);
 
   // same as above for compile-time resolution; but returns null handle instead of throwing
   // an exception on error also, does not initialize klass (i.e., no side effects)
-  static methodHandle resolve_virtual_call_or_null  (KlassHandle receiver_klass,
+  static methodHandle resolve_virtual_call_or_null  (Klass* receiver_klass,
                                                      const LinkInfo& link_info);
-  static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass,
+  static methodHandle resolve_interface_call_or_null(Klass* receiver_klass,
                                                      const LinkInfo& link_info);
   static methodHandle resolve_static_call_or_null   (const LinkInfo& link_info);
   static methodHandle resolve_special_call_or_null  (const LinkInfo& link_info);
 
-  static int vtable_index_of_interface_method(KlassHandle klass, const methodHandle& resolved_method);
+  static int vtable_index_of_interface_method(Klass* klass, const methodHandle& resolved_method);
 
   // same as above for compile-time resolution; returns vtable_index if current_klass if linked
-  static int resolve_virtual_vtable_index  (KlassHandle receiver_klass,
+  static int resolve_virtual_vtable_index  (Klass* receiver_klass,
                                             const LinkInfo& link_info);
 
   // static resolving for compiler (does not throw exceptions, returns null handle if unsuccessful)
--- a/hotspot/src/share/vm/interpreter/rewriter.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/rewriter.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, 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
@@ -544,16 +544,16 @@
   patch_invokedynamic_bytecodes();
 }
 
-void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) {
+void Rewriter::rewrite(InstanceKlass* klass, TRAPS) {
   if (!DumpSharedSpaces) {
-    assert(!MetaspaceShared::is_in_shared_space(klass()), "archive methods must not be rewritten at run time");
+    assert(!MetaspaceShared::is_in_shared_space(klass), "archive methods must not be rewritten at run time");
   }
   ResourceMark rm(THREAD);
   Rewriter     rw(klass, klass->constants(), klass->methods(), CHECK);
   // (That's all, folks.)
 }
 
-Rewriter::Rewriter(instanceKlassHandle klass, const constantPoolHandle& cpool, Array<Method*>* methods, TRAPS)
+Rewriter::Rewriter(InstanceKlass* klass, const constantPoolHandle& cpool, Array<Method*>* methods, TRAPS)
   : _klass(klass),
     _pool(cpool),
     _methods(methods),
--- a/hotspot/src/share/vm/interpreter/rewriter.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/interpreter/rewriter.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, 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
@@ -34,7 +34,7 @@
 
 class Rewriter: public StackObj {
  private:
-  instanceKlassHandle _klass;
+  InstanceKlass*      _klass;
   constantPoolHandle  _pool;
   Array<Method*>*     _methods;
   GrowableArray<int>  _cp_map;
@@ -188,7 +188,7 @@
   }
 
   // All the work goes in here:
-  Rewriter(instanceKlassHandle klass, const constantPoolHandle& cpool, Array<Method*>* methods, TRAPS);
+  Rewriter(InstanceKlass* klass, const constantPoolHandle& cpool, Array<Method*>* methods, TRAPS);
 
   void compute_index_maps();
   void make_constant_pool_cache(TRAPS);
@@ -211,7 +211,7 @@
   static methodHandle rewrite_jsrs(methodHandle m, TRAPS);
  public:
   // Driver routine:
-  static void rewrite(instanceKlassHandle klass, TRAPS);
+  static void rewrite(InstanceKlass* klass, TRAPS);
 };
 
 #endif // SHARE_VM_INTERPRETER_REWRITER_HPP
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -77,8 +77,8 @@
   return NULL;
 }
 
-oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) {
-  if (klass() != NULL) {
+oop CompilerToVM::get_jvmci_type(Klass* klass, TRAPS) {
+  if (klass != NULL) {
     JavaValue result(T_OBJECT);
     JavaCallArguments args;
     args.push_oop(Handle(THREAD, klass->java_mirror()));
@@ -678,7 +678,7 @@
 }
 
 C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
-  KlassHandle klass;
+  Klass* klass = NULL;
   oop base_object = JNIHandles::resolve(base);
   jlong base_address = 0;
   if (base_object != NULL && offset == oopDesc::klass_offset_in_bytes()) {
@@ -703,7 +703,7 @@
     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
                 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", base_object->klass()->external_name(), offset, compressed ? "true" : "false"));
   }
-  assert (klass.is_null() || klass->is_klass(), "invalid read");
+  assert (klass == NULL || klass->is_klass(), "invalid read");
   oop result = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   return JNIHandles::make_local(THREAD, result);
 }
@@ -711,7 +711,7 @@
 C2V_VMENTRY(jobject, findUniqueConcreteMethod, (JNIEnv *, jobject, jobject jvmci_type, jobject jvmci_method))
   ResourceMark rm;
   methodHandle method = CompilerToVM::asMethod(jvmci_method);
-  KlassHandle holder = CompilerToVM::asKlass(jvmci_type);
+  Klass* holder = CompilerToVM::asKlass(jvmci_type);
   if (holder->is_interface()) {
     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Interface %s should be handled in Java code", holder->external_name()));
   }
@@ -719,7 +719,7 @@
   methodHandle ucm;
   {
     MutexLocker locker(Compile_lock);
-    ucm = Dependencies::find_unique_concrete_method(holder(), method());
+    ucm = Dependencies::find_unique_concrete_method(holder, method());
   }
   oop result = CompilerToVM::get_jvmci_method(ucm, CHECK_NULL);
   return JNIHandles::make_local(THREAD, result);
@@ -848,15 +848,15 @@
 
 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
-  KlassHandle loading_klass(cp->pool_holder());
+  Klass* loading_klass = cp->pool_holder();
   bool is_accessible = false;
-  KlassHandle klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass);
+  Klass* klass = JVMCIEnv::get_klass_by_index(cp, index, is_accessible, loading_klass);
   Symbol* symbol = NULL;
-  if (klass.is_null()) {
+  if (klass == NULL) {
     symbol = cp->klass_name_at(index);
   }
   oop result_oop;
-  if (!klass.is_null()) {
+  if (klass != NULL) {
     result_oop = CompilerToVM::get_jvmci_type(klass, CHECK_NULL);
   } else {
     Handle result = java_lang_String::create_from_symbol(symbol, CHECK_NULL);
@@ -873,7 +873,7 @@
 
 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
-  instanceKlassHandle pool_holder(cp->pool_holder());
+  InstanceKlass* pool_holder = cp->pool_holder();
   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
   methodHandle method = JVMCIEnv::get_method_by_index(cp, index, bc, pool_holder);
   oop result = CompilerToVM::get_jvmci_method(method, CHECK_NULL);
@@ -920,11 +920,11 @@
 C2V_END
 
 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
-  KlassHandle recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
-  KlassHandle caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
+  Klass* recv_klass = CompilerToVM::asKlass(receiver_jvmci_type);
+  Klass* caller_klass = CompilerToVM::asKlass(caller_jvmci_type);
   methodHandle method = CompilerToVM::asMethod(jvmci_method);
 
-  KlassHandle h_resolved   (THREAD, method->method_holder());
+  Klass* resolved     = method->method_holder();
   Symbol* h_name      = method->name();
   Symbol* h_signature = method->signature();
 
@@ -933,13 +933,13 @@
       return NULL;
   }
 
-  LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass);
+  LinkInfo link_info(resolved, h_name, h_signature, caller_klass);
   methodHandle m;
   // Only do exact lookup if receiver klass has been linked.  Otherwise,
   // the vtable has not been setup, and the LinkResolver will fail.
   if (recv_klass->is_array_klass() ||
-      InstanceKlass::cast(recv_klass())->is_linked() && !recv_klass->is_interface()) {
-    if (h_resolved->is_interface()) {
+      InstanceKlass::cast(recv_klass)->is_linked() && !recv_klass->is_interface()) {
+    if (resolved->is_interface()) {
       m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
     } else {
       m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
@@ -1482,12 +1482,12 @@
 
 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv*, jobject, jobject jvmci_constant_pool, jint index))
   constantPoolHandle cp = CompilerToVM::asConstantPool(jvmci_constant_pool);
-  KlassHandle holder = cp->klass_ref_at(index, CHECK);
+  Klass* holder = cp->klass_ref_at(index, CHECK);
   Symbol* name = cp->name_ref_at(index);
-  if (MethodHandles::is_signature_polymorphic_name(holder(), name)) {
+  if (MethodHandles::is_signature_polymorphic_name(holder, name)) {
     CallInfo callInfo;
     LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
-    ConstantPoolCacheEntry* cp_cache_entry = cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
+    ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
     cp_cache_entry->set_method_handle(cp, callInfo);
   }
 C2V_END
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -161,7 +161,7 @@
 
   static oop get_jvmci_method(const methodHandle& method, TRAPS);
 
-  static oop get_jvmci_type(KlassHandle klass, TRAPS);
+  static oop get_jvmci_type(Klass* klass, TRAPS);
 };
 
 class JavaArgumentUnboxer : public SignatureIterator {
--- a/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/jvmci/jvmciEnv.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -65,9 +65,9 @@
 // ------------------------------------------------------------------
 // Note: the logic of this method should mirror the logic of
 // constantPoolOopDesc::verify_constant_pool_resolve.
-bool JVMCIEnv::check_klass_accessibility(KlassHandle accessing_klass, KlassHandle resolved_klass) {
+bool JVMCIEnv::check_klass_accessibility(Klass* accessing_klass, Klass* resolved_klass) {
   if (accessing_klass->is_objArray_klass()) {
-    accessing_klass = ObjArrayKlass::cast(accessing_klass())->bottom_klass();
+    accessing_klass = ObjArrayKlass::cast(accessing_klass)->bottom_klass();
   }
   if (!accessing_klass->is_instance_klass()) {
     return true;
@@ -75,21 +75,21 @@
 
   if (resolved_klass->is_objArray_klass()) {
     // Find the element klass, if this is an array.
-    resolved_klass = ObjArrayKlass::cast(resolved_klass())->bottom_klass();
+    resolved_klass = ObjArrayKlass::cast(resolved_klass)->bottom_klass();
   }
   if (resolved_klass->is_instance_klass()) {
     Reflection::VerifyClassAccessResults result =
-      Reflection::verify_class_access(accessing_klass(), InstanceKlass::cast(resolved_klass()), true);
+      Reflection::verify_class_access(accessing_klass, InstanceKlass::cast(resolved_klass), true);
     return result == Reflection::ACCESS_OK;
   }
   return true;
 }
 
 // ------------------------------------------------------------------
-KlassHandle JVMCIEnv::get_klass_by_name_impl(KlassHandle& accessing_klass,
-                                          const constantPoolHandle& cpool,
-                                          Symbol* sym,
-                                          bool require_local) {
+Klass* JVMCIEnv::get_klass_by_name_impl(Klass* accessing_klass,
+                                        const constantPoolHandle& cpool,
+                                        Symbol* sym,
+                                        bool require_local) {
   JVMCI_EXCEPTION_CONTEXT;
 
   // Now we need to check the SystemDictionary
@@ -99,28 +99,26 @@
     // Call recursive to keep scope of strippedsym.
     TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1,
                     sym->utf8_length()-2,
-                    CHECK_(KlassHandle()));
+                    CHECK_NULL);
     return get_klass_by_name_impl(accessing_klass, cpool, strippedsym, require_local);
   }
 
   Handle loader(THREAD, (oop)NULL);
   Handle domain(THREAD, (oop)NULL);
-  if (!accessing_klass.is_null()) {
+  if (accessing_klass != NULL) {
     loader = Handle(THREAD, accessing_klass->class_loader());
     domain = Handle(THREAD, accessing_klass->protection_domain());
   }
 
-  KlassHandle found_klass;
+  Klass* found_klass = NULL;
   {
     ttyUnlocker ttyul;  // release tty lock to avoid ordering problems
     MutexLocker ml(Compile_lock);
-    Klass*  kls;
     if (!require_local) {
-      kls = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader, CHECK_(KlassHandle()));
+      found_klass = SystemDictionary::find_constrained_instance_or_array_klass(sym, loader, CHECK_NULL);
     } else {
-      kls = SystemDictionary::find_instance_or_array_klass(sym, loader, domain, CHECK_(KlassHandle()));
+      found_klass = SystemDictionary::find_instance_or_array_klass(sym, loader, domain, CHECK_NULL);
     }
-    found_klass = KlassHandle(THREAD, kls);
   }
 
   // If we fail to find an array klass, look again for its element type.
@@ -135,21 +133,21 @@
     // Build it on the fly if the element class exists.
     TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1,
                                                  sym->utf8_length()-1,
-                                                 CHECK_(KlassHandle()));
+                                                 CHECK_NULL);
 
     // Get element Klass recursively.
-    KlassHandle elem_klass =
+    Klass* elem_klass =
       get_klass_by_name_impl(accessing_klass,
                              cpool,
                              elem_sym,
                              require_local);
-    if (!elem_klass.is_null()) {
+    if (elem_klass != NULL) {
       // Now make an array for it
-      return elem_klass->array_klass(CHECK_(KlassHandle()));
+      return elem_klass->array_klass(CHECK_NULL);
     }
   }
 
-  if (found_klass.is_null() && !cpool.is_null() && cpool->has_preresolution()) {
+  if (found_klass == NULL && !cpool.is_null() && cpool->has_preresolution()) {
     // Look inside the constant pool for pre-resolved class entries.
     for (int i = cpool->length() - 1; i >= 1; i--) {
       if (cpool->tag_at(i).is_klass()) {
@@ -161,45 +159,45 @@
     }
   }
 
-  return found_klass();
+  return found_klass;
 }
 
 // ------------------------------------------------------------------
-KlassHandle JVMCIEnv::get_klass_by_name(KlassHandle accessing_klass,
+Klass* JVMCIEnv::get_klass_by_name(Klass* accessing_klass,
                                   Symbol* klass_name,
                                   bool require_local) {
   ResourceMark rm;
   constantPoolHandle cpool;
   return get_klass_by_name_impl(accessing_klass,
-                                                 cpool,
-                                                 klass_name,
-                                                 require_local);
+                                cpool,
+                                klass_name,
+                                require_local);
 }
 
 // ------------------------------------------------------------------
 // Implementation of get_klass_by_index.
-KlassHandle JVMCIEnv::get_klass_by_index_impl(const constantPoolHandle& cpool,
+Klass* JVMCIEnv::get_klass_by_index_impl(const constantPoolHandle& cpool,
                                         int index,
                                         bool& is_accessible,
-                                        KlassHandle accessor) {
+                                        Klass* accessor) {
   JVMCI_EXCEPTION_CONTEXT;
-  KlassHandle klass (THREAD, ConstantPool::klass_at_if_loaded(cpool, index));
+  Klass* klass = ConstantPool::klass_at_if_loaded(cpool, index);
   Symbol* klass_name = NULL;
-  if (klass.is_null()) {
+  if (klass == NULL) {
     klass_name = cpool->klass_name_at(index);
   }
 
-  if (klass.is_null()) {
+  if (klass == NULL) {
     // Not found in constant pool.  Use the name to do the lookup.
-    KlassHandle k = get_klass_by_name_impl(accessor,
-                                        cpool,
-                                        klass_name,
-                                        false);
+    Klass* k = get_klass_by_name_impl(accessor,
+                                      cpool,
+                                      klass_name,
+                                      false);
     // Calculate accessibility the hard way.
-    if (k.is_null()) {
+    if (k == NULL) {
       is_accessible = false;
     } else if (k->class_loader() != accessor->class_loader() &&
-               get_klass_by_name_impl(accessor, cpool, k->name(), true).is_null()) {
+               get_klass_by_name_impl(accessor, cpool, k->name(), true) == NULL) {
       // Loaded only remotely.  Not linked yet.
       is_accessible = false;
     } else {
@@ -207,7 +205,7 @@
       is_accessible = check_klass_accessibility(accessor, k);
     }
     if (!is_accessible) {
-      return KlassHandle();
+      return NULL;
     }
     return k;
   }
@@ -219,13 +217,12 @@
 
 // ------------------------------------------------------------------
 // Get a klass from the constant pool.
-KlassHandle JVMCIEnv::get_klass_by_index(const constantPoolHandle& cpool,
-                                   int index,
-                                   bool& is_accessible,
-                                   KlassHandle accessor) {
+Klass* JVMCIEnv::get_klass_by_index(const constantPoolHandle& cpool,
+                                    int index,
+                                    bool& is_accessible,
+                                    Klass* accessor) {
   ResourceMark rm;
-  KlassHandle result = get_klass_by_index_impl(cpool, index, is_accessible, accessor);
-  return result;
+  return get_klass_by_index_impl(cpool, index, is_accessible, accessor);
 }
 
 // ------------------------------------------------------------------
@@ -233,7 +230,7 @@
 //
 // Implementation note: the results of field lookups are cached
 // in the accessor klass.
-void JVMCIEnv::get_field_by_index_impl(instanceKlassHandle klass, fieldDescriptor& field_desc,
+void JVMCIEnv::get_field_by_index_impl(InstanceKlass* klass, fieldDescriptor& field_desc,
                                         int index) {
   JVMCI_EXCEPTION_CONTEXT;
 
@@ -251,9 +248,9 @@
   // Get the field's declared holder.
   int holder_index = cpool->klass_ref_index_at(index);
   bool holder_is_accessible;
-  KlassHandle declared_holder = get_klass_by_index(cpool, holder_index,
-                                               holder_is_accessible,
-                                               klass);
+  Klass* declared_holder = get_klass_by_index(cpool, holder_index,
+                                              holder_is_accessible,
+                                              klass);
 
   // The declared holder of this field may not have been loaded.
   // Bail out with partial field information.
@@ -264,7 +261,7 @@
 
   // Perform the field lookup.
   Klass*  canonical_holder =
-    InstanceKlass::cast(declared_holder())->find_field(name, signature, &field_desc);
+    InstanceKlass::cast(declared_holder)->find_field(name, signature, &field_desc);
   if (canonical_holder == NULL) {
     return;
   }
@@ -274,7 +271,7 @@
 
 // ------------------------------------------------------------------
 // Get a field by index from a klass's constant pool.
-void JVMCIEnv::get_field_by_index(instanceKlassHandle accessor, fieldDescriptor& fd, int index) {
+void JVMCIEnv::get_field_by_index(InstanceKlass* accessor, fieldDescriptor& fd, int index) {
   ResourceMark rm;
   return get_field_by_index_impl(accessor, fd, index);
 }
@@ -282,17 +279,17 @@
 // ------------------------------------------------------------------
 // Perform an appropriate method lookup based on accessor, holder,
 // name, signature, and bytecode.
-methodHandle JVMCIEnv::lookup_method(instanceKlassHandle h_accessor,
-                               KlassHandle   h_holder,
-                               Symbol*       name,
-                               Symbol*       sig,
+methodHandle JVMCIEnv::lookup_method(InstanceKlass* accessor,
+                               Klass*         holder,
+                               Symbol*        name,
+                               Symbol*        sig,
                                Bytecodes::Code bc,
                                constantTag   tag) {
   // Accessibility checks are performed in JVMCIEnv::get_method_by_index_impl().
-  assert(check_klass_accessibility(h_accessor, h_holder), "holder not accessible");
+  assert(check_klass_accessibility(accessor, holder), "holder not accessible");
 
   methodHandle dest_method;
-  LinkInfo link_info(h_holder, name, sig, h_accessor, LinkInfo::needs_access_check, tag);
+  LinkInfo link_info(holder, name, sig, accessor, LinkInfo::needs_access_check, tag);
   switch (bc) {
   case Bytecodes::_invokestatic:
     dest_method =
@@ -320,7 +317,7 @@
 // ------------------------------------------------------------------
 methodHandle JVMCIEnv::get_method_by_index_impl(const constantPoolHandle& cpool,
                                           int index, Bytecodes::Code bc,
-                                          instanceKlassHandle accessor) {
+                                          InstanceKlass* accessor) {
   if (bc == Bytecodes::_invokedynamic) {
     ConstantPoolCacheEntry* cpce = cpool->invokedynamic_cp_cache_entry_at(index);
     bool is_resolved = !cpce->is_f1_null();
@@ -336,15 +333,15 @@
 
   int holder_index = cpool->klass_ref_index_at(index);
   bool holder_is_accessible;
-  KlassHandle holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
+  Klass* holder = get_klass_by_index_impl(cpool, holder_index, holder_is_accessible, accessor);
 
   // Get the method's name and signature.
   Symbol* name_sym = cpool->name_ref_at(index);
   Symbol* sig_sym  = cpool->signature_ref_at(index);
 
   if (cpool->has_preresolution()
-      || ((holder() == SystemDictionary::MethodHandle_klass() || holder() == SystemDictionary::VarHandle_klass()) &&
-          MethodHandles::is_signature_polymorphic_name(holder(), name_sym))) {
+      || ((holder == SystemDictionary::MethodHandle_klass() || holder == SystemDictionary::VarHandle_klass()) &&
+          MethodHandles::is_signature_polymorphic_name(holder, name_sym))) {
     // Short-circuit lookups for JSR 292-related call sites.
     // That is, do not rely only on name-based lookups, because they may fail
     // if the names are not resolvable in the boot class loader (7056328).
@@ -385,14 +382,14 @@
 }
 
 // ------------------------------------------------------------------
-instanceKlassHandle JVMCIEnv::get_instance_klass_for_declared_method_holder(KlassHandle method_holder) {
+InstanceKlass* JVMCIEnv::get_instance_klass_for_declared_method_holder(Klass* method_holder) {
   // For the case of <array>.clone(), the method holder can be an ArrayKlass*
   // instead of an InstanceKlass*.  For that case simply pretend that the
   // declared holder is Object.clone since that's where the call will bottom out.
   if (method_holder->is_instance_klass()) {
-    return instanceKlassHandle(method_holder());
+    return InstanceKlass::cast(method_holder);
   } else if (method_holder->is_array_klass()) {
-    return instanceKlassHandle(SystemDictionary::Object_klass());
+    return SystemDictionary::Object_klass();
   } else {
     ShouldNotReachHere();
   }
@@ -403,7 +400,7 @@
 // ------------------------------------------------------------------
 methodHandle JVMCIEnv::get_method_by_index(const constantPoolHandle& cpool,
                                      int index, Bytecodes::Code bc,
-                                     instanceKlassHandle accessor) {
+                                     InstanceKlass* accessor) {
   ResourceMark rm;
   return get_method_by_index_impl(cpool, index, bc, accessor);
 }
--- a/hotspot/src/share/vm/jvmci/jvmciEnv.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/jvmci/jvmciEnv.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -79,20 +79,18 @@
   // The CI treats a klass as loaded if it is consistently defined in
   // another loader, even if it hasn't yet been loaded in all loaders
   // that could potentially see it via delegation.
-  static KlassHandle get_klass_by_name(KlassHandle accessing_klass,
-                             Symbol* klass_name,
-                             bool require_local);
+  static Klass* get_klass_by_name(Klass* accessing_klass, Symbol* klass_name, bool require_local);
 
   // Constant pool access.
-  static KlassHandle   get_klass_by_index(const constantPoolHandle& cpool,
-                                int klass_index,
-                                bool& is_accessible,
-                                KlassHandle loading_klass);
-  static void   get_field_by_index(instanceKlassHandle loading_klass, fieldDescriptor& fd,
-                                int field_index);
+  static Klass* get_klass_by_index(const constantPoolHandle& cpool,
+                                   int klass_index,
+                                   bool& is_accessible,
+                                   Klass* loading_klass);
+  static void   get_field_by_index(InstanceKlass* loading_klass, fieldDescriptor& fd,
+                                   int field_index);
   static methodHandle  get_method_by_index(const constantPoolHandle& cpool,
-                                 int method_index, Bytecodes::Code bc,
-                                 instanceKlassHandle loading_klass);
+                                    int method_index, Bytecodes::Code bc,
+                                    InstanceKlass* loading_klass);
 
   JVMCIEnv(CompileTask* task, int system_dictionary_modification_counter);
 
@@ -110,26 +108,26 @@
   bool  _jvmti_can_post_on_exceptions;
 
   // Implementation methods for loading and constant pool access.
-  static KlassHandle get_klass_by_name_impl(KlassHandle& accessing_klass,
+  static Klass* get_klass_by_name_impl(Klass* accessing_klass,
                                   const constantPoolHandle& cpool,
                                   Symbol* klass_name,
                                   bool require_local);
-  static KlassHandle   get_klass_by_index_impl(const constantPoolHandle& cpool,
+  static Klass* get_klass_by_index_impl(const constantPoolHandle& cpool,
                                      int klass_index,
                                      bool& is_accessible,
-                                     KlassHandle loading_klass);
-  static void   get_field_by_index_impl(instanceKlassHandle loading_klass, fieldDescriptor& fd,
+                                     Klass* loading_klass);
+  static void   get_field_by_index_impl(InstanceKlass* loading_klass, fieldDescriptor& fd,
                                      int field_index);
   static methodHandle  get_method_by_index_impl(const constantPoolHandle& cpool,
                                       int method_index, Bytecodes::Code bc,
-                                      instanceKlassHandle loading_klass);
+                                      InstanceKlass* loading_klass);
 
   // Helper methods
-  static bool       check_klass_accessibility(KlassHandle accessing_klass, KlassHandle resolved_klass);
-  static methodHandle  lookup_method(instanceKlassHandle  accessor,
-                           KlassHandle     holder,
-                           Symbol*         name,
-                           Symbol*         sig,
+  static bool       check_klass_accessibility(Klass* accessing_klass, Klass* resolved_klass);
+  static methodHandle  lookup_method(InstanceKlass*  accessor,
+                           Klass*         holder,
+                           Symbol*        name,
+                           Symbol*        sig,
                            Bytecodes::Code bc,
                            constantTag     tag);
 
@@ -180,7 +178,7 @@
   // InstanceKlass*.  This is needed since the holder of a method in
   // the bytecodes could be an array type.  Basically this converts
   // array types into java/lang/Object and other types stay as they are.
-  static instanceKlassHandle get_instance_klass_for_declared_method_holder(KlassHandle klass);
+  static InstanceKlass* get_instance_klass_for_declared_method_holder(Klass* klass);
 };
 
 #endif // SHARE_VM_JVMCI_JVMCIENV_HPP
--- a/hotspot/src/share/vm/jvmci/jvmciRuntime.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/jvmci/jvmciRuntime.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -107,12 +107,12 @@
   JRT_BLOCK;
   assert(klass->is_klass(), "not a class");
   Handle holder(THREAD, klass->klass_holder()); // keep the klass alive
-  instanceKlassHandle h(thread, klass);
-  h->check_valid_for_instantiation(true, CHECK);
+  InstanceKlass* ik = InstanceKlass::cast(klass);
+  ik->check_valid_for_instantiation(true, CHECK);
   // make sure klass is initialized
-  h->initialize(CHECK);
+  ik->initialize(CHECK);
   // allocate instance and return via TLS
-  oop obj = h->allocate_instance(CHECK);
+  oop obj = ik->allocate_instance(CHECK);
   thread->set_vm_result(obj);
   JRT_BLOCK_END;
 
@@ -187,7 +187,7 @@
 JRT_END
 
 JRT_ENTRY(void, JVMCIRuntime::dynamic_new_instance(JavaThread* thread, oopDesc* type_mirror))
-  instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(type_mirror));
+  InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(type_mirror));
 
   if (klass == NULL) {
     ResourceMark rm(THREAD);
@@ -641,7 +641,7 @@
 
 Handle JVMCIRuntime::callStatic(const char* className, const char* methodName, const char* signature, JavaCallArguments* args, TRAPS) {
   TempNewSymbol name = SymbolTable::new_symbol(className, CHECK_(Handle()));
-  KlassHandle klass = SystemDictionary::resolve_or_fail(name, true, CHECK_(Handle()));
+  Klass* klass = SystemDictionary::resolve_or_fail(name, true, CHECK_(Handle()));
   TempNewSymbol runtime = SymbolTable::new_symbol(methodName, CHECK_(Handle()));
   TempNewSymbol sig = SymbolTable::new_symbol(signature, CHECK_(Handle()));
   JavaValue result(T_OBJECT);
@@ -657,7 +657,7 @@
   guarantee(!_HotSpotJVMCIRuntime_initialized, "cannot reinitialize HotSpotJVMCIRuntime");
   JVMCIRuntime::initialize_well_known_classes(CHECK);
   // This should only be called in the context of the JVMCI class being initialized
-  instanceKlassHandle klass = InstanceKlass::cast(SystemDictionary::JVMCI_klass());
+  InstanceKlass* klass = SystemDictionary::JVMCI_klass();
   guarantee(klass->is_being_initialized() && klass->is_reentrant_initialization(THREAD),
          "HotSpotJVMCIRuntime initialization should only be triggered through JVMCI initialization");
 
--- a/hotspot/src/share/vm/memory/universe.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/memory/universe.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -460,9 +460,8 @@
     Klass* k = list->at(i);
     assert(k->is_klass(), "List should only hold classes");
     EXCEPTION_MARK;
-    KlassHandle kh(THREAD, k);
-    java_lang_Class::fixup_mirror(kh, CATCH);
-}
+    java_lang_Class::fixup_mirror(k, CATCH);
+  }
   delete java_lang_Class::fixup_mirror_list();
   java_lang_Class::set_fixup_mirror_list(NULL);
 }
@@ -506,7 +505,7 @@
   log_trace(ref)("Callback to run finalizers on exit");
   {
     PRESERVE_EXCEPTION_MARK;
-    KlassHandle finalizer_klass(THREAD, SystemDictionary::Finalizer_klass());
+    Klass* finalizer_klass = SystemDictionary::Finalizer_klass();
     JavaValue result(T_VOID);
     JavaCalls::call_static(
       &result,
@@ -525,16 +524,15 @@
 // 1) we specified true to initialize_vtable and
 // 2) this ran after gc was enabled
 // In case those ever change we use handles for oops
-void Universe::reinitialize_vtable_of(KlassHandle k_h, TRAPS) {
+void Universe::reinitialize_vtable_of(Klass* ko, TRAPS) {
   // init vtable of k and all subclasses
-  Klass* ko = k_h();
   klassVtable* vt = ko->vtable();
   if (vt) vt->initialize_vtable(false, CHECK);
   if (ko->is_instance_klass()) {
-    for (KlassHandle s_h(THREAD, ko->subklass());
-         s_h() != NULL;
-         s_h = KlassHandle(THREAD, s_h()->next_sibling())) {
-      reinitialize_vtable_of(s_h, CHECK);
+    for (Klass* sk = ko->subklass();
+         sk != NULL;
+         sk = sk->next_sibling()) {
+      reinitialize_vtable_of(sk, CHECK);
     }
   }
 }
@@ -964,28 +962,26 @@
     Interpreter::initialize();      // needed for interpreter entry points
     if (!UseSharedSpaces) {
       HandleMark hm(THREAD);
-      KlassHandle ok_h(THREAD, SystemDictionary::Object_klass());
-      Universe::reinitialize_vtable_of(ok_h, CHECK_false);
+      Klass* ok = SystemDictionary::Object_klass();
+      Universe::reinitialize_vtable_of(ok, CHECK_false);
       Universe::reinitialize_itables(CHECK_false);
     }
   }
 
   HandleMark hm(THREAD);
-  Klass* k;
-  instanceKlassHandle k_h;
   // Setup preallocated empty java.lang.Class array
   Universe::_the_empty_class_klass_array = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_false);
 
   // Setup preallocated OutOfMemoryError errors
-  k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false);
-  k_h = instanceKlassHandle(THREAD, k);
-  Universe::_out_of_memory_error_java_heap = k_h->allocate_instance(CHECK_false);
-  Universe::_out_of_memory_error_metaspace = k_h->allocate_instance(CHECK_false);
-  Universe::_out_of_memory_error_class_metaspace = k_h->allocate_instance(CHECK_false);
-  Universe::_out_of_memory_error_array_size = k_h->allocate_instance(CHECK_false);
+  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_OutOfMemoryError(), true, CHECK_false);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  Universe::_out_of_memory_error_java_heap = ik->allocate_instance(CHECK_false);
+  Universe::_out_of_memory_error_metaspace = ik->allocate_instance(CHECK_false);
+  Universe::_out_of_memory_error_class_metaspace = ik->allocate_instance(CHECK_false);
+  Universe::_out_of_memory_error_array_size = ik->allocate_instance(CHECK_false);
   Universe::_out_of_memory_error_gc_overhead_limit =
-    k_h->allocate_instance(CHECK_false);
-  Universe::_out_of_memory_error_realloc_objects = k_h->allocate_instance(CHECK_false);
+    ik->allocate_instance(CHECK_false);
+  Universe::_out_of_memory_error_realloc_objects = ik->allocate_instance(CHECK_false);
 
   // Setup preallocated cause message for delayed StackOverflowError
   if (StackReservedPages > 0) {
@@ -1006,8 +1002,8 @@
     vmSymbols::java_lang_VirtualMachineError(), true, CHECK_false);
   bool linked = InstanceKlass::cast(k)->link_class_or_fail(CHECK_false);
   if (!linked) {
-    tty->print_cr("Unable to link/verify VirtualMachineError class");
-    return false; // initialization failed
+     tty->print_cr("Unable to link/verify VirtualMachineError class");
+     return false; // initialization failed
   }
   Universe::_virtual_machine_error_instance =
     InstanceKlass::cast(k)->allocate_instance(CHECK_false);
@@ -1040,12 +1036,12 @@
     // Setup the array of errors that have preallocated backtrace
     k = Universe::_out_of_memory_error_java_heap->klass();
     assert(k->name() == vmSymbols::java_lang_OutOfMemoryError(), "should be out of memory error");
-    k_h = instanceKlassHandle(THREAD, k);
+    ik = InstanceKlass::cast(k);
 
     int len = (StackTraceInThrowable) ? (int)PreallocatedOutOfMemoryErrorCount : 0;
-    Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(k_h(), len, CHECK_false);
+    Universe::_preallocated_out_of_memory_error_array = oopFactory::new_objArray(ik, len, CHECK_false);
     for (int i=0; i<len; i++) {
-      oop err = k_h->allocate_instance(CHECK_false);
+      oop err = ik->allocate_instance(CHECK_false);
       Handle err_h = Handle(THREAD, err);
       java_lang_Throwable::allocate_backtrace(err_h, CHECK_false);
       Universe::preallocated_out_of_memory_errors()->obj_at_put(i, err_h());
--- a/hotspot/src/share/vm/memory/universe.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/memory/universe.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -230,7 +230,7 @@
   static void initialize_basic_type_mirrors(TRAPS);
   static void fixup_mirrors(TRAPS);
 
-  static void reinitialize_vtable_of(KlassHandle h_k, TRAPS);
+  static void reinitialize_vtable_of(Klass* k, TRAPS);
   static void reinitialize_itables(TRAPS);
   static void compute_base_vtable_size();             // compute vtable size of class Object
 
--- a/hotspot/src/share/vm/oops/arrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/arrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -96,9 +96,9 @@
 
 // Initialization of vtables and mirror object is done separatly from base_create_array_klass,
 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup.
-void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, ModuleEntry* module_entry, TRAPS) {
+void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module_entry, TRAPS) {
   ResourceMark rm(THREAD);
-  k->initialize_supers(super_klass(), CHECK);
+  k->initialize_supers(super_klass, CHECK);
   k->vtable()->initialize_vtable(false, CHECK);
 
   // During bootstrapping, before java.base is defined, the module_entry may not be present yet.
--- a/hotspot/src/share/vm/oops/arrayKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/arrayKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -115,7 +115,7 @@
   void array_klasses_do(void f(Klass* k, TRAPS), TRAPS);
 
   // Return a handle.
-  static void     complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, ModuleEntry* module, TRAPS);
+  static void     complete_create_array_klass(ArrayKlass* k, Klass* super_klass, ModuleEntry* module, TRAPS);
 
 
   // jvm support
--- a/hotspot/src/share/vm/oops/constantPool.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -193,7 +193,7 @@
   resolved_references()->obj_at_put(obj_index, str);
 }
 
-void ConstantPool::trace_class_resolution(const constantPoolHandle& this_cp, KlassHandle k) {
+void ConstantPool::trace_class_resolution(const constantPoolHandle& this_cp, Klass* k) {
   ResourceMark rm;
   int line_number = -1;
   const char * source_file = NULL;
@@ -208,7 +208,7 @@
       }
     }
   }
-  if (k() != this_cp->pool_holder()) {
+  if (k != this_cp->pool_holder()) {
     // only print something if the classes are different
     if (source_file != NULL) {
       log_debug(class, resolve)("%s %s %s:%d",
@@ -254,11 +254,10 @@
   Symbol* name = entry.get_symbol();
   Handle loader (THREAD, this_cp->pool_holder()->class_loader());
   Handle protection_domain (THREAD, this_cp->pool_holder()->protection_domain());
-  Klass* kk = SystemDictionary::resolve_or_fail(name, loader, protection_domain, true, THREAD);
-  KlassHandle k (THREAD, kk);
+  Klass* k = SystemDictionary::resolve_or_fail(name, loader, protection_domain, true, THREAD);
   if (!HAS_PENDING_EXCEPTION) {
     // preserve the resolved klass from unloading
-    mirror_handle = Handle(THREAD, kk->java_mirror());
+    mirror_handle = Handle(THREAD, k->java_mirror());
     // Do access check for klasses
     verify_constant_pool_resolve(this_cp, k, THREAD);
   }
@@ -282,13 +281,13 @@
 
   // Make this class loader depend upon the class loader owning the class reference
   ClassLoaderData* this_key = this_cp->pool_holder()->class_loader_data();
-  this_key->record_dependency(k(), CHECK_NULL); // Can throw OOM
+  this_key->record_dependency(k, CHECK_NULL); // Can throw OOM
 
   // logging for class+resolve.
   if (log_is_enabled(Debug, class, resolve)){
     trace_class_resolution(this_cp, k);
   }
-  this_cp->klass_at_put(which, k());
+  this_cp->klass_at_put(which, k);
   entry = this_cp->resolved_klass_at(which);
   assert(entry.is_resolved() && entry.get_klass()->is_klass(), "must be resolved at this point");
   return entry.get_klass();
@@ -317,14 +316,13 @@
     if (k != NULL) {
       // Make sure that resolving is legal
       EXCEPTION_MARK;
-      KlassHandle klass(THREAD, k);
       // return NULL if verification fails
-      verify_constant_pool_resolve(this_cp, klass, THREAD);
+      verify_constant_pool_resolve(this_cp, k, THREAD);
       if (HAS_PENDING_EXCEPTION) {
         CLEAR_PENDING_EXCEPTION;
         return NULL;
       }
-      return klass();
+      return k;
     } else {
       return k;
     }
@@ -456,16 +454,15 @@
 }
 
 
-void ConstantPool::verify_constant_pool_resolve(const constantPoolHandle& this_cp, KlassHandle k, TRAPS) {
+void ConstantPool::verify_constant_pool_resolve(const constantPoolHandle& this_cp, Klass* k, TRAPS) {
  if (k->is_instance_klass() || k->is_objArray_klass()) {
-    instanceKlassHandle holder (THREAD, this_cp->pool_holder());
-    Klass* elem = k->is_instance_klass() ? k() : ObjArrayKlass::cast(k())->bottom_klass();
-    KlassHandle element (THREAD, elem);
+    InstanceKlass* holder = this_cp->pool_holder();
+    Klass* elem = k->is_instance_klass() ? k : ObjArrayKlass::cast(k)->bottom_klass();
 
     // The element type could be a typeArray - we only need the access check if it is
     // an reference to another class
-    if (element->is_instance_klass()) {
-      LinkResolver::check_klass_accessability(holder, element, CHECK);
+    if (elem->is_instance_klass()) {
+      LinkResolver::check_klass_accessability(holder, elem, CHECK);
     }
   }
 }
@@ -693,8 +690,7 @@
                               callee_index, name->as_C_string(), signature->as_C_string());
       }
 
-      Klass* k = klass_at_impl(this_cp, callee_index, true, CHECK_NULL);
-      KlassHandle callee(THREAD, k);
+      Klass* callee = klass_at_impl(this_cp, callee_index, true, CHECK_NULL);
 
       // Check constant pool method consistency
       if ((callee->is_interface() && m_tag.is_method()) ||
@@ -710,7 +706,7 @@
         THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
       }
 
-      KlassHandle klass(THREAD, this_cp->pool_holder());
+      Klass* klass = this_cp->pool_holder();
       Handle value = SystemDictionary::link_method_handle_constant(klass, ref_kind,
                                                                    callee, name, signature,
                                                                    THREAD);
@@ -729,7 +725,7 @@
                               index, this_cp->method_type_index_at(index),
                               signature->as_C_string());
       }
-      KlassHandle klass(THREAD, this_cp->pool_holder());
+      Klass* klass = this_cp->pool_holder();
       Handle value = SystemDictionary::find_method_handle_type(signature, klass, THREAD);
       result_oop = value();
       if (HAS_PENDING_EXCEPTION) {
@@ -845,8 +841,7 @@
 }
 
 
-bool ConstantPool::klass_name_at_matches(instanceKlassHandle k,
-                                                int which) {
+bool ConstantPool::klass_name_at_matches(const InstanceKlass* k, int which) {
   // Names are interned, so we can compare Symbol*s directly
   Symbol* cp_name = klass_name_at(which);
   return (cp_name == k->name());
--- a/hotspot/src/share/vm/oops/constantPool.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -693,7 +693,7 @@
   }
 
   // Klass name matches name at offset
-  bool klass_name_at_matches(instanceKlassHandle k, int which);
+  bool klass_name_at_matches(const InstanceKlass* k, int which);
 
   // Sizing
   int length() const                   { return _length; }
@@ -784,7 +784,7 @@
   }
 
   // Performs the LinkResolver checks
-  static void verify_constant_pool_resolve(const constantPoolHandle& this_cp, KlassHandle klass, TRAPS);
+  static void verify_constant_pool_resolve(const constantPoolHandle& this_cp, Klass* klass, TRAPS);
 
   // Implementation of methods that needs an exposed 'this' pointer, in order to
   // handle GC while executing the method
@@ -792,7 +792,7 @@
                               bool save_resolution_error, TRAPS);
   static oop string_at_impl(const constantPoolHandle& this_cp, int which, int obj_index, TRAPS);
 
-  static void trace_class_resolution(const constantPoolHandle& this_cp, KlassHandle k);
+  static void trace_class_resolution(const constantPoolHandle& this_cp, Klass* k);
 
   // Resolve string constants (to prevent allocation during compilation)
   static void resolve_string_constants_impl(const constantPoolHandle& this_cp, TRAPS);
--- a/hotspot/src/share/vm/oops/cpCache.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/cpCache.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -101,14 +101,14 @@
 // are updated, lest other processors see a non-zero bytecode but zero f1/f2.
 void ConstantPoolCacheEntry::set_field(Bytecodes::Code get_code,
                                        Bytecodes::Code put_code,
-                                       KlassHandle field_holder,
+                                       Klass* field_holder,
                                        int field_index,
                                        int field_offset,
                                        TosState field_type,
                                        bool is_final,
                                        bool is_volatile,
                                        Klass* root_klass) {
-  set_f1(field_holder());
+  set_f1(field_holder);
   set_f2(field_offset);
   assert((field_index & field_index_mask) == field_index,
          "field index does not fit in low flag bits");
--- a/hotspot/src/share/vm/oops/cpCache.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/cpCache.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, 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
@@ -217,7 +217,7 @@
   void set_field(                                // sets entry to resolved field state
     Bytecodes::Code get_code,                    // the bytecode used for reading the field
     Bytecodes::Code put_code,                    // the bytecode used for writing the field
-    KlassHandle     field_holder,                // the object/klass holding the field
+    Klass*          field_holder,                // the object/klass holding the field
     int             orig_field_index,            // the original field index in the field holder
     int             field_offset,                // the field offset in words in the field holder
     TosState        field_type,                  // the (machine) field type
--- a/hotspot/src/share/vm/oops/fieldStreams.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/fieldStreams.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -107,14 +107,6 @@
     init_generic_signature_start_slot();
     assert(klass == field_holder(), "");
   }
-  FieldStreamBase(instanceKlassHandle klass) {
-    _fields = klass->fields();
-    _constants = klass->constants();
-    _index = 0;
-    _limit = klass->java_fields_count();
-    init_generic_signature_start_slot();
-    assert(klass == field_holder(), "");
-  }
 
   // accessors
   int index() const                 { return _index; }
@@ -196,7 +188,7 @@
 // Iterate over only the internal fields
 class JavaFieldStream : public FieldStreamBase {
  public:
-  JavaFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {}
+  JavaFieldStream(const InstanceKlass* k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {}
 
   int name_index() const {
     assert(!field()->is_internal(), "regular only");
@@ -245,7 +237,6 @@
 class InternalFieldStream : public FieldStreamBase {
  public:
   InternalFieldStream(InstanceKlass* k):      FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
-  InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
 };
 
 
@@ -253,7 +244,6 @@
  public:
   AllFieldStream(Array<u2>* fields, const constantPoolHandle& constants): FieldStreamBase(fields, constants) {}
   AllFieldStream(InstanceKlass* k):      FieldStreamBase(k->fields(), k->constants()) {}
-  AllFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants()) {}
 };
 
 #endif // SHARE_VM_OOPS_FIELDSTREAMS_HPP
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -374,7 +374,7 @@
 }
 
 klassItable* InstanceKlass::itable() const {
-  return new klassItable(instanceKlassHandle(this));
+  return new klassItable(const_cast<InstanceKlass*>(this));
 }
 
 void InstanceKlass::eager_initialize(Thread *thread) {
@@ -392,8 +392,7 @@
     if (!InstanceKlass::cast(super)->is_initialized()) return;
 
     // call body to expose the this pointer
-    instanceKlassHandle this_k(thread, this);
-    eager_initialize_impl(this_k);
+    eager_initialize_impl(this);
   }
 }
 
@@ -432,7 +431,7 @@
   assert(!is_not_initialized(), "class must be initialized now");
 }
 
-void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_k) {
+void InstanceKlass::eager_initialize_impl(InstanceKlass* this_k) {
   EXCEPTION_MARK;
   HandleMark hm(THREAD);
   Handle init_lock(THREAD, this_k->init_lock());
@@ -470,8 +469,7 @@
 // Note: implementation moved to static method to expose the this pointer.
 void InstanceKlass::initialize(TRAPS) {
   if (this->should_be_initialized()) {
-    instanceKlassHandle this_k(THREAD, this);
-    initialize_impl(this_k, CHECK);
+    initialize_impl(this, CHECK);
     // Note: at this point the class may be initialized
     //       OR it may be in the state of being initialized
     //       in case of recursive initialization!
@@ -482,7 +480,7 @@
 
 
 bool InstanceKlass::verify_code(
-    instanceKlassHandle this_k, bool throw_verifyerror, TRAPS) {
+    InstanceKlass* this_k, bool throw_verifyerror, TRAPS) {
   // 1) Verify the bytecodes
   Verifier::Mode mode =
     throw_verifyerror ? Verifier::ThrowException : Verifier::NoException;
@@ -501,8 +499,7 @@
 void InstanceKlass::link_class(TRAPS) {
   assert(is_loaded(), "must be loaded");
   if (!is_linked()) {
-    instanceKlassHandle this_k(THREAD, this);
-    link_class_impl(this_k, true, CHECK);
+    link_class_impl(this, true, CHECK);
   }
 }
 
@@ -511,14 +508,13 @@
 bool InstanceKlass::link_class_or_fail(TRAPS) {
   assert(is_loaded(), "must be loaded");
   if (!is_linked()) {
-    instanceKlassHandle this_k(THREAD, this);
-    link_class_impl(this_k, false, CHECK_false);
+    link_class_impl(this, false, CHECK_false);
   }
   return is_linked();
 }
 
 bool InstanceKlass::link_class_impl(
-    instanceKlassHandle this_k, bool throw_verifyerror, TRAPS) {
+    InstanceKlass* this_k, bool throw_verifyerror, TRAPS) {
   if (DumpSharedSpaces && this_k->is_in_error_state()) {
     // This is for CDS dumping phase only -- we use the in_error_state to indicate that
     // the class has failed verification. Throwing the NoClassDefFoundError here is just
@@ -542,8 +538,8 @@
   JavaThread* jt = (JavaThread*)THREAD;
 
   // link super class before linking this class
-  instanceKlassHandle super(THREAD, this_k->super());
-  if (super.not_null()) {
+  Klass* super = this_k->super();
+  if (super != NULL) {
     if (super->is_interface()) {  // check if super class is an interface
       ResourceMark rm(THREAD);
       Exceptions::fthrow(
@@ -556,15 +552,16 @@
       return false;
     }
 
-    link_class_impl(super, throw_verifyerror, CHECK_false);
+    InstanceKlass* ik_super = InstanceKlass::cast(super);
+    link_class_impl(ik_super, throw_verifyerror, CHECK_false);
   }
 
   // link all interfaces implemented by this class before linking this class
   Array<Klass*>* interfaces = this_k->local_interfaces();
   int num_interfaces = interfaces->length();
   for (int index = 0; index < num_interfaces; index++) {
-    instanceKlassHandle ih(THREAD, interfaces->at(index));
-    link_class_impl(ih, throw_verifyerror, CHECK_false);
+    InstanceKlass* interk = InstanceKlass::cast(interfaces->at(index));
+    link_class_impl(interk, throw_verifyerror, CHECK_false);
   }
 
   // in case the class is linked in the process of linking its superclasses
@@ -642,7 +639,7 @@
       if (JvmtiExport::should_post_class_prepare()) {
         Thread *thread = THREAD;
         assert(thread->is_Java_thread(), "thread->is_Java_thread()");
-        JvmtiExport::post_class_prepare((JavaThread *) thread, this_k());
+        JvmtiExport::post_class_prepare((JavaThread *) thread, this_k);
       }
     }
   }
@@ -655,13 +652,12 @@
 // verification but before the first method of the class is executed.
 void InstanceKlass::rewrite_class(TRAPS) {
   assert(is_loaded(), "must be loaded");
-  instanceKlassHandle this_k(THREAD, this);
-  if (this_k->is_rewritten()) {
-    assert(this_k()->is_shared(), "rewriting an unshared class?");
+  if (is_rewritten()) {
+    assert(is_shared(), "rewriting an unshared class?");
     return;
   }
-  Rewriter::rewrite(this_k, CHECK);
-  this_k->set_rewritten();
+  Rewriter::rewrite(this, CHECK);
+  set_rewritten();
 }
 
 // Now relocate and link method entry points after class is rewritten.
@@ -678,7 +674,7 @@
 }
 
 // Eagerly initialize superinterfaces that declare default methods (concrete instance: any access)
-void InstanceKlass::initialize_super_interfaces(instanceKlassHandle this_k, TRAPS) {
+void InstanceKlass::initialize_super_interfaces(InstanceKlass* this_k, TRAPS) {
   assert (this_k->has_nonstatic_concrete_methods(), "caller should have checked this");
   for (int i = 0; i < this_k->local_interfaces()->length(); ++i) {
     Klass* iface = this_k->local_interfaces()->at(i);
@@ -698,14 +694,14 @@
   }
 }
 
-void InstanceKlass::initialize_impl(instanceKlassHandle this_k, TRAPS) {
+void InstanceKlass::initialize_impl(InstanceKlass* this_k, TRAPS) {
   HandleMark hm(THREAD);
 
   // Make sure klass is linked (verified) before initialization
   // A class could already be verified, since it has been reflected upon.
   this_k->link_class(CHECK);
 
-  DTRACE_CLASSINIT_PROBE(required, this_k(), -1);
+  DTRACE_CLASSINIT_PROBE(required, this_k, -1);
 
   bool wait = false;
 
@@ -728,19 +724,19 @@
 
     // Step 3
     if (this_k->is_being_initialized() && this_k->is_reentrant_initialization(self)) {
-      DTRACE_CLASSINIT_PROBE_WAIT(recursive, this_k(), -1,wait);
+      DTRACE_CLASSINIT_PROBE_WAIT(recursive, this_k, -1,wait);
       return;
     }
 
     // Step 4
     if (this_k->is_initialized()) {
-      DTRACE_CLASSINIT_PROBE_WAIT(concurrent, this_k(), -1,wait);
+      DTRACE_CLASSINIT_PROBE_WAIT(concurrent, this_k, -1,wait);
       return;
     }
 
     // Step 5
     if (this_k->is_in_error_state()) {
-      DTRACE_CLASSINIT_PROBE_WAIT(erroneous, this_k(), -1,wait);
+      DTRACE_CLASSINIT_PROBE_WAIT(erroneous, this_k, -1,wait);
       ResourceMark rm(THREAD);
       const char* desc = "Could not initialize class ";
       const char* className = this_k->external_name();
@@ -786,7 +782,7 @@
         this_k->set_initialization_state_and_notify(initialization_error, THREAD);
         CLEAR_PENDING_EXCEPTION;
       }
-      DTRACE_CLASSINIT_PROBE_WAIT(super__failed, this_k(), -1,wait);
+      DTRACE_CLASSINIT_PROBE_WAIT(super__failed, this_k, -1,wait);
       THROW_OOP(e());
     }
   }
@@ -799,7 +795,7 @@
   {
     assert(THREAD->is_Java_thread(), "non-JavaThread in initialize_impl");
     JavaThread* jt = (JavaThread*)THREAD;
-    DTRACE_CLASSINIT_PROBE_WAIT(clinit, this_k(), -1,wait);
+    DTRACE_CLASSINIT_PROBE_WAIT(clinit, this_k, -1,wait);
     // Timer includes any side effects of class initialization (resolution,
     // etc), but not recursive entry into call_class_initializer().
     PerfClassTraceTime timer(ClassLoader::perf_class_init_time(),
@@ -833,7 +829,7 @@
       // JVMTI internal flag reset is needed in order to report ExceptionInInitializerError
       JvmtiExport::clear_detected_exception((JavaThread*)THREAD);
     }
-    DTRACE_CLASSINIT_PROBE_WAIT(error, this_k(), -1,wait);
+    DTRACE_CLASSINIT_PROBE_WAIT(error, this_k, -1,wait);
     if (e->is_a(SystemDictionary::Error_klass())) {
       THROW_OOP(e());
     } else {
@@ -843,17 +839,16 @@
                 &args);
     }
   }
-  DTRACE_CLASSINIT_PROBE_WAIT(end, this_k(), -1,wait);
+  DTRACE_CLASSINIT_PROBE_WAIT(end, this_k, -1,wait);
 }
 
 
 // Note: implementation moved to static method to expose the this pointer.
 void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) {
-  instanceKlassHandle kh(THREAD, this);
-  set_initialization_state_and_notify_impl(kh, state, CHECK);
+  set_initialization_state_and_notify_impl(this, state, CHECK);
 }
 
-void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_k, ClassState state, TRAPS) {
+void InstanceKlass::set_initialization_state_and_notify_impl(InstanceKlass* this_k, ClassState state, TRAPS) {
   Handle init_lock(THREAD, this_k->init_lock());
   if (init_lock() != NULL) {
     ObjectLocker ol(init_lock, THREAD);
@@ -995,9 +990,8 @@
   }
   int size = objArrayOopDesc::object_size(length);
   Klass* ak = array_klass(n, CHECK_NULL);
-  KlassHandle h_ak (THREAD, ak);
   objArrayOop o =
-    (objArrayOop)CollectedHeap::array_allocate(h_ak, size, length, CHECK_NULL);
+    (objArrayOop)CollectedHeap::array_allocate(ak, size, length, CHECK_NULL);
   return o;
 }
 
@@ -1020,11 +1014,9 @@
   bool has_finalizer_flag = has_finalizer(); // Query before possible GC
   int size = size_helper();  // Query before forming handle.
 
-  KlassHandle h_k(THREAD, this);
-
   instanceOop i;
 
-  i = (instanceOop)CollectedHeap::obj_allocate(h_k, size, CHECK_NULL);
+  i = (instanceOop)CollectedHeap::obj_allocate(this, size, CHECK_NULL);
   if (has_finalizer_flag && !RegisterFinalizersAtInit) {
     i = register_finalizer(i, CHECK_NULL);
   }
@@ -1045,11 +1037,10 @@
 }
 
 Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
-  instanceKlassHandle this_k(THREAD, this);
-  return array_klass_impl(this_k, or_null, n, THREAD);
+  return array_klass_impl(this, or_null, n, THREAD);
 }
 
-Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) {
+Klass* InstanceKlass::array_klass_impl(InstanceKlass* this_k, bool or_null, int n, TRAPS) {
   // Need load-acquire for lock-free read
   if (this_k->array_klasses_acquire() == NULL) {
     if (or_null) return NULL;
@@ -1082,13 +1073,12 @@
 }
 
 void InstanceKlass::call_class_initializer(TRAPS) {
-  instanceKlassHandle ik (THREAD, this);
-  call_class_initializer_impl(ik, THREAD);
+  call_class_initializer_impl(this, THREAD);
 }
 
 static int call_class_initializer_impl_counter = 0;   // for debugging
 
-Method* InstanceKlass::class_initializer() {
+Method* InstanceKlass::class_initializer() const {
   Method* clinit = find_method(
       vmSymbols::class_initializer_name(), vmSymbols::void_method_signature());
   if (clinit != NULL && clinit->has_valid_initializer_flags()) {
@@ -1097,7 +1087,7 @@
   return NULL;
 }
 
-void InstanceKlass::call_class_initializer_impl(instanceKlassHandle this_k, TRAPS) {
+void InstanceKlass::call_class_initializer_impl(InstanceKlass* this_k, TRAPS) {
   if (ReplayCompiles &&
       (ReplaySuppressInitializers == 1 ||
        ReplaySuppressInitializers >= 2 && this_k->class_loader() != NULL)) {
@@ -1112,7 +1102,7 @@
     outputStream* log = Log(class, init)::info_stream();
     log->print("%d Initializing ", call_class_initializer_impl_counter++);
     this_k->name()->print_value_on(log);
-    log->print_cr("%s (" INTPTR_FORMAT ")", h_method() == NULL ? "(no method)" : "", p2i(this_k()));
+    log->print_cr("%s (" INTPTR_FORMAT ")", h_method() == NULL ? "(no method)" : "", p2i(this_k));
   }
   if (h_method() != NULL) {
     JavaCallArguments args; // No arguments
@@ -1263,14 +1253,13 @@
 
 
 void InstanceKlass::do_local_static_fields(void f(fieldDescriptor*, Handle, TRAPS), Handle mirror, TRAPS) {
-  instanceKlassHandle h_this(THREAD, this);
-  do_local_static_fields_impl(h_this, f, mirror, CHECK);
+  do_local_static_fields_impl(this, f, mirror, CHECK);
 }
 
 
-void InstanceKlass::do_local_static_fields_impl(instanceKlassHandle this_k,
+void InstanceKlass::do_local_static_fields_impl(InstanceKlass* this_k,
                              void f(fieldDescriptor* fd, Handle, TRAPS), Handle mirror, TRAPS) {
-  for (JavaFieldStream fs(this_k()); !fs.done(); fs.next()) {
+  for (JavaFieldStream fs(this_k); !fs.done(); fs.next()) {
     if (fs.access_flags().is_static()) {
       fieldDescriptor& fd = fs.field_descriptor();
       f(&fd, mirror, CHECK);
@@ -1629,13 +1618,13 @@
 }
 
 /* jni_id_for_impl for jfieldIds only */
-JNIid* InstanceKlass::jni_id_for_impl(instanceKlassHandle this_k, int offset) {
+JNIid* InstanceKlass::jni_id_for_impl(InstanceKlass* this_k, int offset) {
   MutexLocker ml(JfieldIdCreation_lock);
   // Retry lookup after we got the lock
   JNIid* probe = this_k->jni_ids() == NULL ? NULL : this_k->jni_ids()->find(offset);
   if (probe == NULL) {
     // Slow case, allocate new static field identifier
-    probe = new JNIid(this_k(), offset, this_k->jni_ids());
+    probe = new JNIid(this_k, offset, this_k->jni_ids());
     this_k->set_jni_ids(probe);
   }
   return probe;
@@ -1684,9 +1673,9 @@
 // locking has to be done very carefully to avoid deadlocks
 // and/or other cache consistency problems.
 //
-jmethodID InstanceKlass::get_jmethod_id(instanceKlassHandle ik_h, const methodHandle& method_h) {
+jmethodID InstanceKlass::get_jmethod_id(InstanceKlass* ik, const methodHandle& method_h) {
   size_t idnum = (size_t)method_h->method_idnum();
-  jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire();
+  jmethodID* jmeths = ik->methods_jmethod_ids_acquire();
   size_t length = 0;
   jmethodID id = NULL;
 
@@ -1710,7 +1699,7 @@
 
   if (jmeths != NULL) {
     // the cache already exists
-    if (!ik_h->idnum_can_increment()) {
+    if (!ik->idnum_can_increment()) {
       // the cache can't grow so we can just get the current values
       get_jmethod_id_length_value(jmeths, idnum, &length, &id);
     } else {
@@ -1744,7 +1733,7 @@
     jmethodID* new_jmeths = NULL;
     if (length <= idnum) {
       // allocate a new cache that might be used
-      size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count());
+      size_t size = MAX2(idnum+1, (size_t)ik->idnum_allocated_count());
       new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1, mtClass);
       memset(new_jmeths, 0, (size+1)*sizeof(jmethodID));
       // cache size is stored in element[0], other elements offset by one
@@ -1755,23 +1744,23 @@
     jmethodID new_id = NULL;
     if (method_h->is_old() && !method_h->is_obsolete()) {
       // The method passed in is old (but not obsolete), we need to use the current version
-      Method* current_method = ik_h->method_with_idnum((int)idnum);
+      Method* current_method = ik->method_with_idnum((int)idnum);
       assert(current_method != NULL, "old and but not obsolete, so should exist");
-      new_id = Method::make_jmethod_id(ik_h->class_loader_data(), current_method);
+      new_id = Method::make_jmethod_id(ik->class_loader_data(), current_method);
     } else {
       // It is the current version of the method or an obsolete method,
       // use the version passed in
-      new_id = Method::make_jmethod_id(ik_h->class_loader_data(), method_h());
+      new_id = Method::make_jmethod_id(ik->class_loader_data(), method_h());
     }
 
     if (Threads::number_of_threads() == 0 ||
         SafepointSynchronize::is_at_safepoint()) {
       // we're single threaded or at a safepoint - no locking needed
-      id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths,
+      id = get_jmethod_id_fetch_or_update(ik, idnum, new_id, new_jmeths,
                                           &to_dealloc_id, &to_dealloc_jmeths);
     } else {
       MutexLocker ml(JmethodIdCreation_lock);
-      id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths,
+      id = get_jmethod_id_fetch_or_update(ik, idnum, new_id, new_jmeths,
                                           &to_dealloc_id, &to_dealloc_jmeths);
     }
 
@@ -1782,7 +1771,7 @@
     }
     // free up the new ID since it wasn't needed
     if (to_dealloc_id != NULL) {
-      Method::destroy_jmethod_id(ik_h->class_loader_data(), to_dealloc_id);
+      Method::destroy_jmethod_id(ik->class_loader_data(), to_dealloc_id);
     }
   }
   return id;
@@ -1814,7 +1803,7 @@
 // the VMThread or have cache consistency issues.
 //
 jmethodID InstanceKlass::get_jmethod_id_fetch_or_update(
-            instanceKlassHandle ik_h, size_t idnum, jmethodID new_id,
+            InstanceKlass* ik, size_t idnum, jmethodID new_id,
             jmethodID* new_jmeths, jmethodID* to_dealloc_id_p,
             jmethodID** to_dealloc_jmeths_p) {
   assert(new_id != NULL, "sanity check");
@@ -1825,7 +1814,7 @@
          JmethodIdCreation_lock->owned_by_self(), "sanity check");
 
   // reacquire the cache - we are locked, single threaded or at a safepoint
-  jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire();
+  jmethodID* jmeths = ik->methods_jmethod_ids_acquire();
   jmethodID  id     = NULL;
   size_t     length = 0;
 
@@ -1838,7 +1827,7 @@
       }
       *to_dealloc_jmeths_p = jmeths;  // save old cache for later delete
     }
-    ik_h->release_set_methods_jmethod_ids(jmeths = new_jmeths);
+    ik->release_set_methods_jmethod_ids(jmeths = new_jmeths);
   } else {
     // fetch jmethodID (if any) from the existing cache
     id = jmeths[idnum+1];
@@ -2058,11 +2047,10 @@
 }
 
 void InstanceKlass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
-  instanceKlassHandle ik(THREAD, this);
-  ik->set_package(loader_data, CHECK);
+  set_package(loader_data, CHECK);
   Klass::restore_unshareable_info(loader_data, protection_domain, CHECK);
 
-  Array<Method*>* methods = ik->methods();
+  Array<Method*>* methods = this->methods();
   int num_methods = methods->length();
   for (int index2 = 0; index2 < num_methods; ++index2) {
     methodHandle m(THREAD, methods->at(index2));
@@ -2075,14 +2063,14 @@
     // vtables in the shared system dictionary, only the main one.
     // It also redefines the itable too so fix that too.
     ResourceMark rm(THREAD);
-    ik->vtable()->initialize_vtable(false, CHECK);
-    ik->itable()->initialize_itable(false, CHECK);
+    vtable()->initialize_vtable(false, CHECK);
+    itable()->initialize_itable(false, CHECK);
   }
 
   // restore constant pool resolved references
-  ik->constants()->restore_unshareable_info(CHECK);
-
-  ik->array_klasses_do(restore_unshareable_in_class, CHECK);
+  constants()->restore_unshareable_info(CHECK);
+
+  array_klasses_do(restore_unshareable_in_class, CHECK);
 }
 
 // returns true IFF is_in_error_state() has been changed as a result of this call.
@@ -2448,7 +2436,7 @@
 }
 
 /* defined for now in jvm.cpp, for historical reasons *--
-Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
+Klass* InstanceKlass::compute_enclosing_class_impl(InstanceKlass* self,
                                                      Symbol*& simple_name_result, TRAPS) {
   ...
 }
@@ -2522,7 +2510,7 @@
   return false;
 }
 
-bool InstanceKlass::find_inner_classes_attr(instanceKlassHandle k, int* ooff, int* noff, TRAPS) {
+bool InstanceKlass::find_inner_classes_attr(const InstanceKlass* k, int* ooff, int* noff, TRAPS) {
   constantPoolHandle i_cp(THREAD, k->constants());
   for (InnerClassesIterator iter(k); !iter.done(); iter.next()) {
     int ioff = iter.inner_class_info_index();
@@ -2531,7 +2519,7 @@
       // before attempting to find the class.
       if (i_cp->klass_name_at_matches(k, ioff)) {
         Klass* inner_klass = i_cp->klass_at(ioff, CHECK_false);
-        if (k() == inner_klass) {
+        if (k == inner_klass) {
           *ooff = iter.outer_class_info_index();
           *noff = iter.inner_name_index();
           return true;
@@ -2580,8 +2568,7 @@
   jint access = access_flags().as_int();
 
   // But check if it happens to be member class.
-  instanceKlassHandle ik(THREAD, this);
-  InnerClassesIterator iter(ik);
+  InnerClassesIterator iter(this);
   for (; !iter.done(); iter.next()) {
     int ioff = iter.inner_class_info_index();
     // Inner class attribute can be zero, skip it.
@@ -2590,8 +2577,8 @@
 
     // only look at classes that are already loaded
     // since we are looking for the flags for our self.
-    Symbol* inner_name = ik->constants()->klass_name_at(ioff);
-    if ((ik->name() == inner_name)) {
+    Symbol* inner_name = constants()->klass_name_at(ioff);
+    if (name() == inner_name) {
       // This is really a member class.
       access = iter.inner_access_flags();
       break;
@@ -3612,7 +3599,7 @@
 // Save the scratch_class as the previous version if any of the methods are running.
 // The previous_versions are used to set breakpoints in EMCP methods and they are
 // also used to clean MethodData links to redefined methods that are no longer running.
-void InstanceKlass::add_previous_version(instanceKlassHandle scratch_class,
+void InstanceKlass::add_previous_version(InstanceKlass* scratch_class,
                                          int emcp_method_count) {
   assert(Thread::current()->is_VM_thread(),
          "only VMThread can add previous versions");
@@ -3638,7 +3625,7 @@
     log_trace(redefine, class, iklass, add)("scratch class not added; no methods are running");
     // For debugging purposes.
     scratch_class->set_is_scratch_class();
-    scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class());
+    scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class);
     return;
   }
 
@@ -3671,7 +3658,7 @@
   log_trace(redefine, class, iklass, add) ("scratch class added; one of its methods is on_stack.");
   assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version");
   scratch_class->link_previous_versions(previous_versions());
-  link_previous_versions(scratch_class());
+  link_previous_versions(scratch_class);
 } // end add_previous_version()
 
 #endif // INCLUDE_JVMTI
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -472,7 +472,7 @@
                                                      TRAPS);
 
   // Find InnerClasses attribute for k and return outer_class_info_index & inner_name_index.
-  static bool find_inner_classes_attr(instanceKlassHandle k,
+  static bool find_inner_classes_attr(const InstanceKlass* k,
                                       int* ooff, int* noff, TRAPS);
 
  private:
@@ -524,7 +524,7 @@
   void unlink_class();
   void rewrite_class(TRAPS);
   void link_methods(TRAPS);
-  Method* class_initializer();
+  Method* class_initializer() const;
 
   // set the class to initialized if no static initializer is present
   void eager_initialize(Thread *thread);
@@ -711,7 +711,7 @@
   void set_is_being_redefined(bool value)  { _is_being_redefined = value; }
 
   // RedefineClasses() support for previous versions:
-  void add_previous_version(instanceKlassHandle ikh, int emcp_method_count);
+  void add_previous_version(InstanceKlass* ik, int emcp_method_count);
   void purge_previous_version_list();
 
   InstanceKlass* previous_versions() const { return _previous_versions; }
@@ -883,9 +883,9 @@
                                     u2 method_index);
 
   // jmethodID support
-  static jmethodID get_jmethod_id(instanceKlassHandle ik_h,
+  static jmethodID get_jmethod_id(InstanceKlass* ik,
                      const methodHandle& method_h);
-  static jmethodID get_jmethod_id_fetch_or_update(instanceKlassHandle ik_h,
+  static jmethodID get_jmethod_id_fetch_or_update(InstanceKlass* ik,
                      size_t idnum, jmethodID new_id, jmethodID* new_jmeths,
                      jmethodID* to_dealloc_id_p,
                      jmethodID** to_dealloc_jmeths_p);
@@ -1308,17 +1308,17 @@
 
   // Static methods that are used to implement member methods where an exposed this pointer
   // is needed due to possible GCs
-  static bool link_class_impl                           (instanceKlassHandle this_k, bool throw_verifyerror, TRAPS);
-  static bool verify_code                               (instanceKlassHandle this_k, bool throw_verifyerror, TRAPS);
-  static void initialize_impl                           (instanceKlassHandle this_k, TRAPS);
-  static void initialize_super_interfaces               (instanceKlassHandle this_k, TRAPS);
-  static void eager_initialize_impl                     (instanceKlassHandle this_k);
-  static void set_initialization_state_and_notify_impl  (instanceKlassHandle this_k, ClassState state, TRAPS);
-  static void call_class_initializer_impl               (instanceKlassHandle this_k, TRAPS);
-  static Klass* array_klass_impl                        (instanceKlassHandle this_k, bool or_null, int n, TRAPS);
-  static void do_local_static_fields_impl               (instanceKlassHandle this_k, void f(fieldDescriptor* fd, Handle, TRAPS), Handle, TRAPS);
+  static bool link_class_impl                           (InstanceKlass* this_k, bool throw_verifyerror, TRAPS);
+  static bool verify_code                               (InstanceKlass* this_k, bool throw_verifyerror, TRAPS);
+  static void initialize_impl                           (InstanceKlass* this_k, TRAPS);
+  static void initialize_super_interfaces               (InstanceKlass* this_k, TRAPS);
+  static void eager_initialize_impl                     (InstanceKlass* this_k);
+  static void set_initialization_state_and_notify_impl  (InstanceKlass* this_k, ClassState state, TRAPS);
+  static void call_class_initializer_impl               (InstanceKlass* this_k, TRAPS);
+  static Klass* array_klass_impl                        (InstanceKlass* this_k, bool or_null, int n, TRAPS);
+  static void do_local_static_fields_impl               (InstanceKlass* this_k, void f(fieldDescriptor* fd, Handle, TRAPS), Handle, TRAPS);
   /* jni_id_for_impl for jfieldID only */
-  static JNIid* jni_id_for_impl                         (instanceKlassHandle this_k, int offset);
+  static JNIid* jni_id_for_impl                         (InstanceKlass* this_k, int offset);
 
   // Returns the array class for the n'th dimension
   Klass* array_klass_impl(bool or_null, int n, TRAPS);
@@ -1447,7 +1447,7 @@
   int _idx;
  public:
 
-  InnerClassesIterator(instanceKlassHandle k) {
+  InnerClassesIterator(const InstanceKlass* k) {
     _inner_classes = k->inner_classes();
     if (k->inner_classes() != NULL) {
       _length = _inner_classes->length();
--- a/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -39,23 +39,21 @@
 
 int InstanceMirrorKlass::_offset_of_static_fields = 0;
 
-int InstanceMirrorKlass::instance_size(KlassHandle k) {
-  if (k() != NULL && k->is_instance_klass()) {
-    return align_object_size(size_helper() + InstanceKlass::cast(k())->static_field_size());
+int InstanceMirrorKlass::instance_size(Klass* k) {
+  if (k != NULL && k->is_instance_klass()) {
+    return align_object_size(size_helper() + InstanceKlass::cast(k)->static_field_size());
   }
   return size_helper();
 }
 
-instanceOop InstanceMirrorKlass::allocate_instance(KlassHandle k, TRAPS) {
+instanceOop InstanceMirrorKlass::allocate_instance(Klass* k, TRAPS) {
   // Query before forming handle.
   int size = instance_size(k);
-  KlassHandle h_k(THREAD, this);
-
   assert(size > 0, "total object size must be positive: %d", size);
 
   // Since mirrors can be variable sized because of the static fields, store
   // the size in the mirror itself.
-  return (instanceOop)CollectedHeap::class_allocate(h_k, size, CHECK_NULL);
+  return (instanceOop)CollectedHeap::class_allocate(this, size, CHECK_NULL);
 }
 
 int InstanceMirrorKlass::oop_size(oop obj) const {
--- a/hotspot/src/share/vm/oops/instanceMirrorKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/instanceMirrorKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -82,10 +82,10 @@
   int compute_static_oop_field_count(oop obj);
 
   // Given a Klass return the size of the instance
-  int instance_size(KlassHandle k);
+  int instance_size(Klass* k);
 
   // allocation
-  instanceOop allocate_instance(KlassHandle k, TRAPS);
+  instanceOop allocate_instance(Klass* k, TRAPS);
 
   // GC specific object visitors
   //
--- a/hotspot/src/share/vm/oops/klass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/klass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -264,7 +264,6 @@
   }
 
   if (secondary_supers() == NULL) {
-    KlassHandle this_kh (THREAD, this);
 
     // Now compute the list of secondary supertypes.
     // Secondaries can occasionally be on the super chain,
@@ -286,7 +285,7 @@
 
     GrowableArray<Klass*>* primaries = new GrowableArray<Klass*>(extras);
 
-    for (p = this_kh->super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) {
+    for (p = super(); !(p == NULL || p->can_be_primary_super()); p = p->super()) {
       int i;                    // Scan for overflow primaries being duplicates of 2nd'arys
 
       // This happens frequently for very deeply nested arrays: the
@@ -324,7 +323,7 @@
     }
   #endif
 
-    this_kh->set_secondary_supers(s2);
+    set_secondary_supers(s2);
   }
 }
 
@@ -698,7 +697,7 @@
 }
 
 klassVtable* Klass::vtable() const {
-  return new klassVtable(this, start_of_vtable(), vtable_length() / vtableEntry::size());
+  return new klassVtable(const_cast<Klass*>(this), start_of_vtable(), vtable_length() / vtableEntry::size());
 }
 
 vtableEntry* Klass::start_of_vtable() const {
--- a/hotspot/src/share/vm/oops/klassVtable.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -40,7 +40,7 @@
 #include "utilities/copy.hpp"
 
 inline InstanceKlass* klassVtable::ik() const {
-  return InstanceKlass::cast(_klass());
+  return InstanceKlass::cast(_klass);
 }
 
 bool klassVtable::is_preinitialized_vtable() {
@@ -128,8 +128,8 @@
 // Copy super class's vtable to the first part (prefix) of this class's vtable,
 // and return the number of entries copied.  Expects that 'super' is the Java
 // super class (arrays can have "array" super classes that must be skipped).
-int klassVtable::initialize_from_super(KlassHandle super) {
-  if (super.is_null()) {
+int klassVtable::initialize_from_super(Klass* super) {
+  if (super == NULL) {
     return 0;
   } else if (is_preinitialized_vtable()) {
     // A shared class' vtable is preinitialized at dump time. No need to copy
@@ -160,18 +160,18 @@
 void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) {
 
   // Note:  Arrays can have intermediate array supers.  Use java_super to skip them.
-  KlassHandle super (THREAD, klass()->java_super());
+  Klass* super = _klass->java_super();
   int nofNewEntries = 0;
 
   bool is_shared = _klass->is_shared();
 
-  if (!klass()->is_array_klass()) {
+  if (!_klass->is_array_klass()) {
     ResourceMark rm(THREAD);
     log_develop_debug(vtables)("Initializing: %s", _klass->name()->as_C_string());
   }
 
 #ifdef ASSERT
-  oop* end_of_obj = (oop*)_klass() + _klass()->size();
+  oop* end_of_obj = (oop*)_klass + _klass->size();
   oop* end_of_vtable = (oop*)&table()[_length];
   assert(end_of_vtable <= end_of_obj, "vtable extends beyond end");
 #endif
@@ -184,7 +184,7 @@
   }
 
   int super_vtable_len = initialize_from_super(super);
-  if (klass()->is_array_klass()) {
+  if (_klass->is_array_klass()) {
     assert(super_vtable_len == _length, "arrays shouldn't introduce new methods");
   } else {
     assert(_klass->is_instance_klass(), "must be InstanceKlass");
@@ -327,7 +327,7 @@
 }
 
 static void log_vtables(int i, bool overrides, methodHandle target_method,
-                        KlassHandle target_klass, Method* super_method,
+                        Klass* target_klass, Method* super_method,
                         Thread* thread) {
 #ifndef PRODUCT
   if (log_develop_is_enabled(Trace, vtables)) {
@@ -432,7 +432,7 @@
   Symbol* name = target_method()->name();
   Symbol* signature = target_method()->signature();
 
-  KlassHandle target_klass(THREAD, target_method()->method_holder());
+  Klass* target_klass = target_method()->method_holder();
   if (target_klass == NULL) {
     target_klass = _klass;
   }
@@ -955,7 +955,7 @@
       if (!(*trace_name_printed)) {
         log_info(redefine, class, update)
           ("adjust: klassname=%s for methods from name=%s",
-           klass()->external_name(), old_method->method_holder()->external_name());
+           _klass->external_name(), old_method->method_holder()->external_name());
         *trace_name_printed = true;
       }
       log_debug(redefine, class, update, vtables)
@@ -1025,17 +1025,17 @@
   }
 }
 
-klassItable::klassItable(instanceKlassHandle klass) {
+klassItable::klassItable(InstanceKlass* klass) {
   _klass = klass;
 
   if (klass->itable_length() > 0) {
     itableOffsetEntry* offset_entry = (itableOffsetEntry*)klass->start_of_itable();
     if (offset_entry  != NULL && offset_entry->interface_klass() != NULL) { // Check that itable is initialized
       // First offset entry points to the first method_entry
-      intptr_t* method_entry  = (intptr_t *)(((address)klass()) + offset_entry->offset());
+      intptr_t* method_entry  = (intptr_t *)(((address)klass) + offset_entry->offset());
       intptr_t* end         = klass->end_of_itable();
 
-      _table_offset      = (intptr_t*)offset_entry - (intptr_t*)klass();
+      _table_offset      = (intptr_t*)offset_entry - (intptr_t*)klass;
       _size_offset_table = (method_entry - ((intptr_t*)offset_entry)) / itableOffsetEntry::size();
       _size_method_table = (end - method_entry)                  / itableMethodEntry::size();
       assert(_table_offset >= 0 && _size_offset_table >= 0 && _size_method_table >= 0, "wrong computation");
@@ -1056,7 +1056,7 @@
   if (_klass->is_interface()) {
     // This needs to go after vtable indices are assigned but
     // before implementors need to know the number of itable indices.
-    assign_itable_indices_for_interface(_klass());
+    assign_itable_indices_for_interface(_klass);
   }
 
   // Cannot be setup doing bootstrapping, interfaces don't have
@@ -1078,9 +1078,9 @@
     for(i = 0; i < num_interfaces; i++) {
       itableOffsetEntry* ioe = offset_entry(i);
       HandleMark hm(THREAD);
-      KlassHandle interf_h (THREAD, ioe->interface_klass());
-      assert(interf_h() != NULL && ioe->offset() != 0, "bad offset entry in itable");
-      initialize_itable_for_interface(ioe->offset(), interf_h, checkconstraints, CHECK);
+      Klass* interf = ioe->interface_klass();
+      assert(interf != NULL && ioe->offset() != 0, "bad offset entry in itable");
+      initialize_itable_for_interface(ioe->offset(), interf, checkconstraints, CHECK);
     }
 
   }
@@ -1169,14 +1169,14 @@
 }
 
 
-void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) {
-  Array<Method*>* methods = InstanceKlass::cast(interf_h())->methods();
+void klassItable::initialize_itable_for_interface(int method_table_offset, Klass* interf, bool checkconstraints, TRAPS) {
+  Array<Method*>* methods = InstanceKlass::cast(interf)->methods();
   int nof_methods = methods->length();
   HandleMark hm;
   assert(nof_methods > 0, "at least one method must exist for interface to be in vtable");
-  Handle interface_loader (THREAD, InstanceKlass::cast(interf_h())->class_loader());
+  Handle interface_loader (THREAD, InstanceKlass::cast(interf)->class_loader());
 
-  int ime_count = method_count_for_interface(interf_h());
+  int ime_count = method_count_for_interface(interf);
   for (int i = 0; i < nof_methods; i++) {
     Method* m = methods->at(i);
     methodHandle target;
@@ -1189,7 +1189,7 @@
       // Entry does not resolve. Leave it empty for AbstractMethodError.
         if (!(target == NULL) && !target->is_public()) {
           // Stuff an IllegalAccessError throwing method in there instead.
-          itableOffsetEntry::method_entry(_klass(), method_table_offset)[m->itable_index()].
+          itableOffsetEntry::method_entry(_klass, method_table_offset)[m->itable_index()].
               initialize(Universe::throw_illegal_access_error());
         }
     } else {
@@ -1215,7 +1215,7 @@
             const char* loader1 = SystemDictionary::loader_name(method_holder_loader());
             char* current = _klass->name()->as_C_string();
             const char* loader2 = SystemDictionary::loader_name(interface_loader());
-            char* iface = InstanceKlass::cast(interf_h())->name()->as_C_string();
+            char* iface = InstanceKlass::cast(interf)->name()->as_C_string();
             char* failed_type_name = failed_type_symbol->as_C_string();
             size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
               strlen(current) + strlen(loader2) + strlen(iface) +
@@ -1231,14 +1231,14 @@
       // ime may have moved during GC so recalculate address
       int ime_num = m->itable_index();
       assert(ime_num < ime_count, "oob");
-      itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target());
+      itableOffsetEntry::method_entry(_klass, method_table_offset)[ime_num].initialize(target());
       if (log_develop_is_enabled(Trace, itables)) {
         ResourceMark rm(THREAD);
         if (target() != NULL) {
           outputStream* logst = Log(itables)::trace_stream();
           char* sig = target()->name_and_sig_as_C_string();
           logst->print("interface: %s, ime_num: %d, target: %s, method_holder: %s ",
-                       interf_h()->internal_name(), ime_num, sig,
+                       interf->internal_name(), ime_num, sig,
                        target()->method_holder()->internal_name());
           logst->print("target_method flags: ");
           target()->print_linkage_flags(logst);
@@ -1408,7 +1408,7 @@
 
 
 // Fill out offset table and interface klasses into the itable space
-void klassItable::setup_itable_offset_table(instanceKlassHandle klass) {
+void klassItable::setup_itable_offset_table(InstanceKlass* klass) {
   if (klass->itable_length() == 0) return;
   assert(!klass->is_interface(), "Should have zero length itable");
 
@@ -1433,7 +1433,7 @@
   assert((oop*)(end) == (oop*)(ime + nof_methods),                      "wrong offset calculation (2)");
 
   // Visit all interfaces and initialize itable offset table
-  SetupItableClosure sic((address)klass(), ioe, ime);
+  SetupItableClosure sic((address)klass, ioe, ime);
   visit_all_interfaces(klass->transitive_interfaces(), &sic);
 
 #ifdef ASSERT
@@ -1476,7 +1476,7 @@
   if (!forced && _verify_count == Universe::verify_count()) return;
   _verify_count = Universe::verify_count();
 #endif
-  oop* end_of_obj = (oop*)_klass() + _klass()->size();
+  oop* end_of_obj = (oop*)_klass + _klass->size();
   oop* end_of_vtable = (oop *)&table()[_length];
   if (end_of_vtable > end_of_obj) {
     fatal("klass %s: klass object too short (vtable extends beyond end)",
@@ -1516,8 +1516,7 @@
 
 void vtableEntry::verify(klassVtable* vt, outputStream* st) {
   NOT_PRODUCT(FlagSetting fs(IgnoreLockingAssertions, true));
-  KlassHandle vtklass_h = vt->klass();
-  Klass* vtklass = vtklass_h();
+  Klass* vtklass = vt->klass();
   if (vtklass->is_instance_klass() &&
      (InstanceKlass::cast(vtklass)->major_version() >= klassVtable::VTABLE_TRANSITIVE_OVERRIDE_VERSION)) {
     assert(method() != NULL, "must have set method");
@@ -1525,7 +1524,7 @@
   if (method() != NULL) {
     method()->verify();
     // we sub_type, because it could be a miranda method
-    if (!vtklass_h->is_subtype_of(method()->method_holder())) {
+    if (!vtklass->is_subtype_of(method()->method_holder())) {
 #ifndef PRODUCT
       print();
 #endif
--- a/hotspot/src/share/vm/oops/klassVtable.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -42,7 +42,7 @@
 class vtableEntry;
 
 class klassVtable : public ResourceObj {
-  KlassHandle  _klass;            // my klass
+  Klass*       _klass;            // my klass
   int          _tableOffset;      // offset of start of vtable data within klass
   int          _length;           // length of vtable (number of entries)
 #ifndef PRODUCT
@@ -57,13 +57,13 @@
   };
 
  public:
-  klassVtable(KlassHandle h_klass, void* base, int length) : _klass(h_klass) {
-    _tableOffset = (address)base - (address)h_klass(); _length = length;
+  klassVtable(Klass* klass, void* base, int length) : _klass(klass) {
+    _tableOffset = (address)base - (address)klass; _length = length;
   }
 
   // accessors
-  vtableEntry* table() const      { return (vtableEntry*)(address(_klass()) + _tableOffset); }
-  KlassHandle klass() const       { return _klass;  }
+  vtableEntry* table() const      { return (vtableEntry*)(address(_klass) + _tableOffset); }
+  Klass* klass() const            { return _klass;  }
   int length() const              { return _length; }
   inline Method* method_at(int i) const;
   inline Method* unchecked_method_at(int i) const;
@@ -125,7 +125,7 @@
 
  private:
   void copy_vtable_to(vtableEntry* start);
-  int  initialize_from_super(KlassHandle super);
+  int  initialize_from_super(Klass* super);
   int  index_of(Method* m, int len) const; // same as index_of, but search only up to len
   void put_method_at(Method* m, int index);
   static bool needs_new_vtable_entry(methodHandle m,
@@ -290,14 +290,14 @@
 //
 class klassItable : public ResourceObj {
  private:
-  instanceKlassHandle  _klass;             // my klass
+  InstanceKlass*       _klass;             // my klass
   int                  _table_offset;      // offset of start of itable data within klass (in words)
   int                  _size_offset_table; // size of offset table (in itableOffset entries)
   int                  _size_method_table; // size of methodtable (in itableMethodEntry entries)
 
-  void initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS);
+  void initialize_itable_for_interface(int method_table_offset, Klass* interf_h, bool checkconstraints, TRAPS);
  public:
-  klassItable(instanceKlassHandle klass);
+  klassItable(InstanceKlass* klass);
 
   itableOffsetEntry* offset_entry(int i) { assert(0 <= i && i <= _size_offset_table, "index out of bounds");
                                            return &((itableOffsetEntry*)vtable_start())[i]; }
@@ -329,7 +329,7 @@
   static int assign_itable_indices_for_interface(Klass* klass);
   static int method_count_for_interface(Klass* klass);
   static int compute_itable_size(Array<Klass*>* transitive_interfaces);
-  static void setup_itable_offset_table(instanceKlassHandle klass);
+  static void setup_itable_offset_table(InstanceKlass* klass);
 
   // Resolving of method to index
   static Method* method_for_itable_index(Klass* klass, int itable_index);
@@ -337,7 +337,7 @@
   // Debugging/Statistics
   static void print_statistics() PRODUCT_RETURN;
  private:
-  intptr_t* vtable_start() const { return ((intptr_t*)_klass()) + _table_offset; }
+  intptr_t* vtable_start() const { return ((intptr_t*)_klass) + _table_offset; }
   intptr_t* method_start() const { return vtable_start() + _size_offset_table * itableOffsetEntry::size(); }
 
   // Helper methods
--- a/hotspot/src/share/vm/oops/method.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/method.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -173,7 +173,7 @@
   return buf;
 }
 
-int Method::fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS) {
+int Method::fast_exception_handler_bci_for(methodHandle mh, Klass* ex_klass, int throw_bci, TRAPS) {
   // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index)
   // access exception table
   ExceptionTable table(mh());
@@ -192,16 +192,15 @@
       int klass_index = table.catch_type_index(i);
       if (klass_index == 0) {
         return handler_bci;
-      } else if (ex_klass.is_null()) {
+      } else if (ex_klass == NULL) {
         return handler_bci;
       } else {
         // we know the exception class => get the constraint class
         // this may require loading of the constraint class; if verification
         // fails or some other exception occurs, return handler_bci
         Klass* k = pool->klass_at(klass_index, CHECK_(handler_bci));
-        KlassHandle klass = KlassHandle(THREAD, k);
-        assert(klass.not_null(), "klass not loaded");
-        if (ex_klass->is_subtype_of(klass())) {
+        assert(k != NULL, "klass not loaded");
+        if (ex_klass->is_subtype_of(k)) {
           return handler_bci;
         }
       }
@@ -1271,7 +1270,7 @@
   ResourceMark rm;
   methodHandle empty;
 
-  KlassHandle holder = SystemDictionary::MethodHandle_klass();
+  InstanceKlass* holder = SystemDictionary::MethodHandle_klass();
   Symbol* name = MethodHandles::signature_polymorphic_intrinsic_name(iid);
   assert(iid == MethodHandles::signature_polymorphic_name_id(name), "");
   if (TraceMethodHandles) {
@@ -1289,7 +1288,7 @@
     ConstantPool* cp_oop = ConstantPool::allocate(loader_data, cp_length, CHECK_(empty));
     cp = constantPoolHandle(THREAD, cp_oop);
   }
-  cp->set_pool_holder(InstanceKlass::cast(holder()));
+  cp->set_pool_holder(holder);
   cp->symbol_at_put(_imcp_invoke_name,       name);
   cp->symbol_at_put(_imcp_invoke_signature,  signature);
   cp->set_has_preresolution();
--- a/hotspot/src/share/vm/oops/method.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/method.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -323,7 +323,7 @@
   // exception handler which caused the exception to be thrown, which
   // is needed for proper retries. See, for example,
   // InterpreterRuntime::exception_handler_for_exception.
-  static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS);
+  static int fast_exception_handler_bci_for(methodHandle mh, Klass* ex_klass, int throw_bci, TRAPS);
 
   // method data access
   MethodData* method_data() const              {
@@ -811,8 +811,7 @@
   static void print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) PRODUCT_RETURN;
 
   // Get this method's jmethodID -- allocate if it doesn't exist
-  jmethodID jmethod_id()                            { methodHandle this_h(this);
-                                                      return InstanceKlass::get_jmethod_id(method_holder(), this_h); }
+  jmethodID jmethod_id()                            { return InstanceKlass::get_jmethod_id(method_holder(), this); }
 
   // Lookup the jmethodID for this method.  Return NULL if not found.
   // NOTE that this function can be called from a signal handler
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -46,26 +46,26 @@
 #include "utilities/copy.hpp"
 #include "utilities/macros.hpp"
 
-ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS) {
+ObjArrayKlass* ObjArrayKlass::allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS) {
   assert(ObjArrayKlass::header_size() <= InstanceKlass::header_size(),
       "array klasses must be same size as InstanceKlass");
 
   int size = ArrayKlass::static_size(ObjArrayKlass::header_size());
 
-  return new (loader_data, size, THREAD) ObjArrayKlass(n, klass_handle, name);
+  return new (loader_data, size, THREAD) ObjArrayKlass(n, k, name);
 }
 
 Klass* ObjArrayKlass::allocate_objArray_klass(ClassLoaderData* loader_data,
-                                                int n, KlassHandle element_klass, TRAPS) {
+                                                int n, Klass* element_klass, TRAPS) {
 
   // Eagerly allocate the direct array supertype.
-  KlassHandle super_klass = KlassHandle();
+  Klass* super_klass = NULL;
   if (!Universe::is_bootstrapping() || SystemDictionary::Object_klass_loaded()) {
-    KlassHandle element_super (THREAD, element_klass->super());
-    if (element_super.not_null()) {
+    Klass* element_super = element_klass->super();
+    if (element_super != NULL) {
       // The element type has a direct super.  E.g., String[] has direct super of Object[].
-      super_klass = KlassHandle(THREAD, element_super->array_klass_or_null());
-      bool supers_exist = super_klass.not_null();
+      super_klass = element_super->array_klass_or_null();
+      bool supers_exist = super_klass != NULL;
       // Also, see if the element has secondary supertypes.
       // We need an array type for each.
       Array<Klass*>* element_supers = element_klass->secondary_supers();
@@ -78,34 +78,30 @@
       }
       if (!supers_exist) {
         // Oops.  Not allocated yet.  Back out, allocate it, and retry.
-        KlassHandle ek;
+        Klass* ek = NULL;
         {
           MutexUnlocker mu(MultiArray_lock);
           MutexUnlocker mc(Compile_lock);   // for vtables
-          Klass* sk = element_super->array_klass(CHECK_0);
-          super_klass = KlassHandle(THREAD, sk);
+          super_klass = element_super->array_klass(CHECK_0);
           for( int i = element_supers->length()-1; i >= 0; i-- ) {
-            KlassHandle elem_super (THREAD, element_supers->at(i));
+            Klass* elem_super = element_supers->at(i);
             elem_super->array_klass(CHECK_0);
           }
           // Now retry from the beginning
-          Klass* klass_oop = element_klass->array_klass(n, CHECK_0);
-          // Create a handle because the enclosing brace, when locking
-          // can cause a gc.  Better to have this function return a Handle.
-          ek = KlassHandle(THREAD, klass_oop);
+          ek = element_klass->array_klass(n, CHECK_0);
         }  // re-lock
-        return ek();
+        return ek;
       }
     } else {
       // The element type is already Object.  Object[] has direct super of Object.
-      super_klass = KlassHandle(THREAD, SystemDictionary::Object_klass());
+      super_klass = SystemDictionary::Object_klass();
     }
   }
 
   // Create type name for klass.
   Symbol* name = NULL;
   if (!element_klass->is_instance_klass() ||
-      (name = InstanceKlass::cast(element_klass())->array_name()) == NULL) {
+      (name = InstanceKlass::cast(element_klass)->array_name()) == NULL) {
 
     ResourceMark rm(THREAD);
     char *name_str = element_klass->name()->as_C_string();
@@ -124,7 +120,7 @@
     new_str[idx++] = '\0';
     name = SymbolTable::new_permanent_symbol(new_str, CHECK_0);
     if (element_klass->is_instance_klass()) {
-      InstanceKlass* ik = InstanceKlass::cast(element_klass());
+      InstanceKlass* ik = InstanceKlass::cast(element_klass);
       ik->set_array_name(name);
     }
   }
@@ -146,9 +142,9 @@
   return oak;
 }
 
-ObjArrayKlass::ObjArrayKlass(int n, KlassHandle element_klass, Symbol* name) : ArrayKlass(name) {
+ObjArrayKlass::ObjArrayKlass(int n, Klass* element_klass, Symbol* name) : ArrayKlass(name) {
   this->set_dimension(n);
-  this->set_element_klass(element_klass());
+  this->set_element_klass(element_klass);
   // decrement refcount because object arrays are not explicitly freed.  The
   // InstanceKlass array_name() keeps the name counted while the klass is
   // loaded.
@@ -156,9 +152,9 @@
 
   Klass* bk;
   if (element_klass->is_objArray_klass()) {
-    bk = ObjArrayKlass::cast(element_klass())->bottom_klass();
+    bk = ObjArrayKlass::cast(element_klass)->bottom_klass();
   } else {
-    bk = element_klass();
+    bk = element_klass;
   }
   assert(bk != NULL && (bk->is_instance_klass() || bk->is_typeArray_klass()), "invalid bottom klass");
   this->set_bottom_klass(bk);
@@ -178,8 +174,7 @@
   if (length >= 0) {
     if (length <= arrayOopDesc::max_array_length(T_OBJECT)) {
       int size = objArrayOopDesc::object_size(length);
-      KlassHandle h_k(THREAD, this);
-      return (objArrayOop)CollectedHeap::array_allocate(h_k, size, length, THREAD);
+      return (objArrayOop)CollectedHeap::array_allocate(this, size, length, THREAD);
     } else {
       report_java_out_of_memory("Requested array size exceeds VM limit");
       JvmtiExport::post_array_size_exhausted();
@@ -196,14 +191,14 @@
   int length = *sizes;
   // Call to lower_dimension uses this pointer, so most be called before a
   // possible GC
-  KlassHandle h_lower_dimension(THREAD, lower_dimension());
+  Klass* ld_klass = lower_dimension();
   // If length < 0 allocate will throw an exception.
   objArrayOop array = allocate(length, CHECK_NULL);
   objArrayHandle h_array (THREAD, array);
   if (rank > 1) {
     if (length != 0) {
       for (int index = 0; index < length; index++) {
-        ArrayKlass* ak = ArrayKlass::cast(h_lower_dimension());
+        ArrayKlass* ak = ArrayKlass::cast(ld_klass);
         oop sub_array = ak->multi_allocate(rank-1, &sizes[1], CHECK_NULL);
         h_array->obj_at_put(index, sub_array);
       }
--- a/hotspot/src/share/vm/oops/objArrayKlass.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/objArrayKlass.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -39,8 +39,8 @@
   Klass* _bottom_klass;             // The one-dimensional type (InstanceKlass or TypeArrayKlass)
 
   // Constructor
-  ObjArrayKlass(int n, KlassHandle element_klass, Symbol* name);
-  static ObjArrayKlass* allocate(ClassLoaderData* loader_data, int n, KlassHandle klass_handle, Symbol* name, TRAPS);
+  ObjArrayKlass(int n, Klass* element_klass, Symbol* name);
+  static ObjArrayKlass* allocate(ClassLoaderData* loader_data, int n, Klass* k, Symbol* name, TRAPS);
  public:
   // For dummy objects
   ObjArrayKlass() {}
@@ -69,7 +69,7 @@
 
   // Allocation
   static Klass* allocate_objArray_klass(ClassLoaderData* loader_data,
-                                          int n, KlassHandle element_klass, TRAPS);
+                                          int n, Klass* element_klass, TRAPS);
 
   objArrayOop allocate(int length, TRAPS);
   oop multi_allocate(int rank, jint* sizes, TRAPS);
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -102,13 +102,12 @@
   if (length >= 0) {
     if (length <= max_length()) {
       size_t size = typeArrayOopDesc::object_size(layout_helper(), length);
-      KlassHandle h_k(THREAD, this);
       typeArrayOop t;
       CollectedHeap* ch = Universe::heap();
       if (do_zero) {
-        t = (typeArrayOop)CollectedHeap::array_allocate(h_k, (int)size, length, CHECK_NULL);
+        t = (typeArrayOop)CollectedHeap::array_allocate(this, (int)size, length, CHECK_NULL);
       } else {
-        t = (typeArrayOop)CollectedHeap::array_allocate_nozero(h_k, (int)size, length, CHECK_NULL);
+        t = (typeArrayOop)CollectedHeap::array_allocate_nozero(this, (int)size, length, CHECK_NULL);
       }
       return t;
     } else {
--- a/hotspot/src/share/vm/prims/jni.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jni.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -386,8 +386,8 @@
   Handle loader;
   Handle protection_domain;
   // Find calling class
-  instanceKlassHandle k (THREAD, thread->security_get_caller_class(0));
-  if (k.not_null()) {
+  Klass* k = thread->security_get_caller_class(0);
+  if (k != NULL) {
     loader = Handle(THREAD, k->class_loader());
     // Special handling to make sure JNI_OnLoad and JNI_OnUnload are executed
     // in the correct class context.
@@ -395,9 +395,9 @@
         k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) {
       JavaValue result(T_OBJECT);
       JavaCalls::call_static(&result, k,
-                                      vmSymbols::getFromClass_name(),
-                                      vmSymbols::void_class_signature(),
-                                      thread);
+                             vmSymbols::getFromClass_name(),
+                             vmSymbols::void_class_signature(),
+                             thread);
       if (HAS_PENDING_EXCEPTION) {
         Handle ex(thread, thread->pending_exception());
         CLEAR_PENDING_EXCEPTION;
@@ -455,12 +455,11 @@
     mirror = java_lang_reflect_Method::clazz(reflected);
     slot   = java_lang_reflect_Method::slot(reflected);
   }
-  Klass* k     = java_lang_Class::as_Klass(mirror);
-
-  KlassHandle k1(THREAD, k);
+  Klass* k1 = java_lang_Class::as_Klass(mirror);
+
   // Make sure class is initialized before handing id's out to methods
-  k1()->initialize(CHECK_NULL);
-  Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot);
+  k1->initialize(CHECK_NULL);
+  Method* m = InstanceKlass::cast(k1)->method_with_idnum(slot);
   ret = m==NULL? NULL : m->jmethod_id();  // return NULL if reflected method deleted
   return ret;
 JNI_END
@@ -479,18 +478,17 @@
   // field is a handle to a java.lang.reflect.Field object
   oop reflected   = JNIHandles::resolve_non_null(field);
   oop mirror      = java_lang_reflect_Field::clazz(reflected);
-  Klass* k      = java_lang_Class::as_Klass(mirror);
+  Klass* k1       = java_lang_Class::as_Klass(mirror);
   int slot        = java_lang_reflect_Field::slot(reflected);
   int modifiers   = java_lang_reflect_Field::modifiers(reflected);
 
-  KlassHandle k1(THREAD, k);
   // Make sure class is initialized before handing id's out to fields
-  k1()->initialize(CHECK_NULL);
+  k1->initialize(CHECK_NULL);
 
   // First check if this is a static field
   if (modifiers & JVM_ACC_STATIC) {
-    intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
-    JNIid* id = InstanceKlass::cast(k1())->jni_id_for(offset);
+    intptr_t offset = InstanceKlass::cast(k1)->field_offset( slot );
+    JNIid* id = InstanceKlass::cast(k1)->jni_id_for(offset);
     assert(id != NULL, "corrupt Field object");
     debug_only(id->set_is_static_field_id();)
     // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
@@ -501,9 +499,9 @@
   // The slot is the index of the field description in the field-array
   // The jfieldID is the offset of the field within the object
   // It may also have hash bits for k, if VerifyJNIFields is turned on.
-  intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
-  assert(InstanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
-  ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
+  intptr_t offset = InstanceKlass::cast(k1)->field_offset( slot );
+  assert(InstanceKlass::cast(k1)->contains_field_offset(offset), "stay within object");
+  ret = jfieldIDWorkaround::to_instance_jfieldID(k1, offset);
   return ret;
 JNI_END
 
@@ -677,8 +675,7 @@
         JavaValue result(T_VOID);
         JavaCalls::call_virtual(&result,
                                 ex,
-                                KlassHandle(THREAD,
-                                  SystemDictionary::Throwable_klass()),
+                                SystemDictionary::Throwable_klass(),
                                 vmSymbols::printStackTrace_name(),
                                 vmSymbols::void_method_signature(),
                                 THREAD);
@@ -1156,11 +1153,9 @@
       }
     } else {
       // interface call
-      KlassHandle h_holder(THREAD, holder);
-
       int itbl_index = m->itable_index();
       Klass* k = h_recv->klass();
-      selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
+      selected_method = InstanceKlass::cast(k)->method_at_itable(holder, itbl_index, CHECK);
     }
   }
 
@@ -1192,14 +1187,14 @@
 
 
 static instanceOop alloc_object(jclass clazz, TRAPS) {
-  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
   if (k == NULL) {
     ResourceMark rm(THREAD);
     THROW_(vmSymbols::java_lang_InstantiationException(), NULL);
   }
-  k()->check_valid_for_instantiation(false, CHECK_NULL);
-  InstanceKlass::cast(k())->initialize(CHECK_NULL);
-  instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD);
+  k->check_valid_for_instantiation(false, CHECK_NULL);
+  k->initialize(CHECK_NULL);
+  instanceOop ih = InstanceKlass::cast(k)->allocate_instance(THREAD);
   return ih;
 }
 
@@ -1338,26 +1333,25 @@
     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
   }
 
-  KlassHandle klass(THREAD,
-               java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
+  Klass* klass = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
 
   // Make sure class is linked and initialized before handing id's out to
   // Method*s.
-  klass()->initialize(CHECK_NULL);
+  klass->initialize(CHECK_NULL);
 
   Method* m;
   if (name == vmSymbols::object_initializer_name() ||
       name == vmSymbols::class_initializer_name()) {
     // Never search superclasses for constructors
     if (klass->is_instance_klass()) {
-      m = InstanceKlass::cast(klass())->find_method(name, signature);
+      m = InstanceKlass::cast(klass)->find_method(name, signature);
     } else {
       m = NULL;
     }
   } else {
     m = klass->lookup_method(name, signature);
     if (m == NULL &&  klass->is_instance_klass()) {
-      m = InstanceKlass::cast(klass())->lookup_method_in_ordered_interfaces(name, signature);
+      m = InstanceKlass::cast(klass)->lookup_method_in_ordered_interfaces(name, signature);
     }
   }
   if (m == NULL || (m->is_static() != is_static)) {
@@ -1879,8 +1873,8 @@
   JavaValue jvalue(Tag); \
   JNI_ArgumentPusherVaArg ap(methodID, args); \
   /* Make sure class is initialized before trying to invoke its method */ \
-  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls))); \
-  k()->initialize(CHECK_0); \
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); \
+  k->initialize(CHECK_0); \
   jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
   va_end(args); \
   ret = jvalue.get_##ResultType(); \
@@ -2037,20 +2031,19 @@
   if (fieldname == NULL || signame == NULL) {
     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
   }
-  KlassHandle k(THREAD,
-                java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
   // Make sure class is initialized before handing id's out to fields
-  k()->initialize(CHECK_NULL);
+  k->initialize(CHECK_NULL);
 
   fieldDescriptor fd;
-  if (!k()->is_instance_klass() ||
-      !InstanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) {
+  if (!k->is_instance_klass() ||
+      !InstanceKlass::cast(k)->find_field(fieldname, signame, false, &fd)) {
     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
   }
 
   // A jfieldID for a non-static field is simply the offset of the field within the instanceOop
   // It may also have hash bits for k, if VerifyJNIFields is turned on.
-  ret = jfieldIDWorkaround::to_instance_jfieldID(k(), fd.offset());
+  ret = jfieldIDWorkaround::to_instance_jfieldID(k, fd.offset());
   return ret;
 JNI_END
 
@@ -2292,14 +2285,13 @@
   if (fieldname == NULL || signame == NULL) {
     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
   }
-  KlassHandle k(THREAD,
-                java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
   // Make sure class is initialized before handing id's out to static fields
-  k()->initialize(CHECK_NULL);
+  k->initialize(CHECK_NULL);
 
   fieldDescriptor fd;
-  if (!k()->is_instance_klass() ||
-      !InstanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
+  if (!k->is_instance_klass() ||
+      !InstanceKlass::cast(k)->find_field(fieldname, signame, true, &fd)) {
     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
   }
 
@@ -2603,11 +2595,10 @@
  HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(env, length, elementClass, initialElement);
   jobjectArray ret = NULL;
   DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
-  KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
-  Klass* ako = ek()->array_klass(CHECK_NULL);
-  KlassHandle ak = KlassHandle(THREAD, ako);
-  ObjArrayKlass::cast(ak())->initialize(CHECK_NULL);
-  objArrayOop result = ObjArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
+  Klass* ek = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass));
+  Klass* ak = ek->array_klass(CHECK_NULL);
+  ObjArrayKlass::cast(ak)->initialize(CHECK_NULL);
+  objArrayOop result = ObjArrayKlass::cast(ak)->allocate(length, CHECK_NULL);
   oop initial_value = JNIHandles::resolve(initialElement);
   if (initial_value != NULL) {  // array already initialized with NULL
     for (int index = 0; index < length; index++) {
@@ -2936,8 +2927,7 @@
 // is not native.  Ask JVM TI what prefixes have been specified.  Then check
 // to see if the native method is now wrapped with the prefixes.  See the
 // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
-static Method* find_prefixed_native(KlassHandle k,
-                                      Symbol* name, Symbol* signature, TRAPS) {
+static Method* find_prefixed_native(Klass* k, Symbol* name, Symbol* signature, TRAPS) {
 #if INCLUDE_JVMTI
   ResourceMark rm(THREAD);
   Method* method;
@@ -2958,7 +2948,7 @@
     if (trial_name == NULL) {
       continue; // no such symbol, so this prefix wasn't used, try the next prefix
     }
-    method = k()->lookup_method(trial_name, signature);
+    method = k->lookup_method(trial_name, signature);
     if (method == NULL) {
       continue; // signature doesn't match, try the next prefix
     }
@@ -2974,13 +2964,13 @@
   return NULL; // not found
 }
 
-static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
-  Method* method = k()->lookup_method(name, signature);
+static bool register_native(Klass* k, Symbol* name, Symbol* signature, address entry, TRAPS) {
+  Method* method = k->lookup_method(name, signature);
   if (method == NULL) {
     ResourceMark rm;
     stringStream st;
     st.print("Method %s name or signature does not match",
-             Method::name_and_sig_as_C_string(k(), name, signature));
+             Method::name_and_sig_as_C_string(k, name, signature));
     THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
   }
   if (!method->is_native()) {
@@ -2990,7 +2980,7 @@
       ResourceMark rm;
       stringStream st;
       st.print("Method %s is not declared as native",
-               Method::name_and_sig_as_C_string(k(), name, signature));
+               Method::name_and_sig_as_C_string(k, name, signature));
       THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
     }
   }
@@ -3021,7 +3011,7 @@
   jint ret = 0;
   DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
 
-  KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
 
   for (int index = 0; index < nMethods; index++) {
     const char* meth_name = methods[index].name;
@@ -3037,12 +3027,12 @@
     if (name == NULL || signature == NULL) {
       ResourceMark rm;
       stringStream st;
-      st.print("Method %s.%s%s not found", h_k()->external_name(), meth_name, meth_sig);
+      st.print("Method %s.%s%s not found", k->external_name(), meth_name, meth_sig);
       // Must return negative value on failure
       THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
     }
 
-    bool res = register_native(h_k, name, signature,
+    bool res = register_native(k, name, signature,
                                (address) methods[index].fnPtr, THREAD);
     if (!res) {
       ret = -1;
--- a/hotspot/src/share/vm/prims/jvm.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvm.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -341,7 +341,7 @@
   Handle value_str  = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);
   JavaCalls::call_virtual(&r,
                           props,
-                          KlassHandle(THREAD, SystemDictionary::Properties_klass()),
+                          SystemDictionary::Properties_klass(),
                           vmSymbols::put_name(),
                           vmSymbols::object_object_object_signature(),
                           key_str,
@@ -621,7 +621,7 @@
 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
   JVMWrapper("JVM_Clone");
   Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
-  const KlassHandle klass (THREAD, obj->klass());
+  Klass* klass = obj->klass();
   JvmtiVMObjectAllocEventCollector oam;
 
 #ifdef ASSERT
@@ -997,9 +997,7 @@
   if (k == NULL) {
     // If the class is not already loaded, try to see if it's in the shared
     // archive for the current classloader (h_loader).
-    instanceKlassHandle ik = SystemDictionaryShared::find_or_load_shared_class(
-        klass_name, h_loader, CHECK_NULL);
-    k = ik();
+    k = SystemDictionaryShared::find_or_load_shared_class(klass_name, h_loader, CHECK_NULL);
   }
 #endif
   return (k == NULL) ? NULL :
@@ -1077,11 +1075,11 @@
     return (jobjectArray) JNIHandles::make_local(env, r);
   }
 
-  KlassHandle klass(thread, java_lang_Class::as_Klass(mirror));
+  Klass* klass = java_lang_Class::as_Klass(mirror);
   // Figure size of result array
   int size;
   if (klass->is_instance_klass()) {
-    size = InstanceKlass::cast(klass())->local_interfaces()->length();
+    size = InstanceKlass::cast(klass)->local_interfaces()->length();
   } else {
     assert(klass->is_objArray_klass() || klass->is_typeArray_klass(), "Illegal mirror klass");
     size = 2;
@@ -1094,7 +1092,7 @@
   if (klass->is_instance_klass()) {
     // Regular instance klass, fill in all local interfaces
     for (int index = 0; index < size; index++) {
-      Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index);
+      Klass* k = InstanceKlass::cast(klass)->local_interfaces()->at(index);
       result->obj_at_put(index, k->java_mirror());
     }
   } else {
@@ -1178,7 +1176,7 @@
 JVM_END
 
 
-static bool is_authorized(Handle context, instanceKlassHandle klass, TRAPS) {
+static bool is_authorized(Handle context, InstanceKlass* klass, TRAPS) {
   // If there is a security manager and protection domain, check the access
   // in the protection domain, otherwise it is authorized.
   if (java_lang_System::has_security_manager()) {
@@ -1218,7 +1216,7 @@
   Handle obj = pd_klass->allocate_instance_handle(CHECK_NULL);
   // Call constructor ProtectionDomain(null, null);
   JavaValue result(T_VOID);
-  JavaCalls::call_special(&result, obj, KlassHandle(THREAD, pd_klass),
+  JavaCalls::call_special(&result, obj, pd_klass,
                           vmSymbols::object_initializer_name(),
                           vmSymbols::codesource_permissioncollection_signature(),
                           Handle(), Handle(), CHECK_NULL);
@@ -1249,7 +1247,7 @@
   }
 
   Method* method        = vfst.method();
-  instanceKlassHandle klass (THREAD, method->method_holder());
+  InstanceKlass* klass  = method->method_holder();
 
   // Check that action object understands "Object run()"
   Handle h_context;
@@ -1452,7 +1450,7 @@
     return (jobjectArray)JNIHandles::make_local(env, result);
   }
 
-  instanceKlassHandle k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
   InnerClassesIterator iter(k);
 
   if (iter.length() == 0) {
@@ -1479,9 +1477,9 @@
       // before attempting to find the class.
       if (cp->klass_name_at_matches(k, ooff)) {
         Klass* outer_klass = cp->klass_at(ooff, CHECK_NULL);
-        if (outer_klass == k()) {
+        if (outer_klass == k) {
            Klass* ik = cp->klass_at(ioff, CHECK_NULL);
-           instanceKlassHandle inner_klass (THREAD, ik);
+           InstanceKlass* inner_klass = InstanceKlass::cast(ik);
 
            // Throws an exception if outer klass has not declared k as
            // an inner klass
@@ -1532,7 +1530,7 @@
       !java_lang_Class::as_Klass(mirror)->is_instance_klass()) {
     return NULL;
   }
-  instanceKlassHandle k(THREAD, InstanceKlass::cast(java_lang_Class::as_Klass(mirror)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
   int ooff = 0, noff = 0;
   if (InstanceKlass::find_inner_classes_attr(k, &ooff, &noff, THREAD)) {
     if (noff != 0) {
@@ -1590,19 +1588,19 @@
   int slot      = java_lang_reflect_Field::slot(reflected);
   int modifiers = java_lang_reflect_Field::modifiers(reflected);
 
-  KlassHandle kh(THREAD, k);
-  intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  intptr_t offset = ik->field_offset(slot);
 
   if (modifiers & JVM_ACC_STATIC) {
     // for static fields we only look in the current class
-    if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) {
+    if (!ik->find_local_field_from_offset(offset, true, &fd)) {
       assert(false, "cannot find static field");
       return false;
     }
   } else {
     // for instance fields we start with the current class and work
     // our way up through the superclass chain
-    if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) {
+    if (!ik->find_field_from_offset(offset, false, &fd)) {
       assert(false, "cannot find instance field");
       return false;
     }
@@ -1757,7 +1755,7 @@
     return (jobjectArray) JNIHandles::make_local(env, res);
   }
 
-  instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
   constantPoolHandle cp(THREAD, k->constants());
 
   // Ensure class is linked
@@ -1768,7 +1766,7 @@
 
   if (publicOnly) {
     num_fields = 0;
-    for (JavaFieldStream fs(k()); !fs.done(); fs.next()) {
+    for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
       if (fs.access_flags().is_public()) ++num_fields;
     }
   } else {
@@ -1782,7 +1780,7 @@
   fieldDescriptor fd;
   for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
     if (!publicOnly || fs.access_flags().is_public()) {
-      fd.reinitialize(k(), fs.index());
+      fd.reinitialize(k, fs.index());
       oop field = Reflection::new_field(&fd, CHECK_NULL);
       result->obj_at_put(out_idx, field);
       ++out_idx;
@@ -1817,7 +1815,7 @@
     return (jobjectArray) JNIHandles::make_local(env, res);
   }
 
-  instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
 
   // Ensure class is linked
   k->link_class(CHECK_NULL);
@@ -1913,7 +1911,7 @@
   if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
     Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
     if (k->is_instance_klass()) {
-      instanceKlassHandle k_h(THREAD, k);
+      InstanceKlass* k_h = InstanceKlass::cast(k);
       Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
       reflect_ConstantPool::set_cp(jcp(), k_h->constants());
       return JNIHandles::make_local(jcp());
@@ -1975,7 +1973,7 @@
     k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
     if (k_o == NULL) return NULL;
   }
-  instanceKlassHandle k(THREAD, k_o);
+  InstanceKlass* k = InstanceKlass::cast(k_o);
   Symbol* name = cp->uncached_name_ref_at(index);
   Symbol* sig  = cp->uncached_signature_ref_at(index);
   methodHandle m (THREAD, k->find_method(name, sig));
@@ -2026,7 +2024,7 @@
     k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
     if (k_o == NULL) return NULL;
   }
-  instanceKlassHandle k(THREAD, k_o);
+  InstanceKlass* k = InstanceKlass::cast(k_o);
   Symbol* name = cp->uncached_name_ref_at(index);
   Symbol* sig  = cp->uncached_signature_ref_at(index);
   fieldDescriptor fd;
@@ -2616,7 +2614,8 @@
     case JVM_CONSTANT_Fieldref: {
       Symbol* name      = cp->uncached_name_ref_at(cp_index);
       Symbol* signature = cp->uncached_signature_ref_at(cp_index);
-      for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
+      InstanceKlass* ik = InstanceKlass::cast(k_called);
+      for (JavaFieldStream fs(ik); !fs.done(); fs.next()) {
         if (fs.name() == name && fs.signature() == signature) {
           return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
         }
@@ -2770,7 +2769,7 @@
   JavaValue result(T_VOID);
   JavaCalls::call_virtual(&result,
                           obj,
-                          KlassHandle(THREAD, SystemDictionary::Thread_klass()),
+                          SystemDictionary::Thread_klass(),
                           vmSymbols::run_method_name(),
                           vmSymbols::void_method_signature(),
                           THREAD);
@@ -3226,7 +3225,7 @@
   }
 
   // Collect method holders
-  GrowableArray<KlassHandle>* klass_array = new GrowableArray<KlassHandle>();
+  GrowableArray<Klass*>* klass_array = new GrowableArray<Klass*>();
   for (; !vfst.at_end(); vfst.security_next()) {
     Method* m = vfst.method();
     // Native frames are not returned
@@ -3593,12 +3592,11 @@
   //   if there is no security manager in 3-arg Class.forName().
   Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
 
-  KlassHandle klass_handle(THREAD, klass);
   // Check if we should initialize the class
-  if (init && klass_handle->is_instance_klass()) {
-    klass_handle->initialize(CHECK_NULL);
+  if (init && klass->is_instance_klass()) {
+    klass->initialize(CHECK_NULL);
   }
-  return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
+  return (jclass) JNIHandles::make_local(env, klass->java_mirror());
 }
 
 
@@ -3746,25 +3744,25 @@
   if (!k->is_instance_klass()) {
     return NULL;
   }
-  instanceKlassHandle ik_h(THREAD, k);
-  int encl_method_class_idx = ik_h->enclosing_method_class_index();
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  int encl_method_class_idx = ik->enclosing_method_class_index();
   if (encl_method_class_idx == 0) {
     return NULL;
   }
   objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL);
   objArrayHandle dest(THREAD, dest_o);
-  Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
+  Klass* enc_k = ik->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
   dest->obj_at_put(0, enc_k->java_mirror());
-  int encl_method_method_idx = ik_h->enclosing_method_method_index();
+  int encl_method_method_idx = ik->enclosing_method_method_index();
   if (encl_method_method_idx != 0) {
-    Symbol* sym = ik_h->constants()->symbol_at(
+    Symbol* sym = ik->constants()->symbol_at(
                         extract_low_short_from_int(
-                          ik_h->constants()->name_and_type_at(encl_method_method_idx)));
+                          ik->constants()->name_and_type_at(encl_method_method_idx)));
     Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
     dest->obj_at_put(1, str());
-    sym = ik_h->constants()->symbol_at(
+    sym = ik->constants()->symbol_at(
               extract_high_short_from_int(
-                ik_h->constants()->name_and_type_at(encl_method_method_idx)));
+                ik->constants()->name_and_type_at(encl_method_method_idx)));
     str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
     dest->obj_at_put(2, str());
   }
@@ -3799,8 +3797,8 @@
   int num_flags = Arguments::num_jvm_flags();
   int num_args = Arguments::num_jvm_args();
 
-  instanceKlassHandle ik (THREAD, SystemDictionary::String_klass());
-  objArrayOop r = oopFactory::new_objArray(ik(), num_args + num_flags, CHECK_NULL);
+  InstanceKlass* ik = SystemDictionary::String_klass();
+  objArrayOop r = oopFactory::new_objArray(ik, num_args + num_flags, CHECK_NULL);
   objArrayHandle result_h(THREAD, r);
 
   int index = 0;
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -40,20 +40,20 @@
 // JVMSpec|     field_info fields[fields_count];
 void JvmtiClassFileReconstituter::write_field_infos() {
   HandleMark hm(thread());
-  Array<AnnotationArray*>* fields_anno = ikh()->fields_annotations();
-  Array<AnnotationArray*>* fields_type_anno = ikh()->fields_type_annotations();
+  Array<AnnotationArray*>* fields_anno = ik()->fields_annotations();
+  Array<AnnotationArray*>* fields_type_anno = ik()->fields_type_annotations();
 
   // Compute the real number of Java fields
-  int java_fields = ikh()->java_fields_count();
+  int java_fields = ik()->java_fields_count();
 
   write_u2(java_fields);
-  for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) {
+  for (JavaFieldStream fs(ik()); !fs.done(); fs.next()) {
     AccessFlags access_flags = fs.access_flags();
     int name_index = fs.name_index();
     int signature_index = fs.signature_index();
     int initial_value_index = fs.initval_index();
     guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
-    // int offset = ikh()->field_offset( index );
+    // int offset = ik()->field_offset( index );
     int generic_signature_index = fs.generic_signature_index();
     AnnotationArray* anno = fields_anno == NULL ? NULL : fields_anno->at(fs.index());
     AnnotationArray* type_anno = fields_type_anno == NULL ? NULL : fields_type_anno->at(fs.index());
@@ -278,11 +278,11 @@
 // JVMSpec|     u2 sourcefile_index;
 // JVMSpec|   }
 void JvmtiClassFileReconstituter::write_source_file_attribute() {
-  assert(ikh()->source_file_name() != NULL, "caller must check");
+  assert(ik()->source_file_name() != NULL, "caller must check");
 
   write_attribute_name_index("SourceFile");
   write_u4(2);  // always length 2
-  write_u2(symbol_to_cpool_index(ikh()->source_file_name()));
+  write_u2(symbol_to_cpool_index(ik()->source_file_name()));
 }
 
 // Write SourceDebugExtension attribute
@@ -292,12 +292,12 @@
 // JSR45|       u1 debug_extension[attribute_length];
 // JSR45|   }
 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
-  assert(ikh()->source_debug_extension() != NULL, "caller must check");
+  assert(ik()->source_debug_extension() != NULL, "caller must check");
 
   write_attribute_name_index("SourceDebugExtension");
-  int len = (int)strlen(ikh()->source_debug_extension());
+  int len = (int)strlen(ik()->source_debug_extension());
   write_u4(len);
-  u1* ext = (u1*)ikh()->source_debug_extension();
+  u1* ext = (u1*)ik()->source_debug_extension();
   for (int i=0; i<len; i++) {
     write_u1(ext[i]);
   }
@@ -317,7 +317,7 @@
 
 // Compute the number of entries in the InnerClasses attribute
 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
-  InnerClassesIterator iter(ikh());
+  InnerClassesIterator iter(ik());
   return iter.length();
 }
 
@@ -387,7 +387,7 @@
 // JVMSpec|     } classes[number_of_classes];
 // JVMSpec|   }
 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
-  InnerClassesIterator iter(ikh());
+  InnerClassesIterator iter(ik());
   guarantee(iter.length() != 0 && iter.length() == length,
             "caller must check");
   u2 entry_count = length / InstanceKlass::inner_class_next_offset;
@@ -618,18 +618,18 @@
 // JVMSpec|     attribute_info attributes[attributes_count];
 void JvmtiClassFileReconstituter::write_class_attributes() {
   u2 inner_classes_length = inner_classes_attribute_length();
-  Symbol* generic_signature = ikh()->generic_signature();
-  AnnotationArray* anno = ikh()->class_annotations();
-  AnnotationArray* type_anno = ikh()->class_type_annotations();
+  Symbol* generic_signature = ik()->generic_signature();
+  AnnotationArray* anno = ik()->class_annotations();
+  AnnotationArray* type_anno = ik()->class_type_annotations();
 
   int attr_count = 0;
   if (generic_signature != NULL) {
     ++attr_count;
   }
-  if (ikh()->source_file_name() != NULL) {
+  if (ik()->source_file_name() != NULL) {
     ++attr_count;
   }
-  if (ikh()->source_debug_extension() != NULL) {
+  if (ik()->source_debug_extension() != NULL) {
     ++attr_count;
   }
   if (inner_classes_length > 0) {
@@ -650,10 +650,10 @@
   if (generic_signature != NULL) {
     write_signature_attribute(symbol_to_cpool_index(generic_signature));
   }
-  if (ikh()->source_file_name() != NULL) {
+  if (ik()->source_file_name() != NULL) {
     write_source_file_attribute();
   }
-  if (ikh()->source_debug_extension() != NULL) {
+  if (ik()->source_debug_extension() != NULL) {
     write_source_debug_extension_attribute();
   }
   if (inner_classes_length > 0) {
@@ -675,7 +675,7 @@
 // JVMSpec|     method_info methods[methods_count];
 void JvmtiClassFileReconstituter::write_method_infos() {
   HandleMark hm(thread());
-  Array<Method*>* methods = ikh()->methods();
+  Array<Method*>* methods = ik()->methods();
   int num_methods = methods->length();
   int num_overpass = 0;
 
@@ -697,7 +697,7 @@
 
     // invert the method order mapping
     for (index = 0; index < num_methods; index++) {
-      original_index = ikh()->method_ordering()->at(index);
+      original_index = ik()->method_ordering()->at(index);
       assert(original_index >= 0 && original_index < num_methods,
              "invalid original method index");
       method_order.at_put(original_index, index);
@@ -727,8 +727,8 @@
 
   // JVMSpec|           u2 minor_version;
   // JVMSpec|           u2 major_version;
-  write_u2(ikh()->minor_version());
-  u2 major = ikh()->major_version();
+  write_u2(ik()->minor_version());
+  u2 major = ik()->major_version();
   write_u2(major);
 
   // JVMSpec|           u2 constant_pool_count;
@@ -737,24 +737,24 @@
   copy_cpool_bytes(writeable_address(cpool_size()));
 
   // JVMSpec|           u2 access_flags;
-  write_u2(ikh()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
+  write_u2(ik()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
 
   // JVMSpec|           u2 this_class;
   // JVMSpec|           u2 super_class;
-  write_u2(class_symbol_to_cpool_index(ikh()->name()));
-  Klass* super_class = ikh()->super();
+  write_u2(class_symbol_to_cpool_index(ik()->name()));
+  Klass* super_class = ik()->super();
   write_u2(super_class == NULL? 0 :  // zero for java.lang.Object
                 class_symbol_to_cpool_index(super_class->name()));
 
   // JVMSpec|           u2 interfaces_count;
   // JVMSpec|           u2 interfaces[interfaces_count];
-  Array<Klass*>* interfaces =  ikh()->local_interfaces();
+  Array<Klass*>* interfaces =  ik()->local_interfaces();
   int num_interfaces = interfaces->length();
   write_u2(num_interfaces);
   for (int index = 0; index < num_interfaces; index++) {
     HandleMark hm(thread());
-    instanceKlassHandle iikh(thread(), interfaces->at(index));
-    write_u2(class_symbol_to_cpool_index(iikh->name()));
+    InstanceKlass* iik = InstanceKlass::cast(interfaces->at(index));
+    write_u2(class_symbol_to_cpool_index(iik->name()));
   }
 
   // JVMSpec|           u2 fields_count;
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -34,11 +34,11 @@
   SymbolHashMap*       _symmap;
   SymbolHashMap*       _classmap;
   constantPoolHandle   _cpool;
-  instanceKlassHandle  _ikh;
+  InstanceKlass*       _ik;
   jvmtiError           _err;
 
  protected:
-  instanceKlassHandle  ikh()     { return _ikh; };
+  InstanceKlass*  ik()           { return _ik; };
   constantPoolHandle   cpool()   { return _cpool; };
 
   u2 symbol_to_cpool_index(Symbol* sym) {
@@ -52,10 +52,10 @@
  public:
   // Calls to this constructor must be proceeded by a ResourceMark
   // and a HandleMark
-  JvmtiConstantPoolReconstituter(instanceKlassHandle ikh){
+  JvmtiConstantPoolReconstituter(InstanceKlass* ik){
     set_error(JVMTI_ERROR_NONE);
-    _ikh = ikh;
-    _cpool = constantPoolHandle(Thread::current(), ikh->constants());
+    _ik = ik;
+    _cpool = constantPoolHandle(Thread::current(), ik->constants());
     _symmap = new SymbolHashMap();
     _classmap = new SymbolHashMap();
     _cpool_size = _cpool->hash_entries_to(_symmap, _classmap);
@@ -138,8 +138,8 @@
  public:
   // Calls to this constructor must be proceeded by a ResourceMark
   // and a HandleMark
-  JvmtiClassFileReconstituter(instanceKlassHandle ikh) :
-                                      JvmtiConstantPoolReconstituter(ikh) {
+  JvmtiClassFileReconstituter(InstanceKlass* ik) :
+                                      JvmtiConstantPoolReconstituter(ik) {
     _buffer_size = initial_buffer_size;
     _buffer = _buffer_ptr = NEW_RESOURCE_ARRAY(u1, _buffer_size);
     _thread = Thread::current();
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -400,21 +400,20 @@
       return JVMTI_ERROR_UNMODIFIABLE_CLASS;
     }
 
-    Klass* k_oop = java_lang_Class::as_Klass(k_mirror);
-    KlassHandle klass(current_thread, k_oop);
+    Klass* klass = java_lang_Class::as_Klass(k_mirror);
 
     jint status = klass->jvmti_class_status();
     if (status & (JVMTI_CLASS_STATUS_ERROR)) {
       return JVMTI_ERROR_INVALID_CLASS;
     }
 
-    instanceKlassHandle ikh(current_thread, k_oop);
-    if (ikh->get_cached_class_file_bytes() == NULL) {
+    InstanceKlass* ik = InstanceKlass::cast(klass);
+    if (ik->get_cached_class_file_bytes() == NULL) {
       // Not cached, we need to reconstitute the class file from the
       // VM representation. We don't attach the reconstituted class
       // bytes to the InstanceKlass here because they have not been
       // validated and we're not at a safepoint.
-      JvmtiClassFileReconstituter reconstituter(ikh);
+      JvmtiClassFileReconstituter reconstituter(ik);
       if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
         return reconstituter.get_error();
       }
@@ -424,8 +423,8 @@
                                                        reconstituter.class_file_bytes();
     } else {
       // it is cached, get it from the cache
-      class_definitions[index].class_byte_count = ikh->get_cached_class_file_len();
-      class_definitions[index].class_bytes      = ikh->get_cached_class_file_bytes();
+      class_definitions[index].class_byte_count = ik->get_cached_class_file_len();
+      class_definitions[index].class_bytes      = ik->get_cached_class_file_bytes();
     }
     class_definitions[index].klass              = jcls;
   }
@@ -667,8 +666,6 @@
       return JVMTI_ERROR_INTERNAL;
     }
 
-    instanceKlassHandle loader_ik(THREAD, loader->klass());
-
     // Invoke the appendToClassPathForInstrumentation method - if the method
     // is not found it means the loader doesn't support adding to the class path
     // in the live phase.
@@ -676,7 +673,7 @@
       JavaValue res(T_VOID);
       JavaCalls::call_special(&res,
                               loader,
-                              loader_ik,
+                              loader->klass(),
                               vmSymbols::appendToClassPathForInstrumentation_name(),
                               vmSymbols::appendToClassPathForInstrumentation_signature(),
                               path,
@@ -1781,7 +1778,7 @@
 jvmtiError
 JvmtiEnv::FollowReferences(jint heap_filter, jclass klass, jobject initial_object, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
   // check klass if provided
-  Klass* k_oop = NULL;
+  Klass* k = NULL;
   if (klass != NULL) {
     oop k_mirror = JNIHandles::resolve_external_guard(klass);
     if (k_mirror == NULL) {
@@ -1790,18 +1787,17 @@
     if (java_lang_Class::is_primitive(k_mirror)) {
       return JVMTI_ERROR_NONE;
     }
-    k_oop = java_lang_Class::as_Klass(k_mirror);
-    if (k_oop == NULL) {
+    k = java_lang_Class::as_Klass(k_mirror);
+    if (klass == NULL) {
       return JVMTI_ERROR_INVALID_CLASS;
     }
   }
 
   Thread *thread = Thread::current();
   HandleMark hm(thread);
-  KlassHandle kh (thread, k_oop);
 
   TraceTime t("FollowReferences", TRACETIME_LOG(Debug, jvmti, objecttagging));
-  JvmtiTagMap::tag_map_for(this)->follow_references(heap_filter, kh, initial_object, callbacks, user_data);
+  JvmtiTagMap::tag_map_for(this)->follow_references(heap_filter, k, initial_object, callbacks, user_data);
   return JVMTI_ERROR_NONE;
 } /* end FollowReferences */
 
@@ -1812,7 +1808,7 @@
 jvmtiError
 JvmtiEnv::IterateThroughHeap(jint heap_filter, jclass klass, const jvmtiHeapCallbacks* callbacks, const void* user_data) {
   // check klass if provided
-  Klass* k_oop = NULL;
+  Klass* k = NULL;
   if (klass != NULL) {
     oop k_mirror = JNIHandles::resolve_external_guard(klass);
     if (k_mirror == NULL) {
@@ -1821,18 +1817,14 @@
     if (java_lang_Class::is_primitive(k_mirror)) {
       return JVMTI_ERROR_NONE;
     }
-    k_oop = java_lang_Class::as_Klass(k_mirror);
-    if (k_oop == NULL) {
+    k = java_lang_Class::as_Klass(k_mirror);
+    if (k == NULL) {
       return JVMTI_ERROR_INVALID_CLASS;
     }
   }
 
-  Thread *thread = Thread::current();
-  HandleMark hm(thread);
-  KlassHandle kh (thread, k_oop);
-
   TraceTime t("IterateThroughHeap", TRACETIME_LOG(Debug, jvmti, objecttagging));
-  JvmtiTagMap::tag_map_for(this)->iterate_through_heap(heap_filter, kh, callbacks, user_data);
+  JvmtiTagMap::tag_map_for(this)->iterate_through_heap(heap_filter, k, callbacks, user_data);
   return JVMTI_ERROR_NONE;
 } /* end IterateThroughHeap */
 
@@ -1909,7 +1901,7 @@
   TraceTime t("IterateOverHeap", TRACETIME_LOG(Debug, jvmti, objecttagging));
   Thread *thread = Thread::current();
   HandleMark hm(thread);
-  JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, KlassHandle(), heap_object_callback, user_data);
+  JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, NULL, heap_object_callback, user_data);
   return JVMTI_ERROR_NONE;
 } /* end IterateOverHeap */
 
@@ -1923,13 +1915,10 @@
     // DO PRIMITIVE CLASS PROCESSING
     return JVMTI_ERROR_NONE;
   }
-  Klass* k_oop = java_lang_Class::as_Klass(k_mirror);
-  if (k_oop == NULL) {
+  Klass* klass = java_lang_Class::as_Klass(k_mirror);
+  if (klass == NULL) {
     return JVMTI_ERROR_INVALID_CLASS;
   }
-  Thread *thread = Thread::current();
-  HandleMark hm(thread);
-  KlassHandle klass (thread, k_oop);
   TraceTime t("IterateOverInstancesOfClass", TRACETIME_LOG(Debug, jvmti, objecttagging));
   JvmtiTagMap::tag_map_for(this)->iterate_over_heap(object_filter, klass, heap_object_callback, user_data);
   return JVMTI_ERROR_NONE;
@@ -2408,9 +2397,9 @@
     *methods_ptr = (jmethodID*) jvmtiMalloc(0 * sizeof(jmethodID));
     return JVMTI_ERROR_NONE;
   }
-  instanceKlassHandle instanceK_h(current_thread, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   // Allocate the result and fill it in
-  int result_length = instanceK_h->methods()->length();
+  int result_length = ik->methods()->length();
   jmethodID* result_list = (jmethodID*)jvmtiMalloc(result_length * sizeof(jmethodID));
   int index;
   bool jmethodids_found = true;
@@ -2419,8 +2408,8 @@
     // Use the original method ordering indices stored in the class, so we can emit
     // jmethodIDs in the order they appeared in the class file
     for (index = 0; index < result_length; index++) {
-      Method* m = instanceK_h->methods()->at(index);
-      int original_index = instanceK_h->method_ordering()->at(index);
+      Method* m = ik->methods()->at(index);
+      int original_index = ik->method_ordering()->at(index);
       assert(original_index >= 0 && original_index < result_length, "invalid original method index");
       jmethodID id;
       if (jmethodids_found) {
@@ -2429,7 +2418,7 @@
           // If we find an uninitialized value, make sure there is
           // enough space for all the uninitialized values we might
           // find.
-          instanceK_h->ensure_space_for_methodids(index);
+          ik->ensure_space_for_methodids(index);
           jmethodids_found = false;
           id = m->jmethod_id();
         }
@@ -2441,7 +2430,7 @@
   } else {
     // otherwise just copy in any order
     for (index = 0; index < result_length; index++) {
-      Method* m = instanceK_h->methods()->at(index);
+      Method* m = ik->methods()->at(index);
       jmethodID id;
       if (jmethodids_found) {
         id = m->find_jmethod_id_or_null();
@@ -2449,7 +2438,7 @@
           // If we find an uninitialized value, make sure there is
           // enough space for all the uninitialized values we might
           // find.
-          instanceK_h->ensure_space_for_methodids(index);
+          ik->ensure_space_for_methodids(index);
           jmethodids_found = false;
           id = m->jmethod_id();
         }
@@ -2494,11 +2483,11 @@
   }
 
 
-  instanceKlassHandle instanceK_h(current_thread, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   int result_count = 0;
   // First, count the fields.
-  FilteredFieldStream flds(instanceK_h, true, true);
+  FilteredFieldStream flds(ik, true, true);
   result_count = flds.field_count();
 
   // Allocate the result and fill it in
@@ -2507,9 +2496,9 @@
   // this is the reverse order of what FieldStream hands out.
   int id_index = (result_count - 1);
 
-  for (FilteredFieldStream src_st(instanceK_h, true, true); !src_st.eos(); src_st.next()) {
+  for (FilteredFieldStream src_st(ik, true, true); !src_st.eos(); src_st.next()) {
     result_list[id_index--] = jfieldIDWorkaround::to_jfieldID(
-                                            instanceK_h, src_st.offset(),
+                                            ik, src_st.offset(),
                                             src_st.access_flags().is_static());
   }
   assert(id_index == -1, "just checking");
@@ -2574,10 +2563,7 @@
   if (java_lang_Class::is_primitive(k_mirror)) {
     return JVMTI_ERROR_ABSENT_INFORMATION;
   }
-  Klass* k_oop = java_lang_Class::as_Klass(k_mirror);
-  Thread *thread = Thread::current();
-  HandleMark hm(thread);
-  KlassHandle klass(thread, k_oop);
+  Klass* klass = java_lang_Class::as_Klass(k_mirror);
 
   jint status = klass->jvmti_class_status();
   if (status & (JVMTI_CLASS_STATUS_ERROR)) {
@@ -2587,7 +2573,7 @@
     return JVMTI_ERROR_ABSENT_INFORMATION;
   }
 
-  instanceKlassHandle ik(thread, k_oop);
+  InstanceKlass* ik = InstanceKlass::cast(klass);
   *minor_version_ptr = ik->minor_version();
   *major_version_ptr = ik->major_version();
 
@@ -2605,11 +2591,9 @@
     return JVMTI_ERROR_ABSENT_INFORMATION;
   }
 
-  Klass* k_oop = java_lang_Class::as_Klass(k_mirror);
+  Klass* klass = java_lang_Class::as_Klass(k_mirror);
   Thread *thread = Thread::current();
-  HandleMark hm(thread);
   ResourceMark rm(thread);
-  KlassHandle klass(thread, k_oop);
 
   jint status = klass->jvmti_class_status();
   if (status & (JVMTI_CLASS_STATUS_ERROR)) {
@@ -2619,8 +2603,8 @@
     return JVMTI_ERROR_ABSENT_INFORMATION;
   }
 
-  instanceKlassHandle ikh(thread, k_oop);
-  JvmtiConstantPoolReconstituter reconstituter(ikh);
+  InstanceKlass* ik = InstanceKlass::cast(klass);
+  JvmtiConstantPoolReconstituter reconstituter(ik);
   if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
     return reconstituter.get_error();
   }
@@ -2639,7 +2623,7 @@
     return reconstituter.get_error();
   }
 
-  constantPoolHandle  constants(thread, ikh->constants());
+  constantPoolHandle  constants(thread, ik->constants());
   *constant_pool_count_ptr      = constants->length();
   *constant_pool_byte_count_ptr = cpool_size;
   *constant_pool_bytes_ptr      = cpool_bytes;
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1366,13 +1366,13 @@
   if (tos == atos && jobj != NULL) { // NULL reference is allowed
     Handle ob_h(current_thread, JNIHandles::resolve_external_guard(jobj));
     NULL_CHECK(ob_h, JVMTI_ERROR_INVALID_OBJECT);
-    KlassHandle ob_kh = KlassHandle(current_thread, ob_h()->klass());
-    NULL_CHECK(ob_kh, JVMTI_ERROR_INVALID_OBJECT);
+    Klass* ob_k = ob_h()->klass();
+    NULL_CHECK(ob_k, JVMTI_ERROR_INVALID_OBJECT);
 
     // Method return type signature.
     char* ty_sign = 1 + strchr(signature->as_C_string(), ')');
 
-    if (!VM_GetOrSetLocal::is_assignable(ty_sign, ob_kh(), current_thread)) {
+    if (!VM_GetOrSetLocal::is_assignable(ty_sign, ob_k, current_thread)) {
       return JVMTI_ERROR_TYPE_MISMATCH;
     }
     *ret_ob_h = ob_h;
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -267,14 +267,14 @@
 
 public:
   JvmtiClassFileLoadEventMark(JavaThread *thread, Symbol* name,
-     Handle class_loader, Handle prot_domain, KlassHandle *class_being_redefined) : JvmtiThreadEventMark(thread) {
+     Handle class_loader, Handle prot_domain, Klass* class_being_redefined) : JvmtiThreadEventMark(thread) {
       _class_name = name != NULL? name->as_utf8() : NULL;
       _jloader = (jobject)to_jobject(class_loader());
       _protection_domain = (jobject)to_jobject(prot_domain());
       if (class_being_redefined == NULL) {
         _class_being_redefined = NULL;
       } else {
-        _class_being_redefined = (jclass)to_jclass((*class_being_redefined)());
+        _class_being_redefined = (jclass)to_jclass(class_being_redefined);
       }
   };
   const char *class_name() {
@@ -735,7 +735,7 @@
   JvmtiEnv *           _curr_env;
   JvmtiCachedClassFileData ** _cached_class_file_ptr;
   JvmtiThreadState *   _state;
-  KlassHandle *        _h_class_being_redefined;
+  Klass*               _class_being_redefined;
   JvmtiClassLoadKind   _load_kind;
   bool                 _has_been_modified;
 
@@ -758,9 +758,9 @@
 
     _state = _thread->jvmti_thread_state();
     if (_state != NULL) {
-      _h_class_being_redefined = _state->get_class_being_redefined();
+      _class_being_redefined = _state->get_class_being_redefined();
       _load_kind = _state->get_class_load_kind();
-      Klass* klass = (_h_class_being_redefined == NULL) ? NULL : (*_h_class_being_redefined)();
+      Klass* klass = (_class_being_redefined == NULL) ? NULL : _class_being_redefined;
       if (_load_kind != jvmti_class_load_kind_load && klass != NULL) {
         ModuleEntry* module_entry = InstanceKlass::cast(klass)->module();
         assert(module_entry != NULL, "module_entry should always be set");
@@ -783,7 +783,7 @@
       _state->clear_class_being_redefined();
     } else {
       // redefine and retransform will always set the thread state
-      _h_class_being_redefined = (KlassHandle *) NULL;
+      _class_being_redefined = NULL;
       _load_kind = jvmti_class_load_kind_load;
     }
   }
@@ -828,7 +828,7 @@
     jint new_len = 0;
     JvmtiClassFileLoadEventMark jem(_thread, _h_name, _class_loader,
                                     _h_protection_domain,
-                                    _h_class_being_redefined);
+                                    _class_being_redefined);
     JvmtiJavaThreadEventTransition jet(_thread);
     jvmtiEventClassFileLoadHook callback = env->callbacks()->ClassFileLoadHook;
     if (callback != NULL) {
@@ -1155,7 +1155,6 @@
     return;
   }
   HandleMark hm(thread);
-  KlassHandle kh(thread, klass);
 
   EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_LOAD, ("[%s] Trg Class Load triggered",
                       JvmtiTrace::safe_get_thread_name(thread)));
@@ -1172,8 +1171,8 @@
       }
       EVT_TRACE(JVMTI_EVENT_CLASS_LOAD, ("[%s] Evt Class Load sent %s",
                                          JvmtiTrace::safe_get_thread_name(thread),
-                                         kh()==NULL? "NULL" : kh()->external_name() ));
-      JvmtiClassEventMark jem(thread, kh());
+                                         klass==NULL? "NULL" : klass->external_name() ));
+      JvmtiClassEventMark jem(thread, klass);
       JvmtiJavaThreadEventTransition jet(thread);
       jvmtiEventClassLoad callback = env->callbacks()->ClassLoad;
       if (callback != NULL) {
@@ -1189,7 +1188,6 @@
     return;
   }
   HandleMark hm(thread);
-  KlassHandle kh(thread, klass);
 
   EVT_TRIG_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("[%s] Trg Class Prepare triggered",
                       JvmtiTrace::safe_get_thread_name(thread)));
@@ -1206,8 +1204,8 @@
       }
       EVT_TRACE(JVMTI_EVENT_CLASS_PREPARE, ("[%s] Evt Class Prepare sent %s",
                                             JvmtiTrace::safe_get_thread_name(thread),
-                                            kh()==NULL? "NULL" : kh()->external_name() ));
-      JvmtiClassEventMark jem(thread, kh());
+                                            klass==NULL? "NULL" : klass->external_name() ));
+      JvmtiClassEventMark jem(thread, klass);
       JvmtiJavaThreadEventTransition jet(thread);
       jvmtiEventClassPrepare callback = env->callbacks()->ClassPrepare;
       if (callback != NULL) {
@@ -1223,7 +1221,6 @@
   }
   Thread *thread = Thread::current();
   HandleMark hm(thread);
-  KlassHandle kh(thread, klass);
 
   EVT_TRIG_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Trg Class Unload triggered" ));
   if (JvmtiEventController::is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
@@ -1244,12 +1241,12 @@
       }
       if (env->is_enabled((jvmtiEvent)EXT_EVENT_CLASS_UNLOAD)) {
         EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Evt Class Unload sent %s",
-                  kh()==NULL? "NULL" : kh()->external_name() ));
+                  klass==NULL? "NULL" : klass->external_name() ));
 
         // do everything manually, since this is a proxy - needs special care
         JNIEnv* jni_env = real_thread->jni_environment();
         jthread jt = (jthread)JNIHandles::make_local(real_thread, real_thread->threadObj());
-        jclass jk = (jclass)JNIHandles::make_local(real_thread, kh()->java_mirror());
+        jclass jk = (jclass)JNIHandles::make_local(real_thread, klass->java_mirror());
 
         // Before we call the JVMTI agent, we have to set the state in the
         // thread for which we are proxying.
@@ -1595,7 +1592,7 @@
           current_bci = st.bci();
           do {
             should_repeat = false;
-            KlassHandle eh_klass(thread, exception_handle()->klass());
+            Klass* eh_klass = exception_handle()->klass();
             current_bci = Method::fast_exception_handler_bci_for(
               current_mh, eh_klass, current_bci, THREAD);
             if (HAS_PENDING_EXCEPTION) {
@@ -1743,7 +1740,6 @@
   if (!fd.is_field_access_watched()) return;
 
   HandleMark hm(thread);
-  KlassHandle h_klass(thread, klass);
   Handle h_obj;
   if (!is_static) {
     // non-static field accessors have an object, but we need a handle
@@ -1753,11 +1749,11 @@
   post_field_access(thread,
                     thread->last_frame().interpreter_frame_method(),
                     thread->last_frame().interpreter_frame_bcp(),
-                    h_klass, h_obj, fieldID);
+                    klass, h_obj, fieldID);
 }
 
 void JvmtiExport::post_field_access(JavaThread *thread, Method* method,
-  address location, KlassHandle field_klass, Handle object, jfieldID field) {
+  address location, Klass* field_klass, Handle object, jfieldID field) {
 
   HandleMark hm(thread);
   methodHandle mh(thread, method);
@@ -1779,7 +1775,7 @@
 
       JvmtiEnv *env = ets->get_env();
       JvmtiLocationEventMark jem(thread, mh, location);
-      jclass field_jclass = jem.to_jclass(field_klass());
+      jclass field_jclass = jem.to_jclass(field_klass);
       jobject field_jobject = jem.to_jobject(object());
       JvmtiJavaThreadEventTransition jet(thread);
       jvmtiEventFieldAccess callback = env->callbacks()->FieldAccess;
@@ -1847,22 +1843,21 @@
     assert(obj != NULL, "non-static needs an object");
     h_obj = Handle(thread, obj);
   }
-  KlassHandle h_klass(thread, klass);
   post_field_modification(thread,
                           thread->last_frame().interpreter_frame_method(),
                           thread->last_frame().interpreter_frame_bcp(),
-                          h_klass, h_obj, fieldID, sig_type, value);
+                          klass, h_obj, fieldID, sig_type, value);
 }
 
 void JvmtiExport::post_raw_field_modification(JavaThread *thread, Method* method,
-  address location, KlassHandle field_klass, Handle object, jfieldID field,
+  address location, Klass* field_klass, Handle object, jfieldID field,
   char sig_type, jvalue *value) {
 
   if (sig_type == 'I' || sig_type == 'Z' || sig_type == 'B' || sig_type == 'C' || sig_type == 'S') {
     // 'I' instructions are used for byte, char, short and int.
     // determine which it really is, and convert
     fieldDescriptor fd;
-    bool found = JvmtiEnv::get_field_descriptor(field_klass(), field, &fd);
+    bool found = JvmtiEnv::get_field_descriptor(field_klass, field, &fd);
     // should be found (if not, leave as is)
     if (found) {
       jint ival = value->i;
@@ -1917,7 +1912,7 @@
 }
 
 void JvmtiExport::post_field_modification(JavaThread *thread, Method* method,
-  address location, KlassHandle field_klass, Handle object, jfieldID field,
+  address location, Klass* field_klass, Handle object, jfieldID field,
   char sig_type, jvalue *value_ptr) {
 
   HandleMark hm(thread);
@@ -1943,7 +1938,7 @@
 
       JvmtiEnv *env = ets->get_env();
       JvmtiLocationEventMark jem(thread, mh, location);
-      jclass field_jclass = jem.to_jclass(field_klass());
+      jclass field_jclass = jem.to_jclass(field_klass);
       jobject field_jobject = jem.to_jobject(object());
       JvmtiJavaThreadEventTransition jet(thread);
       jvmtiEventFieldModification callback = env->callbacks()->FieldModification;
--- a/hotspot/src/share/vm/prims/jvmtiExport.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, 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
@@ -150,7 +150,7 @@
   };
 
   static void post_field_modification(JavaThread *thread, Method* method, address location,
-                                      KlassHandle field_klass, Handle object, jfieldID field,
+                                      Klass* field_klass, Handle object, jfieldID field,
                                       char sig_type, jvalue *value);
 
 
@@ -310,7 +310,7 @@
   static void post_field_access_by_jni   (JavaThread *thread, oop obj,
     Klass* klass, jfieldID fieldID, bool is_static) NOT_JVMTI_RETURN;
   static void post_field_access          (JavaThread *thread, Method* method,
-    address location, KlassHandle field_klass, Handle object, jfieldID field) NOT_JVMTI_RETURN;
+    address location, Klass* field_klass, Handle object, jfieldID field) NOT_JVMTI_RETURN;
   static oop jni_SetField_probe          (JavaThread *thread, jobject jobj,
     oop obj, Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
     jvalue *value) NOT_JVMTI_RETURN_(NULL);
@@ -321,7 +321,7 @@
     Klass* klass, jfieldID fieldID, bool is_static, char sig_type,
     jvalue *value);
   static void post_raw_field_modification(JavaThread *thread, Method* method,
-    address location, KlassHandle field_klass, Handle object, jfieldID field,
+    address location, Klass* field_klass, Handle object, jfieldID field,
     char sig_type, jvalue *value) NOT_JVMTI_RETURN;
 
   static void post_method_entry          (JavaThread *thread, Method* method, frame current_frame) NOT_JVMTI_RETURN;
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -287,12 +287,12 @@
 
   // add/remove breakpoint to/from versions of the method that are EMCP.
   Thread *thread = Thread::current();
-  instanceKlassHandle ikh = instanceKlassHandle(thread, _method->method_holder());
+  InstanceKlass* ik = _method->method_holder();
   Symbol* m_name = _method->name();
   Symbol* m_signature = _method->signature();
 
   // search previous versions if they exist
-  for (InstanceKlass* pv_node = ikh->previous_versions();
+  for (InstanceKlass* pv_node = ik->previous_versions();
        pv_node != NULL;
        pv_node = pv_node->previous_versions()) {
     Array<Method*>* methods = pv_node->methods();
@@ -696,10 +696,10 @@
 
     Handle obj(cur_thread, JNIHandles::resolve_external_guard(jobj));
     NULL_CHECK(obj, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
-    KlassHandle ob_kh = KlassHandle(cur_thread, obj->klass());
-    NULL_CHECK(ob_kh, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
+    Klass* ob_k = obj->klass();
+    NULL_CHECK(ob_k, (_result = JVMTI_ERROR_INVALID_OBJECT, false));
 
-    if (!is_assignable(signature, ob_kh(), cur_thread)) {
+    if (!is_assignable(signature, ob_k, cur_thread)) {
       _result = JVMTI_ERROR_TYPE_MISMATCH;
       return false;
     }
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -58,7 +58,7 @@
 int         VM_RedefineClasses::_matching_methods_length = 0;
 int         VM_RedefineClasses::_deleted_methods_length  = 0;
 int         VM_RedefineClasses::_added_methods_length    = 0;
-Klass*      VM_RedefineClasses::_the_class_oop = NULL;
+Klass*      VM_RedefineClasses::_the_class = NULL;
 
 
 VM_RedefineClasses::VM_RedefineClasses(jint class_count,
@@ -227,8 +227,8 @@
   // Free os::malloc allocated memory.
   os::free(_scratch_classes);
 
-  // Reset the_class_oop to null for error printing.
-  _the_class_oop = NULL;
+  // Reset the_class to null for error printing.
+  _the_class = NULL;
 
   if (log_is_enabled(Info, redefine, class, timer)) {
     // Used to have separate timers for "doit" and "all", but the timer
@@ -657,8 +657,8 @@
 
 
 jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions(
-             instanceKlassHandle the_class,
-             instanceKlassHandle scratch_class) {
+             InstanceKlass* the_class,
+             InstanceKlass* scratch_class) {
   int i;
 
   // Check superclasses, or rather their names, since superclasses themselves can be
@@ -993,8 +993,8 @@
 jvmtiError VM_RedefineClasses::load_new_class_versions(TRAPS) {
 
   // For consistency allocate memory using os::malloc wrapper.
-  _scratch_classes = (Klass**)
-    os::malloc(sizeof(Klass*) * _class_count, mtClass);
+  _scratch_classes = (InstanceKlass**)
+    os::malloc(sizeof(InstanceKlass*) * _class_count, mtClass);
   if (_scratch_classes == NULL) {
     return JVMTI_ERROR_OUT_OF_MEMORY;
   }
@@ -1014,7 +1014,7 @@
     // versions are deleted. Constant pools are deallocated while merging
     // constant pools
     HandleMark hm(THREAD);
-    instanceKlassHandle the_class(THREAD, get_ik(_class_defs[i].klass));
+    InstanceKlass* the_class = get_ik(_class_defs[i].klass);
     Symbol*  the_class_sym = the_class->name();
 
     log_debug(redefine, class, load)
@@ -1032,24 +1032,23 @@
     // Set redefined class handle in JvmtiThreadState class.
     // This redefined class is sent to agent event handler for class file
     // load hook event.
-    state->set_class_being_redefined(&the_class, _class_load_kind);
-
-    Klass* k = SystemDictionary::parse_stream(the_class_sym,
-                                                the_class_loader,
-                                                protection_domain,
-                                                &st,
-                                                THREAD);
+    state->set_class_being_redefined(the_class, _class_load_kind);
+
+    InstanceKlass* scratch_class = SystemDictionary::parse_stream(
+                                                      the_class_sym,
+                                                      the_class_loader,
+                                                      protection_domain,
+                                                      &st,
+                                                      THREAD);
     // Clear class_being_redefined just to be sure.
     state->clear_class_being_redefined();
 
     // TODO: if this is retransform, and nothing changed we can skip it
 
-    instanceKlassHandle scratch_class (THREAD, k);
-
     // Need to clean up allocated InstanceKlass if there's an error so assign
     // the result here. Caller deallocates all the scratch classes in case of
     // an error.
-    _scratch_classes[i] = k;
+    _scratch_classes[i] = scratch_class;
 
     if (HAS_PENDING_EXCEPTION) {
       Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
@@ -1106,7 +1105,7 @@
       // the_class to scratch_class in the JVM_* functions called by the
       // verifier. Please, refer to jvmtiThreadState.hpp for the detailed
       // description.
-      RedefineVerifyMark rvm(&the_class, &scratch_class, state);
+      RedefineVerifyMark rvm(the_class, scratch_class, state);
       Verifier::verify(
         scratch_class, Verifier::ThrowException, true, THREAD);
     }
@@ -1138,7 +1137,7 @@
     if (VerifyMergedCPBytecodes) {
       // verify what we have done during constant pool merging
       {
-        RedefineVerifyMark rvm(&the_class, &scratch_class, state);
+        RedefineVerifyMark rvm(the_class, scratch_class, state);
         Verifier::verify(scratch_class, Verifier::ThrowException, true, THREAD);
       }
 
@@ -1434,7 +1433,7 @@
 // potentially rewrite bytecodes in scratch_class to use the merged
 // constant pool.
 jvmtiError VM_RedefineClasses::merge_cp_and_rewrite(
-             instanceKlassHandle the_class, instanceKlassHandle scratch_class,
+             InstanceKlass* the_class, InstanceKlass* scratch_class,
              TRAPS) {
   // worst case merged constant pool length is old and new combined
   int merge_cp_length = the_class->constants()->length()
@@ -1483,7 +1482,7 @@
   _operands_index_map_p = new intArray(operands_index_map_len, operands_index_map_len, -1);
 
   // reference to the cp holder is needed for copy_operands()
-  merge_cp->set_pool_holder(scratch_class());
+  merge_cp->set_pool_holder(scratch_class);
   bool result = merge_constant_pools(old_cp, scratch_cp, &merge_cp,
                   &merge_cp_length, THREAD);
   merge_cp->set_pool_holder(NULL);
@@ -1568,7 +1567,7 @@
 
 
 // Rewrite constant pool references in klass scratch_class.
-bool VM_RedefineClasses::rewrite_cp_refs(instanceKlassHandle scratch_class,
+bool VM_RedefineClasses::rewrite_cp_refs(InstanceKlass* scratch_class,
        TRAPS) {
 
   // rewrite constant pool references in the methods:
@@ -1655,7 +1654,7 @@
 
 // Rewrite constant pool references in the methods.
 bool VM_RedefineClasses::rewrite_cp_refs_in_methods(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   Array<Method*>* methods = scratch_class->methods();
 
@@ -1834,7 +1833,7 @@
 
 // Rewrite constant pool references in the class_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_class_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   AnnotationArray* class_annotations = scratch_class->class_annotations();
   if (class_annotations == NULL || class_annotations->length() == 0) {
@@ -2124,7 +2123,7 @@
 
 // Rewrite constant pool references in a fields_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_fields_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   Array<AnnotationArray*>* fields_annotations = scratch_class->fields_annotations();
 
@@ -2157,7 +2156,7 @@
 
 // Rewrite constant pool references in a methods_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   for (int i = 0; i < scratch_class->methods()->length(); i++) {
     Method* m = scratch_class->methods()->at(i);
@@ -2195,7 +2194,7 @@
 // }
 //
 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_parameter_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   for (int i = 0; i < scratch_class->methods()->length(); i++) {
     Method* m = scratch_class->methods()->at(i);
@@ -2244,7 +2243,7 @@
 // }
 //
 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_default_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   for (int i = 0; i < scratch_class->methods()->length(); i++) {
     Method* m = scratch_class->methods()->at(i);
@@ -2271,7 +2270,7 @@
 
 // Rewrite constant pool references in a class_type_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_class_type_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   AnnotationArray* class_type_annotations = scratch_class->class_type_annotations();
   if (class_type_annotations == NULL || class_type_annotations->length() == 0) {
@@ -2289,7 +2288,7 @@
 
 // Rewrite constant pool references in a fields_type_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_fields_type_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   Array<AnnotationArray*>* fields_type_annotations = scratch_class->fields_type_annotations();
   if (fields_type_annotations == NULL || fields_type_annotations->length() == 0) {
@@ -2321,7 +2320,7 @@
 
 // Rewrite constant pool references in a methods_type_annotations field.
 bool VM_RedefineClasses::rewrite_cp_refs_in_methods_type_annotations(
-       instanceKlassHandle scratch_class, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   for (int i = 0; i < scratch_class->methods()->length(); i++) {
     Method* m = scratch_class->methods()->at(i);
@@ -3074,7 +3073,7 @@
 // smaller constant pool is associated with scratch_class.
 void VM_RedefineClasses::set_new_constant_pool(
        ClassLoaderData* loader_data,
-       instanceKlassHandle scratch_class, constantPoolHandle scratch_cp,
+       InstanceKlass* scratch_class, constantPoolHandle scratch_cp,
        int scratch_cp_length, TRAPS) {
   assert(scratch_cp->length() >= scratch_cp_length, "sanity check");
 
@@ -3091,7 +3090,7 @@
 
   // attach klass to new constant pool
   // reference to the cp holder is needed for copy_operands()
-  smaller_cp->set_pool_holder(scratch_class());
+  smaller_cp->set_pool_holder(scratch_class);
 
   scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD);
   if (HAS_PENDING_EXCEPTION) {
@@ -3268,11 +3267,11 @@
   // This is a very busy routine. We don't want too much tracing
   // printed out.
   bool trace_name_printed = false;
-  InstanceKlass *the_class = InstanceKlass::cast(_the_class_oop);
+  InstanceKlass *the_class = InstanceKlass::cast(_the_class);
 
   // If the class being redefined is java.lang.Object, we need to fix all
   // array class vtables also
-  if (k->is_array_klass() && _the_class_oop == SystemDictionary::Object_klass()) {
+  if (k->is_array_klass() && _the_class == SystemDictionary::Object_klass()) {
     k->vtable()->adjust_method_entries(the_class, &trace_name_printed);
 
   } else if (k->is_instance_klass()) {
@@ -3291,8 +3290,7 @@
     // If the current class being redefined has a user-defined class
     // loader as its defining class loader, then we can skip all
     // classes loaded by the bootstrap class loader.
-    bool is_user_defined =
-           InstanceKlass::cast(_the_class_oop)->class_loader() != NULL;
+    bool is_user_defined = (_the_class->class_loader() != NULL);
     if (is_user_defined && ik->class_loader() == NULL) {
       return;
     }
@@ -3311,9 +3309,9 @@
     // This must be done after we adjust the default_methods and
     // default_vtable_indices for methods already in the vtable.
     // If redefining Unsafe, walk all the vtables looking for entries.
-    if (ik->vtable_length() > 0 && (_the_class_oop->is_interface()
-        || _the_class_oop == SystemDictionary::internal_Unsafe_klass()
-        || ik->is_subtype_of(_the_class_oop))) {
+    if (ik->vtable_length() > 0 && (_the_class->is_interface()
+        || _the_class == SystemDictionary::internal_Unsafe_klass()
+        || ik->is_subtype_of(_the_class))) {
       // ik->vtable() creates a wrapper object; rm cleans it up
       ResourceMark rm(_thread);
 
@@ -3328,9 +3326,9 @@
     // every InstanceKlass that has an itable since there isn't a
     // subclass relationship between an interface and an InstanceKlass.
     // If redefining Unsafe, walk all the itables looking for entries.
-    if (ik->itable_length() > 0 && (_the_class_oop->is_interface()
-        || _the_class_oop == SystemDictionary::internal_Unsafe_klass()
-        || ik->is_subclass_of(_the_class_oop))) {
+    if (ik->itable_length() > 0 && (_the_class->is_interface()
+        || _the_class == SystemDictionary::internal_Unsafe_klass()
+        || ik->is_subclass_of(_the_class))) {
       // ik->itable() creates a wrapper object; rm cleans it up
       ResourceMark rm(_thread);
 
@@ -3353,7 +3351,7 @@
     constantPoolHandle other_cp;
     ConstantPoolCache* cp_cache;
 
-    if (ik != _the_class_oop) {
+    if (ik != _the_class) {
       // this klass' constant pool cache may need adjustment
       other_cp = constantPoolHandle(ik->constants());
       cp_cache = other_cp->cache();
@@ -3499,7 +3497,7 @@
       // obsolete methods need a unique idnum so they become new entries in
       // the jmethodID cache in InstanceKlass
       assert(old_method->method_idnum() == new_method->method_idnum(), "must match");
-      u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum();
+      u2 num = InstanceKlass::cast(_the_class)->next_method_idnum();
       if (num != ConstMethod::UNSET_IDNUM) {
         old_method->set_method_idnum(num);
       }
@@ -3563,7 +3561,7 @@
 //
 class TransferNativeFunctionRegistration {
  private:
-  instanceKlassHandle the_class;
+  InstanceKlass* the_class;
   int prefix_count;
   char** prefixes;
 
@@ -3578,7 +3576,7 @@
                                      Symbol* signature) {
     TempNewSymbol name_symbol = SymbolTable::probe(name_str, (int)name_len);
     if (name_symbol != NULL) {
-      Method* method = the_class()->lookup_method(name_symbol, signature);
+      Method* method = the_class->lookup_method(name_symbol, signature);
       if (method != NULL) {
         // Even if prefixed, intermediate methods must exist.
         if (method->is_native()) {
@@ -3641,7 +3639,7 @@
  public:
 
   // Construct a native method transfer processor for this class.
-  TransferNativeFunctionRegistration(instanceKlassHandle _the_class) {
+  TransferNativeFunctionRegistration(InstanceKlass* _the_class) {
     assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
 
     the_class = _the_class;
@@ -3668,7 +3666,7 @@
 };
 
 // Don't lose the association between a native method and its JNI function.
-void VM_RedefineClasses::transfer_old_native_function_registrations(instanceKlassHandle the_class) {
+void VM_RedefineClasses::transfer_old_native_function_registrations(InstanceKlass* the_class) {
   TransferNativeFunctionRegistration transfer(the_class);
   transfer.transfer_registrations(_deleted_methods, _deleted_methods_length);
   transfer.transfer_registrations(_matching_old_methods, _matching_methods_length);
@@ -3689,13 +3687,13 @@
 // subsequent calls to RedefineClasses need only throw away code
 // that depends on the class.
 //
-void VM_RedefineClasses::flush_dependent_code(instanceKlassHandle k_h, TRAPS) {
+void VM_RedefineClasses::flush_dependent_code(InstanceKlass* ik, TRAPS) {
   assert_locked_or_safepoint(Compile_lock);
 
   // All dependencies have been recorded from startup or this is a second or
   // subsequent use of RedefineClasses
   if (JvmtiExport::all_dependencies_are_recorded()) {
-    CodeCache::flush_evol_dependents_on(k_h);
+    CodeCache::flush_evol_dependents_on(ik);
   } else {
     CodeCache::mark_all_nmethods_for_deoptimization();
 
@@ -3775,8 +3773,8 @@
 }
 
 
-void VM_RedefineClasses::swap_annotations(instanceKlassHandle the_class,
-                                          instanceKlassHandle scratch_class) {
+void VM_RedefineClasses::swap_annotations(InstanceKlass* the_class,
+                                          InstanceKlass* scratch_class) {
   // Swap annotation fields values
   Annotations* old_annotations = the_class->annotations();
   the_class->set_annotations(scratch_class->annotations());
@@ -3797,7 +3795,7 @@
 //      that we would like to pass to the helper method are saved in
 //      static global fields in the VM operation.
 void VM_RedefineClasses::redefine_single_class(jclass the_jclass,
-       Klass* scratch_class_oop, TRAPS) {
+       InstanceKlass* scratch_class, TRAPS) {
 
   HandleMark hm(THREAD);   // make sure handles from this call are freed
 
@@ -3805,25 +3803,24 @@
     _timer_rsc_phase1.start();
   }
 
-  instanceKlassHandle scratch_class(THREAD, scratch_class_oop);
-  instanceKlassHandle the_class(THREAD, get_ik(the_jclass));
+  InstanceKlass* the_class = get_ik(the_jclass);
 
   // Remove all breakpoints in methods of this class
   JvmtiBreakpoints& jvmti_breakpoints = JvmtiCurrentBreakpoints::get_jvmti_breakpoints();
-  jvmti_breakpoints.clearall_in_class_at_safepoint(the_class());
+  jvmti_breakpoints.clearall_in_class_at_safepoint(the_class);
 
   // Deoptimize all compiled code that depends on this class
   flush_dependent_code(the_class, THREAD);
 
   _old_methods = the_class->methods();
   _new_methods = scratch_class->methods();
-  _the_class_oop = the_class();
+  _the_class = the_class;
   compute_added_deleted_matching_methods();
   update_jmethod_ids();
 
   // Attach new constant pool to the original klass. The original
   // klass still refers to the old constant pool (for now).
-  scratch_class->constants()->set_pool_holder(the_class());
+  scratch_class->constants()->set_pool_holder(the_class);
 
 #if 0
   // In theory, with constant pool merging in place we should be able
@@ -3853,13 +3850,11 @@
 
   {
     // walk all previous versions of the klass
-    InstanceKlass *ik = (InstanceKlass *)the_class();
+    InstanceKlass *ik = the_class;
     PreviousVersionWalker pvw(ik);
-    instanceKlassHandle ikh;
     do {
-      ikh = pvw.next_previous_version();
-      if (!ikh.is_null()) {
-        ik = ikh();
+      ik = pvw.next_previous_version();
+      if (ik != NULL) {
 
         // attach previous version of klass to the new constant pool
         ik->set_constants(scratch_class->constants());
@@ -3872,7 +3867,7 @@
           method->set_constants(scratch_class->constants());
         }
       }
-    } while (!ikh.is_null());
+    } while (ik != NULL);
   }
 #endif
 
@@ -4041,7 +4036,7 @@
   MemberNameTable* mnt = the_class->member_names();
   if (mnt != NULL) {
     bool trace_name_printed = false;
-    mnt->adjust_method_entries(the_class(), &trace_name_printed);
+    mnt->adjust_method_entries(the_class, &trace_name_printed);
   }
 
   if (the_class->oop_map_cache() != NULL) {
@@ -4050,11 +4045,11 @@
     the_class->oop_map_cache()->flush_obsolete_entries();
   }
 
+  increment_class_counter((InstanceKlass *)the_class, THREAD);
   {
     ResourceMark rm(THREAD);
     // increment the classRedefinedCount field in the_class and in any
     // direct and indirect subclasses of the_class
-    increment_class_counter((InstanceKlass *)the_class(), THREAD);
     log_info(redefine, class, load)
       ("redefined name=%s, count=%d (avail_mem=" UINT64_FORMAT "K)",
        the_class->external_name(), java_lang_Class::classRedefinedCount(the_class->java_mirror()), os::available_memory() >> 10);
@@ -4075,8 +4070,8 @@
   int new_count = java_lang_Class::classRedefinedCount(class_mirror) + 1;
   java_lang_Class::set_classRedefinedCount(class_mirror, new_count);
 
-  if (class_oop != _the_class_oop) {
-    // _the_class_oop count is printed at end of redefine_single_class()
+  if (class_oop != _the_class) {
+    // _the_class count is printed at end of redefine_single_class()
     log_debug(redefine, class, subclass)("updated count in subclass=%s to %d", ik->external_name(), new_count);
   }
 
@@ -4212,8 +4207,8 @@
 
 void VM_RedefineClasses::print_on_error(outputStream* st) const {
   VM_Operation::print_on_error(st);
-  if (_the_class_oop != NULL) {
+  if (_the_class != NULL) {
     ResourceMark rm;
-    st->print_cr(", redefining class %s", _the_class_oop->external_name());
+    st->print_cr(", redefining class %s", _the_class->external_name());
   }
 }
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -348,7 +348,7 @@
   static int             _matching_methods_length;
   static int             _deleted_methods_length;
   static int             _added_methods_length;
-  static Klass*          _the_class_oop;
+  static Klass*          _the_class;
 
   // The instance fields are used to pass information from
   // doit_prologue() to doit() and doit_epilogue().
@@ -371,7 +371,7 @@
   intArray *                  _operands_index_map_p;
 
   // ptr to _class_count scratch_classes
-  Klass**                     _scratch_classes;
+  InstanceKlass**             _scratch_classes;
   jvmtiError                  _res;
 
   // Performance measurement support. These timers do not cover all
@@ -393,7 +393,7 @@
   // the restrictions of RedefineClasses. Normalize the order of
   // overloaded methods as needed.
   jvmtiError compare_and_normalize_class_versions(
-    instanceKlassHandle the_class, instanceKlassHandle scratch_class);
+    InstanceKlass* the_class, InstanceKlass* scratch_class);
 
   // Figure out which new methods match old methods in name and signature,
   // which methods have been added, and which are no longer present
@@ -405,14 +405,14 @@
   // In addition to marking methods as old and/or obsolete, this routine
   // counts the number of methods that are EMCP (Equivalent Module Constant Pool).
   int check_methods_and_mark_as_obsolete();
-  void transfer_old_native_function_registrations(instanceKlassHandle the_class);
+  void transfer_old_native_function_registrations(InstanceKlass* the_class);
 
   // Install the redefinition of a class
   void redefine_single_class(jclass the_jclass,
-    Klass* scratch_class_oop, TRAPS);
+    InstanceKlass* scratch_class_oop, TRAPS);
 
-  void swap_annotations(instanceKlassHandle new_class,
-                        instanceKlassHandle scratch_class);
+  void swap_annotations(InstanceKlass* new_class,
+                        InstanceKlass* scratch_class);
 
   // Increment the classRedefinedCount field in the specific InstanceKlass
   // and in all direct and indirect subclasses.
@@ -437,18 +437,18 @@
   bool merge_constant_pools(const constantPoolHandle& old_cp,
     const constantPoolHandle& scratch_cp, constantPoolHandle *merge_cp_p,
     int *merge_cp_length_p, TRAPS);
-  jvmtiError merge_cp_and_rewrite(instanceKlassHandle the_class,
-    instanceKlassHandle scratch_class, TRAPS);
+  jvmtiError merge_cp_and_rewrite(InstanceKlass* the_class,
+    InstanceKlass* scratch_class, TRAPS);
   u2 rewrite_cp_ref_in_annotation_data(
     AnnotationArray* annotations_typeArray, int &byte_i_ref,
     const char * trace_mesg, TRAPS);
-  bool rewrite_cp_refs(instanceKlassHandle scratch_class, TRAPS);
+  bool rewrite_cp_refs(InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_annotation_struct(
     AnnotationArray* class_annotations, int &byte_i_ref, TRAPS);
   bool rewrite_cp_refs_in_annotations_typeArray(
     AnnotationArray* annotations_typeArray, int &byte_i_ref, TRAPS);
   bool rewrite_cp_refs_in_class_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_element_value(
     AnnotationArray* class_annotations, int &byte_i_ref, TRAPS);
   bool rewrite_cp_refs_in_type_annotations_typeArray(
@@ -463,31 +463,31 @@
   bool skip_type_annotation_type_path(
     AnnotationArray* type_annotations_typeArray, int &byte_i_ref, TRAPS);
   bool rewrite_cp_refs_in_fields_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   void rewrite_cp_refs_in_method(methodHandle method,
     methodHandle * new_method_p, TRAPS);
-  bool rewrite_cp_refs_in_methods(instanceKlassHandle scratch_class, TRAPS);
+  bool rewrite_cp_refs_in_methods(InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_methods_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_methods_default_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_methods_parameter_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_class_type_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_fields_type_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   bool rewrite_cp_refs_in_methods_type_annotations(
-    instanceKlassHandle scratch_class, TRAPS);
+    InstanceKlass* scratch_class, TRAPS);
   void rewrite_cp_refs_in_stack_map_table(const methodHandle& method, TRAPS);
   void rewrite_cp_refs_in_verification_type_info(
          address& stackmap_addr_ref, address stackmap_end, u2 frame_i,
          u1 frame_size, TRAPS);
   void set_new_constant_pool(ClassLoaderData* loader_data,
-         instanceKlassHandle scratch_class,
+         InstanceKlass* scratch_class,
          constantPoolHandle scratch_cp, int scratch_cp_length, TRAPS);
 
-  void flush_dependent_code(instanceKlassHandle k_h, TRAPS);
+  void flush_dependent_code(InstanceKlass* ik, TRAPS);
 
   // lock classes to redefine since constant pool merging isn't thread safe.
   void lock_classes();
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -783,7 +783,7 @@
   void add(int index, char type, int offset);
 
   // returns the field count for the given class
-  static int compute_field_count(instanceKlassHandle ikh);
+  static int compute_field_count(InstanceKlass* ik);
 
  public:
   ~ClassFieldMap();
@@ -819,16 +819,16 @@
 //
 ClassFieldMap* ClassFieldMap::create_map_of_static_fields(Klass* k) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   // create the field map
   ClassFieldMap* field_map = new ClassFieldMap();
 
-  FilteredFieldStream f(ikh, false, false);
+  FilteredFieldStream f(ik, false, false);
   int max_field_index = f.field_count()-1;
 
   int index = 0;
-  for (FilteredFieldStream fld(ikh, true, true); !fld.eos(); fld.next(), index++) {
+  for (FilteredFieldStream fld(ik, true, true); !fld.eos(); fld.next(), index++) {
     // ignore instance fields
     if (!fld.access_flags().is_static()) {
       continue;
@@ -844,17 +844,17 @@
 //
 ClassFieldMap* ClassFieldMap::create_map_of_instance_fields(oop obj) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), obj->klass());
+  InstanceKlass* ik = InstanceKlass::cast(obj->klass());
 
   // create the field map
   ClassFieldMap* field_map = new ClassFieldMap();
 
-  FilteredFieldStream f(ikh, false, false);
+  FilteredFieldStream f(ik, false, false);
 
   int max_field_index = f.field_count()-1;
 
   int index = 0;
-  for (FilteredFieldStream fld(ikh, false, false); !fld.eos(); fld.next(), index++) {
+  for (FilteredFieldStream fld(ik, false, false); !fld.eos(); fld.next(), index++) {
     // ignore static fields
     if (fld.access_flags().is_static()) {
       continue;
@@ -1008,9 +1008,9 @@
 }
 
 // helper function to indicate if an object is filtered by a klass filter
-static inline bool is_filtered_by_klass_filter(oop obj, KlassHandle klass_filter) {
-  if (!klass_filter.is_null()) {
-    if (obj->klass() != klass_filter()) {
+static inline bool is_filtered_by_klass_filter(oop obj, Klass* klass_filter) {
+  if (klass_filter != NULL) {
+    if (obj->klass() != klass_filter) {
       return true;
     }
   }
@@ -1272,7 +1272,7 @@
 class IterateOverHeapObjectClosure: public ObjectClosure {
  private:
   JvmtiTagMap* _tag_map;
-  KlassHandle _klass;
+  Klass* _klass;
   jvmtiHeapObjectFilter _object_filter;
   jvmtiHeapObjectCallback _heap_object_callback;
   const void* _user_data;
@@ -1281,7 +1281,7 @@
   JvmtiTagMap* tag_map() const                    { return _tag_map; }
   jvmtiHeapObjectFilter object_filter() const     { return _object_filter; }
   jvmtiHeapObjectCallback object_callback() const { return _heap_object_callback; }
-  KlassHandle klass() const                       { return _klass; }
+  Klass* klass() const                            { return _klass; }
   const void* user_data() const                   { return _user_data; }
 
   // indicates if iteration has been aborted
@@ -1291,7 +1291,7 @@
 
  public:
   IterateOverHeapObjectClosure(JvmtiTagMap* tag_map,
-                               KlassHandle klass,
+                               Klass* klass,
                                jvmtiHeapObjectFilter object_filter,
                                jvmtiHeapObjectCallback heap_object_callback,
                                const void* user_data) :
@@ -1316,7 +1316,7 @@
   if (!ServiceUtil::visible_oop(o)) return;
 
   // instanceof check when filtering by klass
-  if (!klass().is_null() && !o->is_a(klass()())) {
+  if (klass() != NULL && !o->is_a(klass())) {
     return;
   }
   // prepare for the calllback
@@ -1345,7 +1345,7 @@
 class IterateThroughHeapObjectClosure: public ObjectClosure {
  private:
   JvmtiTagMap* _tag_map;
-  KlassHandle _klass;
+  Klass* _klass;
   int _heap_filter;
   const jvmtiHeapCallbacks* _callbacks;
   const void* _user_data;
@@ -1354,7 +1354,7 @@
   JvmtiTagMap* tag_map() const                     { return _tag_map; }
   int heap_filter() const                          { return _heap_filter; }
   const jvmtiHeapCallbacks* callbacks() const      { return _callbacks; }
-  KlassHandle klass() const                        { return _klass; }
+  Klass* klass() const                             { return _klass; }
   const void* user_data() const                    { return _user_data; }
 
   // indicates if the iteration has been aborted
@@ -1374,7 +1374,7 @@
 
  public:
   IterateThroughHeapObjectClosure(JvmtiTagMap* tag_map,
-                                  KlassHandle klass,
+                                  Klass* klass,
                                   int heap_filter,
                                   const jvmtiHeapCallbacks* heap_callbacks,
                                   const void* user_data) :
@@ -1470,7 +1470,7 @@
 
 // Deprecated function to iterate over all objects in the heap
 void JvmtiTagMap::iterate_over_heap(jvmtiHeapObjectFilter object_filter,
-                                    KlassHandle klass,
+                                    Klass* klass,
                                     jvmtiHeapObjectCallback heap_object_callback,
                                     const void* user_data)
 {
@@ -1487,7 +1487,7 @@
 
 // Iterates over all objects in the heap
 void JvmtiTagMap::iterate_through_heap(jint heap_filter,
-                                       KlassHandle klass,
+                                       Klass* klass,
                                        const jvmtiHeapCallbacks* callbacks,
                                        const void* user_data)
 {
@@ -1806,14 +1806,14 @@
 class AdvancedHeapWalkContext: public HeapWalkContext {
  private:
   jint _heap_filter;
-  KlassHandle _klass_filter;
+  Klass* _klass_filter;
   const jvmtiHeapCallbacks* _heap_callbacks;
 
  public:
   AdvancedHeapWalkContext() : HeapWalkContext(false) { }
 
   AdvancedHeapWalkContext(jint heap_filter,
-                           KlassHandle klass_filter,
+                           Klass* klass_filter,
                            const jvmtiHeapCallbacks* heap_callbacks) :
     HeapWalkContext(true),
     _heap_filter(heap_filter),
@@ -1823,7 +1823,7 @@
 
   // accessors
   jint heap_filter() const         { return _heap_filter; }
-  KlassHandle klass_filter() const { return _klass_filter; }
+  Klass* klass_filter() const      { return _klass_filter; }
 
   const jvmtiHeapReferenceCallback heap_reference_callback() const {
     return _heap_callbacks->heap_reference_callback;
@@ -3296,7 +3296,7 @@
 
 // follow references from an initial object or the GC roots
 void JvmtiTagMap::follow_references(jint heap_filter,
-                                    KlassHandle klass,
+                                    Klass* klass,
                                     jobject object,
                                     const jvmtiHeapCallbacks* callbacks,
                                     const void* user_data)
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -91,7 +91,7 @@
 
   // deprecated heap iteration functions
   void iterate_over_heap(jvmtiHeapObjectFilter object_filter,
-                         KlassHandle klass,
+                         Klass* klass,
                          jvmtiHeapObjectCallback heap_object_callback,
                          const void* user_data);
 
@@ -107,12 +107,12 @@
 
   // advanced (JVMTI 1.1) heap iteration functions
   void iterate_through_heap(jint heap_filter,
-                            KlassHandle klass,
+                            Klass* klass,
                             const jvmtiHeapCallbacks* callbacks,
                             const void* user_data);
 
   void follow_references(jint heap_filter,
-                         KlassHandle klass,
+                         Klass* klass,
                          jobject initial_object,
                          const jvmtiHeapCallbacks* callbacks,
                          const void* user_data);
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -93,7 +93,7 @@
 
   // Used to send class being redefined/retransformed and kind of transform
   // info to the class file load hook event handler.
-  KlassHandle           *_class_being_redefined;
+  Klass*                _class_being_redefined;
   JvmtiClassLoadKind    _class_load_kind;
 
   // This is only valid when is_interp_only_mode() returns true
@@ -220,8 +220,8 @@
   // when class file load hook event is posted.
   // It is set while loading redefined class and cleared before the
   // class file load hook event is posted.
-  inline void set_class_being_redefined(KlassHandle *h_class, JvmtiClassLoadKind kind) {
-    _class_being_redefined = h_class;
+  inline void set_class_being_redefined(Klass* k, JvmtiClassLoadKind kind) {
+    _class_being_redefined = k;
     _class_load_kind = kind;
   }
 
@@ -230,7 +230,7 @@
     _class_load_kind = jvmti_class_load_kind_load;
   }
 
-  inline KlassHandle *get_class_being_redefined() {
+  inline Klass* get_class_being_redefined() {
     return _class_being_redefined;
   }
 
@@ -271,12 +271,12 @@
   //   used by the verifier, so there is no extra performance issue with it.
 
  private:
-  KlassHandle *_the_class_for_redefinition_verification;
-  KlassHandle *_scratch_class_for_redefinition_verification;
+  Klass* _the_class_for_redefinition_verification;
+  Klass* _scratch_class_for_redefinition_verification;
 
  public:
-  inline void set_class_versions_map(KlassHandle *the_class,
-                                     KlassHandle *scratch_class) {
+  inline void set_class_versions_map(Klass* the_class,
+                                     Klass* scratch_class) {
     _the_class_for_redefinition_verification = the_class;
     _scratch_class_for_redefinition_verification = scratch_class;
   }
@@ -288,8 +288,8 @@
                                                     JavaThread *thread) {
     JvmtiThreadState *state = thread->jvmti_thread_state();
     if (state != NULL && state->_the_class_for_redefinition_verification != NULL) {
-      if ((*(state->_the_class_for_redefinition_verification))() == klass) {
-        klass = (*(state->_scratch_class_for_redefinition_verification))();
+      if (state->_the_class_for_redefinition_verification == klass) {
+        klass = state->_scratch_class_for_redefinition_verification;
       }
     }
     return klass;
@@ -409,17 +409,17 @@
 
 class RedefineVerifyMark : public StackObj {
  private:
-  JvmtiThreadState *_state;
-  KlassHandle       _scratch_class;
+  JvmtiThreadState* _state;
+  Klass*            _scratch_class;
   Handle            _scratch_mirror;
 
  public:
-  RedefineVerifyMark(KlassHandle *the_class, KlassHandle *scratch_class,
-                     JvmtiThreadState *state) : _state(state), _scratch_class(*scratch_class)
+  RedefineVerifyMark(Klass* the_class, Klass* scratch_class,
+                     JvmtiThreadState *state) : _state(state), _scratch_class(scratch_class)
   {
     _state->set_class_versions_map(the_class, scratch_class);
     _scratch_mirror = Handle(Thread::current(), _scratch_class->java_mirror());
-    (*scratch_class)->set_java_mirror((*the_class)->java_mirror());
+    _scratch_class->set_java_mirror(the_class->java_mirror());
   }
 
   ~RedefineVerifyMark() {
--- a/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -124,7 +124,7 @@
 
 Handle MethodHandles::new_MemberName(TRAPS) {
   Handle empty;
-  instanceKlassHandle k(THREAD, SystemDictionary::MemberName_klass());
+  InstanceKlass* k = SystemDictionary::MemberName_klass();
   if (!k->is_initialized())  k->initialize(CHECK_(empty));
   return Handle(THREAD, k->allocate_instance(THREAD));
 }
@@ -138,9 +138,9 @@
   if (target_klass == SystemDictionary::reflect_Field_klass()) {
     oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
     int slot  = java_lang_reflect_Field::slot(target_oop);  // fd.index()
-    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
-    if (!k.is_null() && k->is_instance_klass()) {
-      fieldDescriptor fd(InstanceKlass::cast(k()), slot);
+    Klass* k = java_lang_Class::as_Klass(clazz);
+    if (k != NULL && k->is_instance_klass()) {
+      fieldDescriptor fd(InstanceKlass::cast(k), slot);
       oop mname2 = init_field_MemberName(mname, fd);
       if (mname2 != NULL) {
         // Since we have the reified name and type handy, add them to the result.
@@ -154,22 +154,22 @@
   } else if (target_klass == SystemDictionary::reflect_Method_klass()) {
     oop clazz  = java_lang_reflect_Method::clazz(target_oop);
     int slot   = java_lang_reflect_Method::slot(target_oop);
-    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
-    if (!k.is_null() && k->is_instance_klass()) {
-      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
+    Klass* k = java_lang_Class::as_Klass(clazz);
+    if (k != NULL && k->is_instance_klass()) {
+      Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
       if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
         return NULL;            // do not resolve unless there is a concrete signature
-      CallInfo info(m, k());
+      CallInfo info(m, k);
       return init_method_MemberName(mname, info);
     }
   } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
     oop clazz  = java_lang_reflect_Constructor::clazz(target_oop);
     int slot   = java_lang_reflect_Constructor::slot(target_oop);
-    KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
-    if (!k.is_null() && k->is_instance_klass()) {
-      Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
+    Klass* k = java_lang_Class::as_Klass(clazz);
+    if (k != NULL && k->is_instance_klass()) {
+      Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
       if (m == NULL)  return NULL;
-      CallInfo info(m, k());
+      CallInfo info(m, k);
       return init_method_MemberName(mname, info);
     }
   }
@@ -180,8 +180,8 @@
   assert(info.resolved_appendix().is_null(), "only normal methods here");
   methodHandle m = info.resolved_method();
   assert(m.not_null(), "null method handle");
-  KlassHandle m_klass = m->method_holder();
-  assert(m.not_null(), "null holder for method handle");
+  Klass* m_klass = m->method_holder();
+  assert(m_klass != NULL, "null holder for method handle");
   int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
   int vmindex = Method::invalid_vtable_index;
 
@@ -208,12 +208,12 @@
   case CallInfo::vtable_call:
     vmindex = info.vtable_index();
     flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
-    assert(info.resolved_klass()->is_subtype_of(m_klass()), "virtual call must be type-safe");
+    assert(info.resolved_klass()->is_subtype_of(m_klass), "virtual call must be type-safe");
     if (m_klass->is_interface()) {
       // This is a vtable call to an interface method (abstract "miranda method" or default method).
       // The vtable index is meaningless without a class (not interface) receiver type, so get one.
       // (LinkResolver should help us figure this out.)
-      KlassHandle m_klass_non_interface = info.resolved_klass();
+      Klass* m_klass_non_interface = info.resolved_klass();
       if (m_klass_non_interface->is_interface()) {
         m_klass_non_interface = SystemDictionary::Object_klass();
 #ifdef ASSERT
@@ -229,7 +229,7 @@
         assert(m->is_public(), "virtual call must be to public interface method");
         return NULL;  // elicit an error later in product build
       }
-      assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface()), "virtual call must be type-safe");
+      assert(info.resolved_klass()->is_subtype_of(m_klass_non_interface), "virtual call must be type-safe");
       m_klass = m_klass_non_interface;
     }
     if (TraceInvokeDynamic) {
@@ -637,7 +637,7 @@
 // An unresolved member name is a mere symbolic reference.
 // Resolving it plants a vmtarget/vmindex in it,
 // which refers directly to JVM internals.
-Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS) {
+Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, TRAPS) {
   Handle empty;
   assert(java_lang_invoke_MemberName::is_instance(mname()), "");
 
@@ -664,7 +664,7 @@
     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "nothing to resolve", empty);
   }
 
-  instanceKlassHandle defc;
+  InstanceKlass* defc = NULL;
   {
     Klass* defc_klass = java_lang_Class::as_Klass(defc_oop());
     if (defc_klass == NULL)  return empty;  // a primitive; no resolution possible
@@ -672,9 +672,9 @@
       if (!defc_klass->is_array_klass())  return empty;
       defc_klass = SystemDictionary::Object_klass();
     }
-    defc = instanceKlassHandle(THREAD, defc_klass);
+    defc = InstanceKlass::cast(defc_klass);
   }
-  if (defc.is_null()) {
+  if (defc == NULL) {
     THROW_MSG_(vmSymbols::java_lang_InternalError(), "primitive class", empty);
   }
   defc->link_class(CHECK_(empty));  // possible safepoint
@@ -687,7 +687,7 @@
 
   vmIntrinsics::ID mh_invoke_id = vmIntrinsics::_none;
   if ((flags & ALL_KINDS) == IS_METHOD &&
-      (defc() == SystemDictionary::MethodHandle_klass()) &&
+      (defc == SystemDictionary::MethodHandle_klass()) &&
       (ref_kind == JVM_REF_invokeVirtual ||
        ref_kind == JVM_REF_invokeSpecial ||
        // static invocation mode is required for _linkToVirtual, etc.:
@@ -705,7 +705,7 @@
   TempNewSymbol type = lookup_signature(type_str(), (mh_invoke_id != vmIntrinsics::_none), CHECK_(empty));
   if (type == NULL)  return empty;  // no such signature exists in the VM
 
-  LinkInfo::AccessCheck access_check = caller.not_null() ?
+  LinkInfo::AccessCheck access_check = caller != NULL ?
                                               LinkInfo::needs_access_check :
                                               LinkInfo::skip_access_check;
 
@@ -840,7 +840,7 @@
     {
       assert(vmtarget->is_klass(), "field vmtarget is Klass*");
       if (!((Klass*) vmtarget)->is_instance_klass())  break;
-      instanceKlassHandle defc(THREAD, (Klass*) vmtarget);
+      InstanceKlass* defc = InstanceKlass::cast((Klass*) vmtarget);
       DEBUG_ONLY(vmtarget = NULL);  // safety
       bool is_static = ((flags & JVM_ACC_STATIC) != 0);
       fieldDescriptor fd; // find_field initializes fd if found
@@ -868,15 +868,15 @@
   THROW_MSG(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format");
 }
 
-int MethodHandles::find_MemberNames(KlassHandle k,
+int MethodHandles::find_MemberNames(Klass* k,
                                     Symbol* name, Symbol* sig,
-                                    int mflags, KlassHandle caller,
+                                    int mflags, Klass* caller,
                                     int skip, objArrayHandle results) {
   // %%% take caller into account!
 
   Thread* thread = Thread::current();
 
-  if (k.is_null() || !k->is_instance_klass())  return -1;
+  if (k == NULL || !k->is_instance_klass())  return -1;
 
   int rfill = 0, rlimit = results->length(), rskip = skip;
   // overflow measurement:
@@ -904,7 +904,8 @@
   }
 
   if ((match_flags & IS_FIELD) != 0) {
-    for (FieldStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
+    InstanceKlass* ik = InstanceKlass::cast(k);
+    for (FieldStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
       if (name != NULL && st.name() != name)
           continue;
       if (sig != NULL && st.signature() != sig)
@@ -950,7 +951,8 @@
     } else {
       // caller will accept either sort; no need to adjust name
     }
-    for (MethodStream st(k(), local_only, !search_intfc); !st.eos(); st.next()) {
+    InstanceKlass* ik = InstanceKlass::cast(k);
+    for (MethodStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
       Method* m = st.method();
       Symbol* m_name = m->name();
       if (m_name == clinit_name)
@@ -1238,9 +1240,8 @@
     }
   }
 
-  KlassHandle caller(THREAD,
-                     caller_jh == NULL ? (Klass*) NULL :
-                     java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)));
+  Klass* caller = caller_jh == NULL ? NULL :
+                     java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
   Handle resolved = MethodHandles::resolve_MemberName(mname, caller, CHECK_NULL);
 
   if (resolved.is_null()) {
@@ -1330,7 +1331,7 @@
                                jclass clazz_jh, jstring name_jh, jstring sig_jh,
                                int mflags, jclass caller_jh, jint skip, jobjectArray results_jh)) {
   if (clazz_jh == NULL || results_jh == NULL)  return -1;
-  KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh)));
+  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz_jh));
 
   objArrayHandle results(THREAD, (objArrayOop) JNIHandles::resolve(results_jh));
   if (results.is_null() || !results->is_objArray())  return -1;
@@ -1346,11 +1347,11 @@
     if (sig == NULL)  return 0; // a match is not possible
   }
 
-  KlassHandle caller;
+  Klass* caller = NULL;
   if (caller_jh != NULL) {
     oop caller_oop = JNIHandles::resolve_non_null(caller_jh);
     if (!java_lang_Class::is_instance(caller_oop))  return -1;
-    caller = KlassHandle(THREAD, java_lang_Class::as_Klass(caller_oop));
+    caller = java_lang_Class::as_Klass(caller_oop);
   }
 
   if (name != NULL && sig != NULL && results.not_null()) {
--- a/hotspot/src/share/vm/prims/methodHandles.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -61,15 +61,15 @@
 
  public:
   // working with member names
-  static Handle resolve_MemberName(Handle mname, KlassHandle caller, TRAPS); // compute vmtarget/vmindex from name/type
+  static Handle resolve_MemberName(Handle mname, Klass* caller, TRAPS); // compute vmtarget/vmindex from name/type
   static void expand_MemberName(Handle mname, int suppress, TRAPS);  // expand defc/name/type if missing
   static Handle new_MemberName(TRAPS);  // must be followed by init_MemberName
   static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target
   static oop init_field_MemberName(Handle mname_h, fieldDescriptor& fd, bool is_setter = false);
   static oop init_method_MemberName(Handle mname_h, CallInfo& info, bool intern = true);
   static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true);
-  static int find_MemberNames(KlassHandle k, Symbol* name, Symbol* sig,
-                              int mflags, KlassHandle caller,
+  static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig,
+                              int mflags, Klass* caller,
                               int skip, objArrayHandle results);
   // bit values for suppress argument to expand_MemberName:
   enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
--- a/hotspot/src/share/vm/prims/nativeLookup.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/nativeLookup.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -175,7 +175,7 @@
   }
 
   // Otherwise call static method findNative in ClassLoader
-  KlassHandle   klass (THREAD, SystemDictionary::ClassLoader_klass());
+  Klass*   klass = SystemDictionary::ClassLoader_klass();
   Handle name_arg = java_lang_String::create_from_str(jni_name, CHECK_NULL);
 
   JavaValue result(T_LONG);
@@ -345,9 +345,8 @@
     int wrapper_name_len = (int)strlen(wrapper_name);
     TempNewSymbol wrapper_symbol = SymbolTable::probe(wrapper_name, wrapper_name_len);
     if (wrapper_symbol != NULL) {
-      KlassHandle kh(method->method_holder());
-      Method* wrapper_method = kh()->lookup_method(wrapper_symbol,
-                                                                  method->signature());
+      Klass* k = method->method_holder();
+      Method* wrapper_method = k->lookup_method(wrapper_symbol, method->signature());
       if (wrapper_method != NULL && !wrapper_method->is_native()) {
         // we found a wrapper method, use its native entry
         method->set_is_prefixed_native();
@@ -402,7 +401,7 @@
 
   // Find the class
   Klass* k = SystemDictionary::resolve_or_fail(c_name, true, CATCH);
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* klass  = InstanceKlass::cast(k);
 
   // Find method and invoke standard lookup
   methodHandle method (THREAD,
--- a/hotspot/src/share/vm/prims/stackwalk.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/stackwalk.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -179,7 +179,7 @@
 oop LiveFrameStream::create_primitive_slot_instance(StackValueCollection* values,
                                                     int i, BasicType type, TRAPS) {
   Klass* k = SystemDictionary::resolve_or_null(vmSymbols::java_lang_LiveStackFrameInfo(), CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   JavaValue result(T_OBJECT);
   JavaCallArguments args;
--- a/hotspot/src/share/vm/prims/unsafe.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/unsafe.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -845,7 +845,7 @@
 // not just a literal string.  For such ldc instructions, the verifier uses the
 // type Object instead of String, if the loaded constant is not in fact a String.
 
-static instanceKlassHandle
+static InstanceKlass*
 Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
                                  jclass host_class, jbyteArray data, jobjectArray cp_patches_jh,
                                  u1** temp_alloc,
@@ -932,18 +932,17 @@
     return NULL;
   }
 
-  return instanceKlassHandle(THREAD, anonk);
+  return InstanceKlass::cast(anonk);
 }
 
 UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass0(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh)) {
   ResourceMark rm(THREAD);
 
-  instanceKlassHandle anon_klass;
   jobject res_jh = NULL;
   u1* temp_alloc = NULL;
 
-  anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data, cp_patches_jh, &temp_alloc, THREAD);
-  if (anon_klass() != NULL) {
+  InstanceKlass* anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data, cp_patches_jh, &temp_alloc, THREAD);
+  if (anon_klass != NULL) {
     res_jh = JNIHandles::make_local(env, anon_klass->java_mirror());
   }
 
@@ -955,7 +954,7 @@
   // The anonymous class loader data has been artificially been kept alive to
   // this point.   The mirror and any instances of this class have to keep
   // it alive afterwards.
-  if (anon_klass() != NULL) {
+  if (anon_klass != NULL) {
     anon_klass->class_loader_data()->dec_keep_alive();
   }
 
--- a/hotspot/src/share/vm/prims/whitebox.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/prims/whitebox.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -782,8 +782,8 @@
 WB_END
 
 WB_ENTRY(jboolean, WB_EnqueueInitializerForCompilation(JNIEnv* env, jobject o, jclass klass, jint comp_level))
-  instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
-  return WhiteBox::compile_method(ikh->class_initializer(), comp_level, InvocationEntryBci, THREAD);
+  InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
+  return WhiteBox::compile_method(ik->class_initializer(), comp_level, InvocationEntryBci, THREAD);
 WB_END
 
 WB_ENTRY(jboolean, WB_ShouldPrintAssembly(JNIEnv* env, jobject o, jobject method, jint comp_level))
@@ -1517,8 +1517,8 @@
 WB_END
 
 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass))
-  instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
-  return (jlong) ikh->constants();
+  InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
+  return (jlong) ik->constants();
 WB_END
 
 WB_ENTRY(jint, WB_GetConstantPoolCacheIndexTag(JNIEnv* env, jobject wb))
@@ -1526,8 +1526,8 @@
 WB_END
 
 WB_ENTRY(jint, WB_GetConstantPoolCacheLength(JNIEnv* env, jobject wb, jclass klass))
-  instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
-  ConstantPool* cp = ikh->constants();
+  InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
+  ConstantPool* cp = ik->constants();
   if (cp->cache() == NULL) {
       return -1;
   }
@@ -1535,8 +1535,8 @@
 WB_END
 
 WB_ENTRY(jint, WB_ConstantPoolRemapInstructionOperandFromCache(JNIEnv* env, jobject wb, jclass klass, jint index))
-  instanceKlassHandle ikh(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
-  ConstantPool* cp = ikh->constants();
+  InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
+  ConstantPool* cp = ik->constants();
   if (cp->cache() == NULL) {
     THROW_MSG_0(vmSymbols::java_lang_IllegalStateException(), "Constant pool does not have a cache");
   }
@@ -1950,8 +1950,8 @@
   {
     if (WhiteBoxAPI) {
       // Make sure that wbclass is loaded by the null classloader
-      instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
-      Handle loader(THREAD, ikh->class_loader());
+      InstanceKlass* ik = InstanceKlass::cast(JNIHandles::resolve(wbclass)->klass());
+      Handle loader(THREAD, ik->class_loader());
       if (loader.is_null()) {
         WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0]));
         WhiteBox::register_extended(env, wbclass, thread);
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -810,19 +810,19 @@
     assert(objects->at(i)->is_object(), "invalid debug information");
     ObjectValue* sv = (ObjectValue*) objects->at(i);
 
-    KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
+    Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()());
     oop obj = NULL;
 
     if (k->is_instance_klass()) {
-      InstanceKlass* ik = InstanceKlass::cast(k());
+      InstanceKlass* ik = InstanceKlass::cast(k);
       obj = ik->allocate_instance(THREAD);
     } else if (k->is_typeArray_klass()) {
-      TypeArrayKlass* ak = TypeArrayKlass::cast(k());
+      TypeArrayKlass* ak = TypeArrayKlass::cast(k);
       assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length");
       int len = sv->field_size() / type2size[ak->element_type()];
       obj = ak->allocate(len, THREAD);
     } else if (k->is_objArray_klass()) {
-      ObjArrayKlass* ak = ObjArrayKlass::cast(k());
+      ObjArrayKlass* ak = ObjArrayKlass::cast(k);
       obj = ak->allocate(sv->field_size(), THREAD);
     }
 
@@ -1079,7 +1079,7 @@
 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects, bool realloc_failures, bool skip_internal) {
   for (int i = 0; i < objects->length(); i++) {
     ObjectValue* sv = (ObjectValue*) objects->at(i);
-    KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
+    Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()());
     Handle obj = sv->value();
     assert(obj.not_null() || realloc_failures, "reallocation was missed");
     if (PrintDeoptimizationDetails) {
@@ -1090,10 +1090,10 @@
     }
 
     if (k->is_instance_klass()) {
-      InstanceKlass* ik = InstanceKlass::cast(k());
+      InstanceKlass* ik = InstanceKlass::cast(k);
       reassign_fields_by_klass(ik, fr, reg_map, sv, 0, obj(), skip_internal);
     } else if (k->is_typeArray_klass()) {
-      TypeArrayKlass* ak = TypeArrayKlass::cast(k());
+      TypeArrayKlass* ak = TypeArrayKlass::cast(k);
       reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type());
     } else if (k->is_objArray_klass()) {
       reassign_object_array_elements(fr, reg_map, sv, (objArrayOop) obj());
@@ -1137,7 +1137,7 @@
 
   for (int i = 0; i < objects->length(); i++) {
     ObjectValue* sv = (ObjectValue*) objects->at(i);
-    KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
+    Klass* k = java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()());
     Handle obj = sv->value();
 
     tty->print("     object <" INTPTR_FORMAT "> of type ", p2i(sv->value()()));
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -61,10 +61,10 @@
     reinitialize(ik, index);
   }
   Symbol* name() const {
-    return field()->name(_cp);
+    return field()->name(_cp());
   }
   Symbol* signature() const {
-    return field()->signature(_cp);
+    return field()->signature(_cp());
   }
   InstanceKlass* field_holder()   const    { return _cp->pool_holder(); }
   ConstantPool* constants()       const    { return _cp(); }
--- a/hotspot/src/share/vm/runtime/handles.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/handles.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -218,9 +218,4 @@
   area->_no_handle_mark_nesting = _no_handle_mark_nesting;
 }
 
-bool instanceKlassHandle::is_instanceKlass(const Klass* k) {
-  // Need this to avoid circular include dependency
-  return k->is_instance_klass();
-}
-
 #endif
--- a/hotspot/src/share/vm/runtime/handles.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/handles.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -166,48 +166,6 @@
 DEF_METADATA_HANDLE(method, Method)
 DEF_METADATA_HANDLE(constantPool, ConstantPool)
 
-// Writing this class explicitly, since DEF_METADATA_HANDLE(klass) doesn't
-// provide the necessary Klass* <-> Klass* conversions. This Klass
-// could be removed when we don't have the Klass* typedef anymore.
-class KlassHandle : public StackObj {
-  Klass* _value;
- protected:
-   Klass* obj() const          { return _value; }
-   Klass* non_null_obj() const { assert(_value != NULL, "resolving NULL _value"); return _value; }
-
- public:
-   KlassHandle()                                 : _value(NULL) {}
-   KlassHandle(const Klass* obj)                 : _value(const_cast<Klass *>(obj)) {};
-   KlassHandle(Thread* thread, const Klass* obj) : _value(const_cast<Klass *>(obj)) {};
-
-   Klass* operator () () const { return obj(); }
-   Klass* operator -> () const { return non_null_obj(); }
-
-   bool operator == (Klass* o) const             { return obj() == o; }
-   bool operator == (const KlassHandle& h) const { return obj() == h.obj(); }
-
-    bool is_null() const  { return _value == NULL; }
-    bool not_null() const { return _value != NULL; }
-};
-
-class instanceKlassHandle : public KlassHandle {
- public:
-  /* Constructors */
-  instanceKlassHandle () : KlassHandle() {}
-  instanceKlassHandle (const Klass* k) : KlassHandle(k) {
-    assert(k == NULL || is_instanceKlass(k), "illegal type");
-  }
-  instanceKlassHandle (Thread* thread, const Klass* k) : KlassHandle(thread, k) {
-    assert(k == NULL || is_instanceKlass(k), "illegal type");
-  }
-  /* Access to klass part */
-  InstanceKlass*       operator () () const { return (InstanceKlass*)obj(); }
-  InstanceKlass*       operator -> () const { return (InstanceKlass*)obj(); }
-
-  debug_only(bool is_instanceKlass(const Klass* k));
-};
-
-
 //------------------------------------------------------------------------------------------------------------------------
 // Thread local handle area
 class HandleArea: public Arena {
--- a/hotspot/src/share/vm/runtime/handles.inline.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/handles.inline.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -40,7 +40,7 @@
   }
 }
 
-// Constructors for metadata handles
+// Constructor for metadata handles
 #define DEF_METADATA_HANDLE_FN(name, type) \
 inline name##Handle::name##Handle(type* obj) : _value(obj), _thread(NULL) {       \
   if (obj != NULL) {                                                   \
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -179,10 +179,10 @@
 
 // ============ Virtual calls ============
 
-void JavaCalls::call_virtual(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
+void JavaCalls::call_virtual(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
   Handle receiver = args->receiver();
-  KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
+  Klass* recvrKlass = receiver.is_null() ? (Klass*)NULL : receiver->klass();
   LinkInfo link_info(spec_klass, name, signature);
   LinkResolver::resolve_virtual_call(
           callinfo, receiver, recvrKlass, link_info, true, CHECK);
@@ -194,13 +194,13 @@
 }
 
 
-void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, TRAPS) {
+void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   call_virtual(result, spec_klass, name, signature, &args, CHECK);
 }
 
 
-void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
+void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   args.push_oop(arg1);
   call_virtual(result, spec_klass, name, signature, &args, CHECK);
@@ -208,7 +208,7 @@
 
 
 
-void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
+void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   args.push_oop(arg1);
   args.push_oop(arg2);
@@ -218,7 +218,7 @@
 
 // ============ Special calls ============
 
-void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
+void JavaCalls::call_special(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
   LinkInfo link_info(klass, name, signature);
   LinkResolver::resolve_special_call(callinfo, link_info, CHECK);
@@ -230,20 +230,20 @@
 }
 
 
-void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
+void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   call_special(result, klass, name, signature, &args, CHECK);
 }
 
 
-void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
+void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   args.push_oop(arg1);
   call_special(result, klass, name, signature, &args, CHECK);
 }
 
 
-void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
+void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
   JavaCallArguments args(receiver); // One oop argument
   args.push_oop(arg1);
   args.push_oop(arg2);
@@ -253,7 +253,7 @@
 
 // ============ Static calls ============
 
-void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
+void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
   LinkInfo link_info(klass, name, signature);
   LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK);
@@ -265,19 +265,19 @@
 }
 
 
-void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
+void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, TRAPS) {
   JavaCallArguments args; // No argument
   call_static(result, klass, name, signature, &args, CHECK);
 }
 
 
-void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
+void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
   JavaCallArguments args(arg1); // One oop argument
   call_static(result, klass, name, signature, &args, CHECK);
 }
 
 
-void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
+void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
   JavaCallArguments args; // One oop argument
   args.push_oop(arg1);
   args.push_oop(arg2);
@@ -285,7 +285,7 @@
 }
 
 
-void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) {
+void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) {
   JavaCallArguments args; // One oop argument
   args.push_oop(arg1);
   args.push_oop(arg2);
--- a/hotspot/src/share/vm/runtime/javaCalls.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/javaCalls.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -187,30 +187,30 @@
   // call_special
   // ------------
   // The receiver must be first oop in argument list
-  static void call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
+  static void call_special(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
 
-  static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); // No args
-  static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
-  static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
+  static void call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, TRAPS); // No args
+  static void call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
+  static void call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
 
   // virtual call
   // ------------
 
   // The receiver must be first oop in argument list
-  static void call_virtual(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
+  static void call_virtual(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
 
-  static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, TRAPS); // No args
-  static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
-  static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
+  static void call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, TRAPS); // No args
+  static void call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
+  static void call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
 
   // Static call
   // -----------
-  static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
+  static void call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS);
 
-  static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
-  static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
-  static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
-  static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS);
+  static void call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, TRAPS);
+  static void call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
+  static void call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
+  static void call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS);
 
   // Low-level interface
   static void call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS);
--- a/hotspot/src/share/vm/runtime/jfieldIDWorkaround.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/jfieldIDWorkaround.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -150,13 +150,13 @@
     return result;
   }
 
-  static jfieldID to_jfieldID(instanceKlassHandle k, int offset, bool is_static) {
+  static jfieldID to_jfieldID(InstanceKlass* k, int offset, bool is_static) {
     if (is_static) {
       JNIid *id = k->jni_id_for(offset);
       debug_only(id->set_is_static_field_id());
       return jfieldIDWorkaround::to_static_jfieldID(id);
     } else {
-      return jfieldIDWorkaround::to_instance_jfieldID(k(), offset);
+      return jfieldIDWorkaround::to_instance_jfieldID(k, offset);
     }
   }
 };
--- a/hotspot/src/share/vm/runtime/os.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/os.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -291,9 +291,8 @@
       default: {
         // Dispatch the signal to java
         HandleMark hm(THREAD);
-        Klass* k = SystemDictionary::resolve_or_null(vmSymbols::jdk_internal_misc_Signal(), THREAD);
-        KlassHandle klass (THREAD, k);
-        if (klass.not_null()) {
+        Klass* klass = SystemDictionary::resolve_or_null(vmSymbols::jdk_internal_misc_Signal(), THREAD);
+        if (klass != NULL) {
           JavaValue result(T_VOID);
           JavaCallArguments args;
           args.push_int(sig);
@@ -352,8 +351,8 @@
   if (!ReduceSignalUsage) {
     // Setup JavaThread for processing signals
     Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
-    instanceKlassHandle klass (THREAD, k);
-    instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
+    InstanceKlass* ik = InstanceKlass::cast(k);
+    instanceHandle thread_oop = ik->allocate_instance_handle(CHECK);
 
     const char thread_name[] = "Signal Dispatcher";
     Handle string = java_lang_String::create_from_str(thread_name, CHECK);
@@ -362,14 +361,14 @@
     Handle thread_group (THREAD, Universe::system_thread_group());
     JavaValue result(T_VOID);
     JavaCalls::call_special(&result, thread_oop,
-                           klass,
+                           ik,
                            vmSymbols::object_initializer_name(),
                            vmSymbols::threadgroup_string_void_signature(),
                            thread_group,
                            string,
                            CHECK);
 
-    KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
+    Klass* group = SystemDictionary::ThreadGroup_klass();
     JavaCalls::call_special(&result,
                             thread_group,
                             group,
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -708,7 +708,7 @@
 // If inner_is_member, require the inner to be a member of the outer.
 // If !inner_is_member, require the inner to be anonymous (a non-member).
 // Caller is responsible for figuring out in advance which case must be true.
-void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner,
+void Reflection::check_for_inner_class(const InstanceKlass* outer, const InstanceKlass* inner,
                                        bool inner_is_member, TRAPS) {
   InnerClassesIterator iter(outer);
   constantPoolHandle cp   (THREAD, outer->constants());
@@ -718,9 +718,9 @@
 
      if (inner_is_member && ioff != 0 && ooff != 0) {
         Klass* o = cp->klass_at(ooff, CHECK);
-        if (o == outer()) {
+        if (o == outer) {
           Klass* i = cp->klass_at(ioff, CHECK);
-          if (i == inner()) {
+          if (i == inner) {
             return;
           }
         }
@@ -728,7 +728,7 @@
      if (!inner_is_member && ioff != 0 && ooff == 0 &&
          cp->klass_name_at_matches(inner, ioff)) {
         Klass* i = cp->klass_at(ioff, CHECK);
-        if (i == inner()) {
+        if (i == inner) {
           return;
         }
      }
@@ -802,7 +802,7 @@
   return method->resolved_checked_exceptions(THREAD);
 }
 
-static Handle new_type(Symbol* signature, KlassHandle k, TRAPS) {
+static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
   // Basic types
   BasicType type = vmSymbols::signature_type(signature);
   if (type != T_OBJECT) {
@@ -829,7 +829,7 @@
   assert(!method()->is_initializer() ||
          (for_constant_pool_access && method()->is_static()),
          "should call new_constructor instead");
-  instanceKlassHandle holder (THREAD, method->method_holder());
+  InstanceKlass* holder = method->method_holder();
   int slot = method->method_idnum();
 
   Symbol*  signature  = method->signature();
@@ -890,7 +890,7 @@
 oop Reflection::new_constructor(const methodHandle& method, TRAPS) {
   assert(method()->is_initializer(), "should call new_method instead");
 
-  instanceKlassHandle  holder (THREAD, method->method_holder());
+  InstanceKlass* holder = method->method_holder();
   int slot = method->method_idnum();
 
   Symbol*  signature  = method->signature();
@@ -938,7 +938,7 @@
   oop name_oop = StringTable::intern(field_name, CHECK_NULL);
   Handle name = Handle(THREAD, name_oop);
   Symbol*  signature  = fd->signature();
-  instanceKlassHandle  holder    (THREAD, fd->field_holder());
+  InstanceKlass* holder = fd->field_holder();
   Handle type = new_type(signature, holder, CHECK_NULL);
   Handle rh  = java_lang_reflect_Field::create(CHECK_NULL);
 
@@ -985,9 +985,9 @@
 }
 
 
-static methodHandle resolve_interface_call(instanceKlassHandle klass,
+static methodHandle resolve_interface_call(InstanceKlass* klass,
                                            const methodHandle& method,
-                                           KlassHandle recv_klass,
+                                           Klass* recv_klass,
                                            Handle receiver,
                                            TRAPS) {
 
@@ -1035,7 +1035,7 @@
 
 
 // Method call (shared by invoke_method and invoke_constructor)
-static oop invoke(instanceKlassHandle klass,
+static oop invoke(InstanceKlass* klass,
                   methodHandle reflected_method,
                   Handle receiver,
                   bool override,
@@ -1048,7 +1048,7 @@
   ResourceMark rm(THREAD);
 
   methodHandle method;      // actual method to invoke
-  KlassHandle target_klass; // target klass, receiver's klass for non-static
+  Klass* target_klass;      // target klass, receiver's klass for non-static
 
   // Ensure klass is initialized
   klass->initialize(CHECK_NULL);
@@ -1064,11 +1064,11 @@
       THROW_0(vmSymbols::java_lang_NullPointerException());
     }
     // Check class of receiver against class declaring method
-    if (!receiver->is_a(klass())) {
+    if (!receiver->is_a(klass)) {
       THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "object is not an instance of declaring class");
     }
     // target klass is receiver's klass
-    target_klass = KlassHandle(THREAD, receiver->klass());
+    target_klass = receiver->klass();
     // no need to resolve if method is private or <init>
     if (reflected_method->is_private() || reflected_method->name() == vmSymbols::object_initializer_name()) {
       method = reflected_method;
@@ -1109,7 +1109,7 @@
             ResourceMark rm(THREAD);
             Handle h_origexception = Exceptions::new_exception(THREAD,
               vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(target_klass(),
+              Method::name_and_sig_as_C_string(target_klass,
               method->name(),
               method->signature()));
             JavaCallArguments args(h_origexception);
@@ -1127,7 +1127,7 @@
   if (method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
-                Method::name_and_sig_as_C_string(klass(),
+                Method::name_and_sig_as_C_string(klass,
                 reflected_method->name(),
                 reflected_method->signature()));
   }
@@ -1229,7 +1229,7 @@
     rtype = T_OBJECT;
   }
 
-  instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror));
+  InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
   Method* m = klass->method_with_idnum(slot);
   if (m == NULL) {
     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
@@ -1246,7 +1246,7 @@
   bool override          = java_lang_reflect_Constructor::override(constructor_mirror) != 0;
   objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror)));
 
-  instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror));
+  InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
   Method* m = klass->method_with_idnum(slot);
   if (m == NULL) {
     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
--- a/hotspot/src/share/vm/runtime/reflection.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/reflection.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -103,8 +103,8 @@
   // If inner_is_member, require the inner to be a member of the outer.
   // If !inner_is_member, require the inner to be anonymous (a non-member).
   // Caller is responsible for figuring out in advance which case must be true.
-  static void check_for_inner_class(instanceKlassHandle outer,
-                                    instanceKlassHandle inner,
+  static void check_for_inner_class(const InstanceKlass* outer,
+                                    const InstanceKlass* inner,
                                     bool inner_is_member,
                                     TRAPS);
 
--- a/hotspot/src/share/vm/runtime/reflectionUtils.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/reflectionUtils.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -27,7 +27,7 @@
 #include "memory/universe.inline.hpp"
 #include "runtime/reflectionUtils.hpp"
 
-KlassStream::KlassStream(instanceKlassHandle klass, bool local_only,
+KlassStream::KlassStream(InstanceKlass* klass, bool local_only,
                          bool classes_only, bool walk_defaults) {
   _klass = _base_klass = klass;
   _base_class_search_defaults = false;
@@ -48,7 +48,7 @@
   if (_local_only) return true;
   if (!_klass->is_interface() && _klass->super() != NULL) {
     // go up superclass chain (not for interfaces)
-    _klass = _klass->super();
+    _klass = InstanceKlass::cast(_klass->super());
   // Next for method walks, walk default methods
   } else if (_walk_defaults && (_defaults_checked == false)  && (_base_klass->default_methods() != NULL)) {
       _base_class_search_defaults = true;
@@ -57,7 +57,7 @@
   } else {
     // Next walk transitive interfaces
     if (_interface_index > 0) {
-      _klass = _interfaces->at(--_interface_index);
+      _klass = InstanceKlass::cast(_interfaces->at(--_interface_index));
     } else {
       return true;
     }
--- a/hotspot/src/share/vm/runtime/reflectionUtils.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/reflectionUtils.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -45,8 +45,8 @@
 
 class KlassStream VALUE_OBJ_CLASS_SPEC {
  protected:
-  instanceKlassHandle _klass;           // current klass/interface iterated over
-  instanceKlassHandle _base_klass;      // initial klass/interface to iterate over
+  InstanceKlass*      _klass;           // current klass/interface iterated over
+  InstanceKlass*      _base_klass;      // initial klass/interface to iterate over
   Array<Klass*>*      _interfaces;      // transitive interfaces for initial class
   int                 _interface_index; // current interface being processed
   bool                _local_only;      // process initial class/interface only
@@ -60,7 +60,7 @@
 
  public:
   // constructor
-  KlassStream(instanceKlassHandle klass, bool local_only, bool classes_only, bool walk_defaults);
+  KlassStream(InstanceKlass* klass, bool local_only, bool classes_only, bool walk_defaults);
 
   // testing
   bool eos();
@@ -69,7 +69,7 @@
   virtual void next() = 0;
 
   // accessors
-  instanceKlassHandle klass() const { return _klass; }
+  InstanceKlass* klass() const      { return _klass; }
   int index() const                 { return _index; }
   bool base_class_search_defaults() const { return _base_class_search_defaults; }
   void base_class_search_defaults(bool b) { _base_class_search_defaults = b; }
@@ -97,7 +97,7 @@
     }
   }
  public:
-  MethodStream(instanceKlassHandle klass, bool local_only, bool classes_only)
+  MethodStream(InstanceKlass* klass, bool local_only, bool classes_only)
     : KlassStream(klass, local_only, classes_only, true) {
     _index = length();
     next();
@@ -125,7 +125,7 @@
   fieldDescriptor _fd_buf;
 
  public:
-  FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only)
+  FieldStream(InstanceKlass* klass, bool local_only, bool classes_only)
     : KlassStream(klass, local_only, classes_only, false) {
     _index = length();
     next();
@@ -152,7 +152,7 @@
   // bridge to a heavier API:
   fieldDescriptor& field_descriptor() const {
     fieldDescriptor& field = const_cast<fieldDescriptor&>(_fd_buf);
-    field.reinitialize(_klass(), _index);
+    field.reinitialize(_klass, _index);
     return field;
   }
 };
@@ -222,15 +222,15 @@
   bool has_filtered_field() { return (_filtered_fields_count > 0); }
 
  public:
-  FilteredFieldStream(instanceKlassHandle klass, bool local_only, bool classes_only)
+  FilteredFieldStream(InstanceKlass* klass, bool local_only, bool classes_only)
     : FieldStream(klass, local_only, classes_only) {
-    _filtered_fields_count = FilteredFieldsMap::filtered_fields_count((Klass*)klass(), local_only);
+    _filtered_fields_count = FilteredFieldsMap::filtered_fields_count(klass, local_only);
   }
   int field_count();
   void next() {
     _index -= 1;
     if (has_filtered_field()) {
-      while (_index >=0 && FilteredFieldsMap::is_filtered_field((Klass*)_klass(), offset())) {
+      while (_index >=0 && FilteredFieldsMap::is_filtered_field((Klass*)_klass, offset())) {
         _index -= 1;
       }
     }
--- a/hotspot/src/share/vm/runtime/serviceThread.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/serviceThread.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, 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
@@ -40,7 +40,7 @@
 void ServiceThread::initialize() {
   EXCEPTION_MARK;
 
-  instanceKlassHandle klass (THREAD,  SystemDictionary::Thread_klass());
+  InstanceKlass* klass = SystemDictionary::Thread_klass();
   instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
 
   const char* name = "Service Thread";
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -675,7 +675,7 @@
     do {
       bool skip_scope_increment = false;
       // exception handler lookup
-      KlassHandle ek (THREAD, exception->klass());
+      Klass* ek = exception->klass();
       methodHandle mh(THREAD, sd->method());
       handler_bci = Method::fast_exception_handler_bci_for(mh, ek, bci, THREAD);
       if (HAS_PENDING_EXCEPTION) {
@@ -1185,7 +1185,7 @@
   // Check that the receiver klass is of the right subtype and that it is initialized for virtual calls
   if (has_receiver) {
     assert(receiver.not_null(), "should have thrown exception");
-    KlassHandle receiver_klass(THREAD, receiver->klass());
+    Klass* receiver_klass = receiver->klass();
     Klass* rk = NULL;
     if (attached_method.not_null()) {
       // In case there's resolved method attached, use its holder during the check.
@@ -1195,16 +1195,16 @@
       constantPoolHandle constants(THREAD, caller->constants());
       rk = constants->klass_ref_at(bytecode_index, CHECK_NH);
     }
-    KlassHandle static_receiver_klass(THREAD, rk);
+    Klass* static_receiver_klass = rk;
     methodHandle callee = callinfo.selected_method();
-    assert(receiver_klass->is_subtype_of(static_receiver_klass()),
+    assert(receiver_klass->is_subtype_of(static_receiver_klass),
            "actual receiver must be subclass of static receiver klass");
     if (receiver_klass->is_instance_klass()) {
-      if (InstanceKlass::cast(receiver_klass())->is_not_initialized()) {
+      if (InstanceKlass::cast(receiver_klass)->is_not_initialized()) {
         tty->print_cr("ERROR: Klass not yet initialized!!");
-        receiver_klass()->print();
+        receiver_klass->print();
       }
-      assert(!InstanceKlass::cast(receiver_klass())->is_not_initialized(), "receiver_klass must be initialized");
+      assert(!InstanceKlass::cast(receiver_klass)->is_not_initialized(), "receiver_klass must be initialized");
     }
   }
 #endif
@@ -1363,8 +1363,8 @@
   if (is_virtual) {
     assert(receiver.not_null() || invoke_code == Bytecodes::_invokehandle, "sanity check");
     bool static_bound = call_info.resolved_method()->can_be_statically_bound();
-    KlassHandle h_klass(THREAD, invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass());
-    CompiledIC::compute_monomorphic_entry(callee_method, h_klass,
+    Klass* klass = invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass();
+    CompiledIC::compute_monomorphic_entry(callee_method, klass,
                      is_optimized, static_bound, is_nmethod, virtual_call_info,
                      CHECK_(methodHandle()));
   } else {
@@ -1625,7 +1625,7 @@
         // and now we have (or had) a compiled entry. We correct the IC
         // by using a new icBuffer.
         CompiledICInfo info;
-        KlassHandle receiver_klass(THREAD, receiver()->klass());
+        Klass* receiver_klass = receiver()->klass();
         inline_cache->compute_monomorphic_entry(callee_method,
                                                 receiver_klass,
                                                 inline_cache->is_optimized(),
--- a/hotspot/src/share/vm/runtime/statSampler.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/statSampler.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, 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
@@ -187,7 +187,7 @@
 
   // public static String getProperty(String key, String def);
   JavaCalls::call_static(&result,
-                         KlassHandle(THREAD, SystemDictionary::System_klass()),
+                         SystemDictionary::System_klass(),
                          vmSymbols::getProperty_name(),
                          vmSymbols::string_string_signature(),
                          key_str,
--- a/hotspot/src/share/vm/runtime/thread.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -950,27 +950,27 @@
 // Creates the initial ThreadGroup
 static Handle create_initial_thread_group(TRAPS) {
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_ThreadGroup(), true, CHECK_NH);
-  instanceKlassHandle klass (THREAD, k);
-
-  Handle system_instance = klass->allocate_instance_handle(CHECK_NH);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+
+  Handle system_instance = ik->allocate_instance_handle(CHECK_NH);
   {
     JavaValue result(T_VOID);
     JavaCalls::call_special(&result,
                             system_instance,
-                            klass,
+                            ik,
                             vmSymbols::object_initializer_name(),
                             vmSymbols::void_method_signature(),
                             CHECK_NH);
   }
   Universe::set_system_thread_group(system_instance());
 
-  Handle main_instance = klass->allocate_instance_handle(CHECK_NH);
+  Handle main_instance = ik->allocate_instance_handle(CHECK_NH);
   {
     JavaValue result(T_VOID);
     Handle string = java_lang_String::create_from_str("main", CHECK_NH);
     JavaCalls::call_special(&result,
                             main_instance,
-                            klass,
+                            ik,
                             vmSymbols::object_initializer_name(),
                             vmSymbols::threadgroup_string_void_signature(),
                             system_instance,
@@ -984,8 +984,8 @@
 static oop create_initial_thread(Handle thread_group, JavaThread* thread,
                                  TRAPS) {
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL);
-  instanceKlassHandle klass (THREAD, k);
-  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  instanceHandle thread_oop = ik->allocate_instance_handle(CHECK_NULL);
 
   java_lang_Thread::set_thread(thread_oop(), thread);
   java_lang_Thread::set_priority(thread_oop(), NormPriority);
@@ -995,7 +995,7 @@
 
   JavaValue result(T_VOID);
   JavaCalls::call_special(&result, thread_oop,
-                          klass,
+                          ik,
                           vmSymbols::object_initializer_name(),
                           vmSymbols::threadgroup_string_void_signature(),
                           thread_group,
@@ -1054,9 +1054,8 @@
 // General purpose hook into Java code, run once when the VM is initialized.
 // The Java library method itself may be changed independently from the VM.
 static void call_postVMInitHook(TRAPS) {
-  Klass* k = SystemDictionary::resolve_or_null(vmSymbols::jdk_internal_vm_PostVMInitHook(), THREAD);
-  instanceKlassHandle klass (THREAD, k);
-  if (klass.not_null()) {
+  Klass* klass = SystemDictionary::resolve_or_null(vmSymbols::jdk_internal_vm_PostVMInitHook(), THREAD);
+  if (klass != NULL) {
     JavaValue result(T_VOID);
     JavaCalls::call_static(&result, klass, vmSymbols::run_method_name(),
                            vmSymbols::void_method_signature(),
@@ -1070,8 +1069,7 @@
   const char *vm_info = VM_Version::vm_info_string();
 
   // java.lang.System class
-  Klass* k =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
-  instanceKlassHandle klass (THREAD, k);
+  Klass* klass =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
 
   // setProperty arguments
   Handle key_str    = java_lang_String::create_from_str("java.vm.info", CHECK);
@@ -1097,8 +1095,8 @@
   assert(threadObj() == NULL, "should only create Java thread object once");
 
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK);
-  instanceKlassHandle klass (THREAD, k);
-  instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
+  InstanceKlass* ik = InstanceKlass::cast(k);
+  instanceHandle thread_oop = ik->allocate_instance_handle(CHECK);
 
   java_lang_Thread::set_thread(thread_oop(), this);
   java_lang_Thread::set_priority(thread_oop(), NormPriority);
@@ -1110,7 +1108,7 @@
     // Thread gets assigned specified name and null target
     JavaCalls::call_special(&result,
                             thread_oop,
-                            klass,
+                            ik,
                             vmSymbols::object_initializer_name(),
                             vmSymbols::threadgroup_string_void_signature(),
                             thread_group, // Argument 1
@@ -1121,7 +1119,7 @@
     // (java.lang.Thread doesn't have a constructor taking only a ThreadGroup argument)
     JavaCalls::call_special(&result,
                             thread_oop,
-                            klass,
+                            ik,
                             vmSymbols::object_initializer_name(),
                             vmSymbols::threadgroup_runnable_void_signature(),
                             thread_group, // Argument 1
@@ -1138,7 +1136,7 @@
     return;
   }
 
-  KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
+  Klass* group =  SystemDictionary::ThreadGroup_klass();
   Handle threadObj(THREAD, this->threadObj());
 
   JavaCalls::call_special(&result,
@@ -1779,7 +1777,7 @@
     if (uncaught_exception.not_null()) {
       EXCEPTION_MARK;
       // Call method Thread.dispatchUncaughtException().
-      KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
+      Klass* thread_klass = SystemDictionary::Thread_klass();
       JavaValue result(T_VOID);
       JavaCalls::call_virtual(&result,
                               threadObj, thread_klass,
@@ -1817,7 +1815,7 @@
       while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) {
         EXCEPTION_MARK;
         JavaValue result(T_VOID);
-        KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
+        Klass* thread_klass = SystemDictionary::Thread_klass();
         JavaCalls::call_virtual(&result,
                                 threadObj, thread_klass,
                                 vmSymbols::exit_method_name(),
@@ -3388,9 +3386,7 @@
 //     fields in, out, and err. Set up java signal handlers, OS-specific
 //     system settings, and thread group of the main thread.
 static void call_initPhase1(TRAPS) {
-  Klass* k =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
-  instanceKlassHandle klass (THREAD, k);
-
+  Klass* klass =  SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
   JavaValue result(T_VOID);
   JavaCalls::call_static(&result, klass, vmSymbols::initPhase1_name(),
                                          vmSymbols::void_method_signature(), CHECK);
@@ -3410,8 +3406,7 @@
 static void call_initPhase2(TRAPS) {
   TraceTime timer("Phase2 initialization", TRACETIME_LOG(Info, modules, startuptime));
 
-  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
-  instanceKlassHandle klass (THREAD, k);
+  Klass* klass = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
 
   JavaValue result(T_VOID);
   JavaCalls::call_static(&result, klass, vmSymbols::initPhase2_name(),
@@ -3426,9 +3421,7 @@
 //     and system class loader may be a custom class loaded from -Xbootclasspath/a,
 //     other modules or the application's classpath.
 static void call_initPhase3(TRAPS) {
-  Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
-  instanceKlassHandle klass (THREAD, k);
-
+  Klass* klass = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK);
   JavaValue result(T_VOID);
   JavaCalls::call_static(&result, klass, vmSymbols::initPhase3_name(),
                                          vmSymbols::void_method_signature(), CHECK);
@@ -4064,10 +4057,10 @@
   }
 
   EXCEPTION_MARK;
-  Klass* k =
+  Klass* shutdown_klass =
     SystemDictionary::resolve_or_null(vmSymbols::java_lang_Shutdown(),
                                       THREAD);
-  if (k != NULL) {
+  if (shutdown_klass != NULL) {
     // SystemDictionary::resolve_or_null will return null if there was
     // an exception.  If we cannot load the Shutdown class, just don't
     // call Shutdown.shutdown() at all.  This will mean the shutdown hooks
@@ -4075,7 +4068,6 @@
     // Note that if a shutdown hook was registered or runFinalizersOnExit
     // was called, the Shutdown class would have already been loaded
     // (Runtime.addShutdownHook and runFinalizersOnExit will load it).
-    instanceKlassHandle shutdown_klass (THREAD, k);
     JavaValue result(T_VOID);
     JavaCalls::call_static(&result,
                            shutdown_klass,
--- a/hotspot/src/share/vm/runtime/vframe.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/vframe.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -521,14 +521,14 @@
 
   int    method_prefix_count = 0;
   char** method_prefixes = JvmtiExport::get_all_native_method_prefixes(&method_prefix_count);
-  KlassHandle prefixed_klass(method()->method_holder());
+  Klass* prefixed_klass = method()->method_holder();
   const char* prefixed_name = method()->name()->as_C_string();
   size_t prefixed_name_len = strlen(prefixed_name);
   int prefix_index = method_prefix_count-1;
 
   while (!at_end()) {
     next();
-    if (method()->method_holder() != prefixed_klass()) {
+    if (method()->method_holder() != prefixed_klass) {
       break; // classes don't match, can't be a wrapper
     }
     const char* name = method()->name()->as_C_string();
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -194,9 +194,9 @@
 typedef Hashtable<Symbol*, mtSymbol>          SymbolHashtable;
 typedef HashtableEntry<Symbol*, mtClass>      SymbolHashtableEntry;
 typedef Hashtable<oop, mtSymbol>              StringHashtable;
-typedef TwoOopHashtable<Klass*, mtClass>      KlassTwoOopHashtable;
-typedef Hashtable<Klass*, mtClass>            KlassHashtable;
-typedef HashtableEntry<Klass*, mtClass>       KlassHashtableEntry;
+typedef TwoOopHashtable<InstanceKlass*, mtClass> KlassTwoOopHashtable;
+typedef Hashtable<InstanceKlass*, mtClass>       KlassHashtable;
+typedef HashtableEntry<InstanceKlass*, mtClass>  KlassHashtableEntry;
 typedef TwoOopHashtable<Symbol*, mtClass>     SymbolTwoOopHashtable;
 typedef CompactHashtable<Symbol*, char>       SymbolCompactHashTable;
 
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -292,7 +292,7 @@
 #ifndef PRODUCT
 class VM_DeoptimizeAll: public VM_Operation {
  private:
-  KlassHandle _dependee;
+  Klass* _dependee;
  public:
   VM_DeoptimizeAll() {}
   VMOp_Type type() const                         { return VMOp_DeoptimizeAll; }
--- a/hotspot/src/share/vm/services/attachListener.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/attachListener.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -46,13 +46,13 @@
 // Invokes VMSupport.serializePropertiesToByteArray to serialize
 // the system properties into a byte array.
 
-static Klass* load_and_initialize_klass(Symbol* sh, TRAPS) {
+static InstanceKlass* load_and_initialize_klass(Symbol* sh, TRAPS) {
   Klass* k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   if (ik->should_be_initialized()) {
     ik->initialize(CHECK_NULL);
   }
-  return ik();
+  return ik;
 }
 
 static jint get_properties(AttachOperation* op, outputStream* out, Symbol* serializePropertiesMethod) {
@@ -61,13 +61,12 @@
 
   // load VMSupport
   Symbol* klass = vmSymbols::jdk_internal_vm_VMSupport();
-  Klass* k = load_and_initialize_klass(klass, THREAD);
+  InstanceKlass* k = load_and_initialize_klass(klass, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     java_lang_Throwable::print(PENDING_EXCEPTION, out);
     CLEAR_PENDING_EXCEPTION;
     return JNI_ERR;
   }
-  instanceKlassHandle ik(THREAD, k);
 
   // invoke the serializePropertiesToByteArray method
   JavaValue result(T_OBJECT);
@@ -76,11 +75,11 @@
 
   Symbol* signature = vmSymbols::serializePropertiesToByteArray_signature();
   JavaCalls::call_static(&result,
-                           ik,
-                           serializePropertiesMethod,
-                           signature,
-                           &args,
-                           THREAD);
+                         k,
+                         serializePropertiesMethod,
+                         signature,
+                         &args,
+                         THREAD);
   if (HAS_PENDING_EXCEPTION) {
     java_lang_Throwable::print(PENDING_EXCEPTION, out);
     CLEAR_PENDING_EXCEPTION;
@@ -374,7 +373,7 @@
     return;
   }
 
-  instanceKlassHandle klass (THREAD, k);
+  InstanceKlass* klass = InstanceKlass::cast(k);
   instanceHandle thread_oop = klass->allocate_instance_handle(THREAD);
   if (has_init_error(THREAD)) {
     return;
@@ -401,7 +400,7 @@
     return;
   }
 
-  KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
+  Klass* group = SystemDictionary::ThreadGroup_klass();
   JavaCalls::call_special(&result,
                         thread_group,
                         group,
--- a/hotspot/src/share/vm/services/classLoadingService.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/classLoadingService.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -197,24 +197,21 @@
   LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, unload));
 }
 
-GrowableArray<KlassHandle>* LoadedClassesEnumerator::_loaded_classes = NULL;
-Thread* LoadedClassesEnumerator::_current_thread = NULL;
+GrowableArray<Klass*>* LoadedClassesEnumerator::_loaded_classes = NULL;
 
-LoadedClassesEnumerator::LoadedClassesEnumerator(Thread* cur_thread) {
-  assert(cur_thread == Thread::current(), "Check current thread");
+LoadedClassesEnumerator::LoadedClassesEnumerator() {
 
   int init_size = ClassLoadingService::loaded_class_count();
-  _klass_handle_array = new GrowableArray<KlassHandle>(init_size);
+  _klass_array = new GrowableArray<Klass*>(init_size);
 
   // For consistency of the loaded classes, grab the SystemDictionary lock
   MutexLocker sd_mutex(SystemDictionary_lock);
 
-  // Set _loaded_classes and _current_thread and begin enumerating all classes.
+  // Set _loaded_classes and begin enumerating all classes.
   // Only one thread will do the enumeration at a time.
   // These static variables are needed and they are used by the static method
   // add_loaded_class called from classes_do().
-  _loaded_classes = _klass_handle_array;
-  _current_thread = cur_thread;
+  _loaded_classes = _klass_array;
 
   SystemDictionary::classes_do(&add_loaded_class);
 
--- a/hotspot/src/share/vm/services/classLoadingService.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/classLoadingService.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -120,17 +120,14 @@
 // FIXME: make this piece of code to be shared by M&M and JVMTI
 class LoadedClassesEnumerator : public StackObj {
 private:
-  static GrowableArray<KlassHandle>* _loaded_classes;
-  // _current_thread is for creating a KlassHandle with a faster version constructor
-  static Thread*                     _current_thread;
-
-  GrowableArray<KlassHandle>* _klass_handle_array;
+  static GrowableArray<Klass*>* _loaded_classes;
+  GrowableArray<Klass*>* _klass_array;
 
 public:
-  LoadedClassesEnumerator(Thread* cur_thread);
+  LoadedClassesEnumerator();
 
-  int num_loaded_classes()         { return _klass_handle_array->length(); }
-  KlassHandle get_klass(int index) { return _klass_handle_array->at(index); }
+  int num_loaded_classes()         { return _klass_array->length(); }
+  Klass* get_klass(int index)      { return _klass_array->at(index); }
 
   static void add_loaded_class(Klass* k) {
     // FIXME: For now - don't include array klasses
@@ -138,11 +135,9 @@
     // and also indirect creation of array of super class and secondaries
     //
     // for (Klass* l = k; l != NULL; l = l->array_klass_or_null()) {
-    //  KlassHandle h(_current_thread, l);
-    //  _loaded_classes->append(h);
+    //  _loaded_classes->append(l);
     // }
-    KlassHandle h(_current_thread, k);
-    _loaded_classes->append(h);
+    _loaded_classes->append(k);
   }
 };
 
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -324,7 +324,7 @@
   // load VMSupport
   Symbol* klass = vmSymbols::jdk_internal_vm_VMSupport();
   Klass* k = SystemDictionary::resolve_or_fail(klass, true, CHECK);
-  instanceKlassHandle ik (THREAD, k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
   if (ik->should_be_initialized()) {
     ik->initialize(THREAD);
   }
@@ -405,9 +405,8 @@
 void RunFinalizationDCmd::execute(DCmdSource source, TRAPS) {
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(),
                                                  true, CHECK);
-  instanceKlassHandle klass(THREAD, k);
   JavaValue result(T_VOID);
-  JavaCalls::call_static(&result, klass,
+  JavaCalls::call_static(&result, k,
                          vmSymbols::run_finalization_name(),
                          vmSymbols::void_method_signature(), CHECK);
 }
@@ -423,13 +422,12 @@
   Klass* k = SystemDictionary::resolve_or_fail(
     vmSymbols::finalizer_histogram_klass(), true, CHECK);
 
-  instanceKlassHandle klass(THREAD, k);
   JavaValue result(T_ARRAY);
 
   // We are calling lang.ref.FinalizerHistogram.getFinalizerHistogram() method
   // and expect it to return array of FinalizerHistogramEntry as Object[]
 
-  JavaCalls::call_static(&result, klass,
+  JavaCalls::call_static(&result, k,
                          vmSymbols::get_finalizer_histogram_name(),
                          vmSymbols::void_finalizer_histogram_entry_array_signature(), CHECK);
 
@@ -753,7 +751,6 @@
 
     Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
     Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::jdk_internal_agent_Agent(), loader, Handle(), true, CHECK);
-    instanceKlassHandle ik (THREAD, k);
 
     JavaValue result(T_VOID);
 
@@ -807,7 +804,7 @@
 #undef PUT_OPTION
 
     Handle str = java_lang_String::create_from_str(options.as_string(), CHECK);
-    JavaCalls::call_static(&result, ik, vmSymbols::startRemoteAgent_name(), vmSymbols::string_void_signature(), str, CHECK);
+    JavaCalls::call_static(&result, k, vmSymbols::startRemoteAgent_name(), vmSymbols::string_void_signature(), str, CHECK);
 }
 
 JMXStartLocalDCmd::JMXStartLocalDCmd(outputStream *output, bool heap_allocated) :
@@ -826,10 +823,9 @@
 
     Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
     Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::jdk_internal_agent_Agent(), loader, Handle(), true, CHECK);
-    instanceKlassHandle ik (THREAD, k);
 
     JavaValue result(T_VOID);
-    JavaCalls::call_static(&result, ik, vmSymbols::startLocalAgent_name(), vmSymbols::void_method_signature(), CHECK);
+    JavaCalls::call_static(&result, k, vmSymbols::startLocalAgent_name(), vmSymbols::void_method_signature(), CHECK);
 }
 
 void JMXStopRemoteDCmd::execute(DCmdSource source, TRAPS) {
@@ -843,10 +839,9 @@
 
     Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
     Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::jdk_internal_agent_Agent(), loader, Handle(), true, CHECK);
-    instanceKlassHandle ik (THREAD, k);
 
     JavaValue result(T_VOID);
-    JavaCalls::call_static(&result, ik, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK);
+    JavaCalls::call_static(&result, k, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK);
 }
 
 JMXStatusDCmd::JMXStatusDCmd(outputStream *output, bool heap_allocated) :
@@ -864,10 +859,9 @@
 
   Handle loader = Handle(THREAD, SystemDictionary::java_system_loader());
   Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::jdk_internal_agent_Agent(), loader, Handle(), true, CHECK);
-  instanceKlassHandle ik (THREAD, k);
 
   JavaValue result(T_OBJECT);
-  JavaCalls::call_static(&result, ik, vmSymbols::getAgentStatus_name(), vmSymbols::void_string_signature(), CHECK);
+  JavaCalls::call_static(&result, k, vmSymbols::getAgentStatus_name(), vmSymbols::void_string_signature(), CHECK);
 
   jvalue* jv = (jvalue*) result.get_value_addr();
   oop str = (oop) jv->l;
--- a/hotspot/src/share/vm/services/diagnosticFramework.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/diagnosticFramework.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -457,7 +457,7 @@
   if (notif) {
 
     Klass* k = Management::com_sun_management_internal_DiagnosticCommandImpl_klass(CHECK);
-    instanceKlassHandle dcmd_mbean_klass(THREAD, k);
+    InstanceKlass* dcmd_mbean_klass = InstanceKlass::cast(k);
 
     JavaValue result(T_OBJECT);
     JavaCalls::call_static(&result,
--- a/hotspot/src/share/vm/services/gcNotifier.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/gcNotifier.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -79,8 +79,7 @@
 
 static Handle getGcInfoBuilder(GCMemoryManager *gcManager,TRAPS) {
 
-  Klass* k = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_NH);
-  instanceKlassHandle gcMBeanKlass (THREAD, k);
+  Klass* gcMBeanKlass = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_NH);
 
   instanceOop i = gcManager->get_memory_manager_instance(THREAD);
   instanceHandle ih(THREAD, i);
@@ -102,16 +101,15 @@
   // Fill the arrays of MemoryUsage objects with before and after GC
   // per pool memory usage
 
-  Klass* mu_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_NH);
-  instanceKlassHandle mu_kh(THREAD, mu_klass);
+  InstanceKlass* mu_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_NH);
 
   // The array allocations below should use a handle containing mu_klass
   // as the first allocation could trigger a GC, causing the actual
   // klass oop to move, and leaving mu_klass pointing to the old
   // location.
-  objArrayOop bu = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH);
+  objArrayOop bu = oopFactory::new_objArray(mu_klass, MemoryService::num_memory_pools(), CHECK_NH);
   objArrayHandle usage_before_gc_ah(THREAD, bu);
-  objArrayOop au = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH);
+  objArrayOop au = oopFactory::new_objArray(mu_klass, MemoryService::num_memory_pools(), CHECK_NH);
   objArrayHandle usage_after_gc_ah(THREAD, au);
 
   for (int i = 0; i < MemoryService::num_memory_pools(); i++) {
@@ -135,8 +133,7 @@
   // The type is 'I'
   objArrayOop extra_args_array = oopFactory::new_objArray(SystemDictionary::Integer_klass(), 1, CHECK_NH);
   objArrayHandle extra_array (THREAD, extra_args_array);
-  Klass* itKlass = SystemDictionary::Integer_klass();
-  instanceKlassHandle intK(THREAD, itKlass);
+  InstanceKlass* intK = SystemDictionary::Integer_klass();
 
   instanceHandle extra_arg_val = intK->allocate_instance_handle(CHECK_NH);
 
@@ -155,10 +152,9 @@
   }
   extra_array->obj_at_put(0,extra_arg_val());
 
-  Klass* gcInfoklass = Management::com_sun_management_GcInfo_klass(CHECK_NH);
-  instanceKlassHandle ik(THREAD, gcInfoklass);
+  InstanceKlass* gcInfoklass = Management::com_sun_management_GcInfo_klass(CHECK_NH);
 
-  Handle gcInfo_instance = ik->allocate_instance_handle(CHECK_NH);
+  Handle gcInfo_instance = gcInfoklass->allocate_instance_handle(CHECK_NH);
 
   JavaValue constructor_result(T_VOID);
   JavaCallArguments constructor_args(16);
@@ -172,7 +168,7 @@
   constructor_args.push_oop(extra_array);
 
   JavaCalls::call_special(&constructor_result,
-                          ik,
+                          gcInfoklass,
                           vmSymbols::object_initializer_name(),
                           vmSymbols::com_sun_management_GcInfo_constructor_signature(),
                           &constructor_args,
@@ -216,13 +212,11 @@
     Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK);
     Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK);
     Handle objCause = java_lang_String::create_from_str(request->gcCause, CHECK);
-    Klass* k = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK);
-
-    instanceKlassHandle gc_mbean_klass(THREAD, k);
+    InstanceKlass* gc_mbean_klass = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK);
 
     instanceOop gc_mbean = request->gcManager->get_memory_manager_instance(THREAD);
     instanceHandle gc_mbean_h(THREAD, gc_mbean);
-    if (!gc_mbean_h->is_a(k)) {
+    if (!gc_mbean_h->is_a(gc_mbean_klass)) {
       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
                 "This GCMemoryManager doesn't have a GarbageCollectorMXBean");
     }
--- a/hotspot/src/share/vm/services/heapDumper.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/heapDumper.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -814,11 +814,11 @@
 // returns the size of the instance of the given class
 u4 DumperSupport::instance_size(Klass* k) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   u4 size = 0;
 
-  for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) {
+  for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) {
     if (!fld.access_flags().is_static()) {
       Symbol* sig = fld.signature();
       switch (sig->byte_at(0)) {
@@ -847,18 +847,18 @@
 // dumps static fields of the given class
 void DumperSupport::dump_static_fields(DumpWriter* writer, Klass* k) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   // pass 1 - count the static fields
   u2 field_count = 0;
-  for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) {
+  for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) {
     if (fldc.access_flags().is_static()) field_count++;
   }
 
   writer->write_u2(field_count);
 
   // pass 2 - dump the field descriptors and raw values
-  for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) {
+  for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) {
     if (fld.access_flags().is_static()) {
       Symbol* sig = fld.signature();
 
@@ -867,7 +867,7 @@
 
       // value
       int offset = fld.offset();
-      address addr = (address)ikh->java_mirror() + offset;
+      address addr = (address)ik->java_mirror() + offset;
 
       dump_field_value(writer, sig->byte_at(0), addr);
     }
@@ -877,9 +877,9 @@
 // dump the raw values of the instance fields of the given object
 void DumperSupport::dump_instance_fields(DumpWriter* writer, oop o) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), o->klass());
+  InstanceKlass* ik = InstanceKlass::cast(o->klass());
 
-  for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) {
+  for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) {
     if (!fld.access_flags().is_static()) {
       Symbol* sig = fld.signature();
       address addr = (address)o + fld.offset();
@@ -892,18 +892,18 @@
 // dumps the definition of the instance fields for a given class
 void DumperSupport::dump_instance_field_descriptors(DumpWriter* writer, Klass* k) {
   HandleMark hm;
-  instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
+  InstanceKlass* ik = InstanceKlass::cast(k);
 
   // pass 1 - count the instance fields
   u2 field_count = 0;
-  for (FieldStream fldc(ikh, true, true); !fldc.eos(); fldc.next()) {
+  for (FieldStream fldc(ik, true, true); !fldc.eos(); fldc.next()) {
     if (!fldc.access_flags().is_static()) field_count++;
   }
 
   writer->write_u2(field_count);
 
   // pass 2 - dump the field descriptors
-  for (FieldStream fld(ikh, true, true); !fld.eos(); fld.next()) {
+  for (FieldStream fld(ik, true, true); !fld.eos(); fld.next()) {
     if (!fld.access_flags().is_static()) {
       Symbol* sig = fld.signature();
 
--- a/hotspot/src/share/vm/services/lowMemoryDetector.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/lowMemoryDetector.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -293,8 +293,7 @@
 void SensorInfo::trigger(int count, TRAPS) {
   assert(count <= _pending_trigger_count, "just checking");
   if (_sensor_obj != NULL) {
-    Klass* k = Management::sun_management_Sensor_klass(CHECK);
-    instanceKlassHandle sensorKlass (THREAD, k);
+    InstanceKlass* sensorKlass = Management::sun_management_Sensor_klass(CHECK);
     Handle sensor_h(THREAD, _sensor_obj);
     Handle usage_h = MemoryService::create_MemoryUsage_obj(_usage, CHECK);
 
@@ -337,8 +336,7 @@
   }
 
   if (_sensor_obj != NULL) {
-    Klass* k = Management::sun_management_Sensor_klass(CHECK);
-    instanceKlassHandle sensorKlass (THREAD, k);
+    InstanceKlass* sensorKlass = Management::sun_management_Sensor_klass(CHECK);
     Handle sensor(THREAD, _sensor_obj);
 
     JavaValue result(T_VOID);
--- a/hotspot/src/share/vm/services/management.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/management.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -62,16 +62,16 @@
 PerfVariable* Management::_end_vm_creation_time = NULL;
 PerfVariable* Management::_vm_init_done_time = NULL;
 
-Klass* Management::_diagnosticCommandImpl_klass = NULL;
-Klass* Management::_garbageCollectorExtImpl_klass = NULL;
-Klass* Management::_garbageCollectorMXBean_klass = NULL;
-Klass* Management::_gcInfo_klass = NULL;
-Klass* Management::_managementFactoryHelper_klass = NULL;
-Klass* Management::_memoryManagerMXBean_klass = NULL;
-Klass* Management::_memoryPoolMXBean_klass = NULL;
-Klass* Management::_memoryUsage_klass = NULL;
-Klass* Management::_sensor_klass = NULL;
-Klass* Management::_threadInfo_klass = NULL;
+InstanceKlass* Management::_diagnosticCommandImpl_klass = NULL;
+InstanceKlass* Management::_garbageCollectorExtImpl_klass = NULL;
+InstanceKlass* Management::_garbageCollectorMXBean_klass = NULL;
+InstanceKlass* Management::_gcInfo_klass = NULL;
+InstanceKlass* Management::_managementFactoryHelper_klass = NULL;
+InstanceKlass* Management::_memoryManagerMXBean_klass = NULL;
+InstanceKlass* Management::_memoryPoolMXBean_klass = NULL;
+InstanceKlass* Management::_memoryUsage_klass = NULL;
+InstanceKlass* Management::_sensor_klass = NULL;
+InstanceKlass* Management::_threadInfo_klass = NULL;
 
 jmmOptionalSupport Management::_optional_support = {0};
 TimeStamp Management::_stamp;
@@ -156,11 +156,10 @@
       vm_exit_during_initialization("Management agent initialization failure: "
           "class jdk.internal.agent.Agent not found.");
     }
-    instanceKlassHandle ik (THREAD, k);
 
     JavaValue result(T_VOID);
     JavaCalls::call_static(&result,
-                           ik,
+                           k,
                            vmSymbols::startAgent_name(),
                            vmSymbols::void_method_signature(),
                            CHECK);
@@ -171,30 +170,28 @@
   memcpy(support, &_optional_support, sizeof(jmmOptionalSupport));
 }
 
-Klass* Management::load_and_initialize_klass(Symbol* sh, TRAPS) {
+InstanceKlass* Management::load_and_initialize_klass(Symbol* sh, TRAPS) {
   Klass* k = SystemDictionary::resolve_or_fail(sh, true, CHECK_NULL);
-  Klass* ik = initialize_klass(k, CHECK_NULL);
-  return ik;
+  return initialize_klass(k, CHECK_NULL);
 }
 
-Klass* Management::load_and_initialize_klass_or_null(Symbol* sh, TRAPS) {
+InstanceKlass* Management::load_and_initialize_klass_or_null(Symbol* sh, TRAPS) {
   Klass* k = SystemDictionary::resolve_or_null(sh, CHECK_NULL);
   if (k == NULL) {
      return NULL;
   }
-  Klass* ik = initialize_klass(k, CHECK_NULL);
-  return ik;
+  return initialize_klass(k, CHECK_NULL);
 }
 
-Klass* Management::initialize_klass(Klass* k, TRAPS) {
-  instanceKlassHandle ik (THREAD, k);
+InstanceKlass* Management::initialize_klass(Klass* k, TRAPS) {
+  InstanceKlass* ik = InstanceKlass::cast(k);
   if (ik->should_be_initialized()) {
     ik->initialize(CHECK_NULL);
   }
   // If these classes change to not be owned by the boot loader, they need
   // to be walked to keep their class loader alive in oops_do.
   assert(ik->class_loader() == NULL, "need to follow in oops_do");
-  return ik();
+  return ik;
 }
 
 void Management::record_vm_startup_time(jlong begin, jlong duration) {
@@ -218,56 +215,56 @@
   ThreadService::oops_do(f);
 }
 
-Klass* Management::java_lang_management_ThreadInfo_klass(TRAPS) {
+InstanceKlass* Management::java_lang_management_ThreadInfo_klass(TRAPS) {
   if (_threadInfo_klass == NULL) {
     _threadInfo_klass = load_and_initialize_klass(vmSymbols::java_lang_management_ThreadInfo(), CHECK_NULL);
   }
   return _threadInfo_klass;
 }
 
-Klass* Management::java_lang_management_MemoryUsage_klass(TRAPS) {
+InstanceKlass* Management::java_lang_management_MemoryUsage_klass(TRAPS) {
   if (_memoryUsage_klass == NULL) {
     _memoryUsage_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryUsage(), CHECK_NULL);
   }
   return _memoryUsage_klass;
 }
 
-Klass* Management::java_lang_management_MemoryPoolMXBean_klass(TRAPS) {
+InstanceKlass* Management::java_lang_management_MemoryPoolMXBean_klass(TRAPS) {
   if (_memoryPoolMXBean_klass == NULL) {
     _memoryPoolMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryPoolMXBean(), CHECK_NULL);
   }
   return _memoryPoolMXBean_klass;
 }
 
-Klass* Management::java_lang_management_MemoryManagerMXBean_klass(TRAPS) {
+InstanceKlass* Management::java_lang_management_MemoryManagerMXBean_klass(TRAPS) {
   if (_memoryManagerMXBean_klass == NULL) {
     _memoryManagerMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_MemoryManagerMXBean(), CHECK_NULL);
   }
   return _memoryManagerMXBean_klass;
 }
 
-Klass* Management::java_lang_management_GarbageCollectorMXBean_klass(TRAPS) {
+InstanceKlass* Management::java_lang_management_GarbageCollectorMXBean_klass(TRAPS) {
   if (_garbageCollectorMXBean_klass == NULL) {
       _garbageCollectorMXBean_klass = load_and_initialize_klass(vmSymbols::java_lang_management_GarbageCollectorMXBean(), CHECK_NULL);
   }
   return _garbageCollectorMXBean_klass;
 }
 
-Klass* Management::sun_management_Sensor_klass(TRAPS) {
+InstanceKlass* Management::sun_management_Sensor_klass(TRAPS) {
   if (_sensor_klass == NULL) {
     _sensor_klass = load_and_initialize_klass(vmSymbols::sun_management_Sensor(), CHECK_NULL);
   }
   return _sensor_klass;
 }
 
-Klass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
+InstanceKlass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
   if (_managementFactoryHelper_klass == NULL) {
     _managementFactoryHelper_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactoryHelper(), CHECK_NULL);
   }
   return _managementFactoryHelper_klass;
 }
 
-Klass* Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS) {
+InstanceKlass* Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS) {
   if (_garbageCollectorExtImpl_klass == NULL) {
     _garbageCollectorExtImpl_klass =
                 load_and_initialize_klass_or_null(vmSymbols::com_sun_management_internal_GarbageCollectorExtImpl(), CHECK_NULL);
@@ -275,14 +272,14 @@
   return _garbageCollectorExtImpl_klass;
 }
 
-Klass* Management::com_sun_management_GcInfo_klass(TRAPS) {
+InstanceKlass* Management::com_sun_management_GcInfo_klass(TRAPS) {
   if (_gcInfo_klass == NULL) {
     _gcInfo_klass = load_and_initialize_klass(vmSymbols::com_sun_management_GcInfo(), CHECK_NULL);
   }
   return _gcInfo_klass;
 }
 
-Klass* Management::com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS) {
+InstanceKlass* Management::com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS) {
   if (_diagnosticCommandImpl_klass == NULL) {
     _diagnosticCommandImpl_klass = load_and_initialize_klass(vmSymbols::com_sun_management_internal_DiagnosticCommandImpl(), CHECK_NULL);
   }
@@ -333,8 +330,7 @@
 
 // Helper function to construct a ThreadInfo object
 instanceOop Management::create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS) {
-  Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
+  InstanceKlass* ik = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
 
   JavaValue result(T_VOID);
   JavaCallArguments args(14);
@@ -363,8 +359,7 @@
                                                     typeArrayHandle depths_array,
                                                     objArrayHandle synchronizers_array,
                                                     TRAPS) {
-  Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
+  InstanceKlass* ik = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
 
   JavaValue result(T_VOID);
   JavaCallArguments args(17);
@@ -401,7 +396,7 @@
   oop mgr_obj = JNIHandles::resolve(mgr);
   instanceHandle h(THREAD, (instanceOop) mgr_obj);
 
-  Klass* k = Management::java_lang_management_GarbageCollectorMXBean_klass(CHECK_NULL);
+  InstanceKlass* k = Management::java_lang_management_GarbageCollectorMXBean_klass(CHECK_NULL);
   if (!h->is_a(k)) {
     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
                "the object is not an instance of java.lang.management.GarbageCollectorMXBean class",
@@ -507,9 +502,8 @@
   }
 
   // Allocate the resulting MemoryPoolMXBean[] object
-  Klass* k = Management::java_lang_management_MemoryPoolMXBean_klass(CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
-  objArrayOop r = oopFactory::new_objArray(ik(), num_memory_pools, CHECK_NULL);
+  InstanceKlass* ik = Management::java_lang_management_MemoryPoolMXBean_klass(CHECK_NULL);
+  objArrayOop r = oopFactory::new_objArray(ik, num_memory_pools, CHECK_NULL);
   objArrayHandle poolArray(THREAD, r);
 
   if (mgr == NULL) {
@@ -552,9 +546,8 @@
   }
 
   // Allocate the resulting MemoryManagerMXBean[] object
-  Klass* k = Management::java_lang_management_MemoryManagerMXBean_klass(CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
-  objArrayOop r = oopFactory::new_objArray(ik(), num_mgrs, CHECK_NULL);
+  InstanceKlass* ik = Management::java_lang_management_MemoryManagerMXBean_klass(CHECK_NULL);
+  objArrayOop r = oopFactory::new_objArray(ik, num_mgrs, CHECK_NULL);
   objArrayHandle mgrArray(THREAD, r);
 
   if (pool == NULL) {
@@ -629,7 +622,7 @@
     THROW(vmSymbols::java_lang_NullPointerException());
   }
 
-  Klass* sensor_klass = Management::sun_management_Sensor_klass(CHECK);
+  InstanceKlass* sensor_klass = Management::sun_management_Sensor_klass(CHECK);
   oop s = JNIHandles::resolve(sensorObj);
   assert(s->is_instance(), "Sensor should be an instanceOop");
   instanceHandle sensor_h(THREAD, (instanceOop) s);
@@ -1202,9 +1195,8 @@
   int num_snapshots = dump_result.num_snapshots();
 
   // create the result ThreadInfo[] object
-  Klass* k = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
-  instanceKlassHandle ik (THREAD, k);
-  objArrayOop r = oopFactory::new_objArray(ik(), num_snapshots, CHECK_NULL);
+  InstanceKlass* ik = Management::java_lang_management_ThreadInfo_klass(CHECK_NULL);
+  objArrayOop r = oopFactory::new_objArray(ik, num_snapshots, CHECK_NULL);
   objArrayHandle result_h(THREAD, r);
 
   int index = 0;
@@ -1303,15 +1295,15 @@
 JVM_ENTRY(jobjectArray, jmm_GetLoadedClasses(JNIEnv *env))
   ResourceMark rm(THREAD);
 
-  LoadedClassesEnumerator lce(THREAD);  // Pass current Thread as parameter
+  LoadedClassesEnumerator lce;
 
   int num_classes = lce.num_loaded_classes();
   objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), num_classes, CHECK_0);
   objArrayHandle classes_ah(THREAD, r);
 
   for (int i = 0; i < num_classes; i++) {
-    KlassHandle kh = lce.get_klass(i);
-    oop mirror = kh()->java_mirror();
+    Klass* k = lce.get_klass(i);
+    oop mirror = k->java_mirror();
     classes_ah->obj_at_put(i, mirror);
   }
 
--- a/hotspot/src/share/vm/services/management.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/management.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -42,19 +42,19 @@
   static TimeStamp          _stamp; // Timestamp since vm init done time
 
   // Management klasses
-  static Klass*             _diagnosticCommandImpl_klass;
-  static Klass*             _garbageCollectorExtImpl_klass;
-  static Klass*             _garbageCollectorMXBean_klass;
-  static Klass*             _gcInfo_klass;
-  static Klass*             _managementFactoryHelper_klass;
-  static Klass*             _memoryManagerMXBean_klass;
-  static Klass*             _memoryPoolMXBean_klass;
-  static Klass*             _memoryUsage_klass;
-  static Klass*             _sensor_klass;
-  static Klass*             _threadInfo_klass;
-  static Klass* load_and_initialize_klass(Symbol* sh, TRAPS);
-  static Klass* load_and_initialize_klass_or_null(Symbol* sh, TRAPS);
-  static Klass* initialize_klass(Klass* k, TRAPS);
+  static InstanceKlass*     _diagnosticCommandImpl_klass;
+  static InstanceKlass*     _garbageCollectorExtImpl_klass;
+  static InstanceKlass*     _garbageCollectorMXBean_klass;
+  static InstanceKlass*     _gcInfo_klass;
+  static InstanceKlass*     _managementFactoryHelper_klass;
+  static InstanceKlass*     _memoryManagerMXBean_klass;
+  static InstanceKlass*     _memoryPoolMXBean_klass;
+  static InstanceKlass*     _memoryUsage_klass;
+  static InstanceKlass*     _sensor_klass;
+  static InstanceKlass*     _threadInfo_klass;
+  static InstanceKlass* load_and_initialize_klass(Symbol* sh, TRAPS);
+  static InstanceKlass* load_and_initialize_klass_or_null(Symbol* sh, TRAPS);
+  static InstanceKlass* initialize_klass(Klass* k, TRAPS);
 
 public:
   static void init();
@@ -67,7 +67,7 @@
   static void* get_jmm_interface(int version);
   static void  get_optional_support(jmmOptionalSupport* support);
 
-  static void get_loaded_classes(JavaThread* cur_thread, GrowableArray<KlassHandle>* klass_handle_array);
+  static void get_loaded_classes(JavaThread* cur_thread, GrowableArray<Klass*>* klass_array);
 
   static void  record_vm_startup_time(jlong begin, jlong duration)
       NOT_MANAGEMENT_RETURN;
@@ -87,21 +87,21 @@
   }
 
   // methods to return a Klass*.
-  static Klass* java_lang_management_ThreadInfo_klass(TRAPS);
-  static Klass* java_lang_management_MemoryUsage_klass(TRAPS)
+  static InstanceKlass* java_lang_management_ThreadInfo_klass(TRAPS);
+  static InstanceKlass* java_lang_management_MemoryUsage_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
-  static Klass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
-  static Klass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
-  static Klass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
-  static Klass* sun_management_ManagementFactoryHelper_klass(TRAPS)
+  static InstanceKlass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
+  static InstanceKlass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
+  static InstanceKlass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
+  static InstanceKlass* sun_management_ManagementFactoryHelper_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
-  static Klass* sun_management_Sensor_klass(TRAPS)
+  static InstanceKlass* sun_management_Sensor_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
-  static Klass* com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS)
+  static InstanceKlass* com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
-  static Klass* com_sun_management_GcInfo_klass(TRAPS)
+  static InstanceKlass* com_sun_management_GcInfo_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
-  static Klass* com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS)
+  static InstanceKlass* com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS)
       NOT_MANAGEMENT_RETURN_(NULL);
 
   static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);
--- a/hotspot/src/share/vm/services/memoryManager.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/memoryManager.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -124,7 +124,7 @@
       signature = vmSymbols::createMemoryManager_signature();
     }
 
-    instanceKlassHandle ik(THREAD, k);
+    InstanceKlass* ik = InstanceKlass::cast(k);
 
     JavaCalls::call_static(&result,
                            ik,
--- a/hotspot/src/share/vm/services/memoryPool.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/memoryPool.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -86,8 +86,7 @@
   if (pool_obj == NULL) {
     // It's ok for more than one thread to execute the code up to the locked region.
     // Extra pool instances will just be gc'ed.
-    Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK_NULL);
-    instanceKlassHandle ik(THREAD, k);
+    InstanceKlass* ik = Management::sun_management_ManagementFactoryHelper_klass(CHECK_NULL);
 
     Handle pool_name = java_lang_String::create_from_str(_name, CHECK_NULL);
     jlong usage_threshold_value = (_usage_threshold->is_high_threshold_supported() ? 0 : -1L);
--- a/hotspot/src/share/vm/services/memoryService.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/memoryService.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -529,8 +529,7 @@
 }
 
 Handle MemoryService::create_MemoryUsage_obj(MemoryUsage usage, TRAPS) {
-  Klass* k = Management::java_lang_management_MemoryUsage_klass(CHECK_NH);
-  instanceKlassHandle ik(THREAD, k);
+  InstanceKlass* ik = Management::java_lang_management_MemoryUsage_klass(CHECK_NH);
 
   instanceHandle obj = ik->allocate_instance_handle(CHECK_NH);
 
--- a/hotspot/src/share/vm/services/threadService.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/services/threadService.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -607,12 +607,11 @@
 }
 
 Handle ThreadStackTrace::allocate_fill_stack_trace_element_array(TRAPS) {
-  Klass* k = SystemDictionary::StackTraceElement_klass();
-  assert(k != NULL, "must be loaded in 1.4+");
-  instanceKlassHandle ik(THREAD, k);
+  InstanceKlass* ik = SystemDictionary::StackTraceElement_klass();
+  assert(ik != NULL, "must be loaded in 1.4+");
 
   // Allocate an array of java/lang/StackTraceElement object
-  objArrayOop ste = oopFactory::new_objArray(ik(), _depth, CHECK_NH);
+  objArrayOop ste = oopFactory::new_objArray(ik, _depth, CHECK_NH);
   objArrayHandle backtrace(THREAD, ste);
   for (int j = 0; j < _depth; j++) {
     StackFrameInfo* frame = _frames->at(j);
--- a/hotspot/src/share/vm/shark/sharkRuntime.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/shark/sharkRuntime.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
@@ -41,16 +41,15 @@
                                                     int*        indexes,
                                                     int         num_indexes))
   constantPoolHandle pool(thread, method(thread)->constants());
-  KlassHandle exc_klass(thread, ((oop) tos_at(thread, 0))->klass());
+  Klass* exc_klass = ((oop) tos_at(thread, 0))->klass();
 
   for (int i = 0; i < num_indexes; i++) {
     Klass* tmp = pool->klass_at(indexes[i], CHECK_0);
-    KlassHandle chk_klass(thread, tmp);
 
-    if (exc_klass() == chk_klass())
+    if (exc_klass() == tmp)
       return i;
 
-    if (exc_klass()->is_subtype_of(chk_klass()))
+    if (exc_klass()->is_subtype_of(tmp))
       return i;
   }
 
@@ -85,7 +84,7 @@
 
 JRT_ENTRY(void, SharkRuntime::new_instance(JavaThread* thread, int index))
   Klass* k_oop = method(thread)->constants()->klass_at(index, CHECK);
-  instanceKlassHandle klass(THREAD, k_oop);
+  InstanceKlass* klass = InstanceKlass::cast(k);
 
   // Make sure we are not instantiating an abstract klass
   klass->check_valid_for_instantiation(true, CHECK);
--- a/hotspot/src/share/vm/utilities/exceptions.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/utilities/exceptions.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -265,11 +265,10 @@
   Handle h_exception;
 
   // Resolve exception klass
-  Klass* ik = SystemDictionary::resolve_or_fail(name, h_loader, h_protection_domain, true, thread);
-  instanceKlassHandle klass(thread, ik);
+  InstanceKlass* klass = InstanceKlass::cast(SystemDictionary::resolve_or_fail(name, h_loader, h_protection_domain, true, thread));
 
   if (!thread->has_pending_exception()) {
-    assert(klass.not_null(), "klass must exist");
+    assert(klass != NULL, "klass must exist");
     // We are about to create an instance - so make sure that klass is initialized
     klass->initialize(thread);
     if (!thread->has_pending_exception()) {
--- a/hotspot/src/share/vm/utilities/xmlstream.cpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/utilities/xmlstream.cpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, 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
@@ -422,17 +422,17 @@
 // ------------------------------------------------------------------
 // Output a klass attribute, in the form " klass='pkg/cls'".
 // This is used only when there is no ciKlass available.
-void xmlStream::klass(KlassHandle klass) {
+void xmlStream::klass(Klass* klass) {
   assert_if_no_error(inside_attrs(), "printing attributes");
-  if (klass.is_null())  return;
+  if (klass == NULL) return;
   print_raw(" klass='");
   klass_text(klass);
   print_raw("'");
 }
 
-void xmlStream::klass_text(KlassHandle klass) {
+void xmlStream::klass_text(Klass* klass) {
   assert_if_no_error(inside_attrs(), "printing attributes");
-  if (klass.is_null())  return;
+  if (klass == NULL) return;
   //klass->print_short_name(log->out());
   klass->name()->print_symbol_on(out());
 }
--- a/hotspot/src/share/vm/utilities/xmlstream.hpp	Wed Mar 15 11:44:46 2017 +0100
+++ b/hotspot/src/share/vm/utilities/xmlstream.hpp	Wed Mar 15 10:25:37 2017 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, 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
@@ -138,14 +138,14 @@
   // commonly used XML attributes
   void          stamp();                 // stamp='1.234'
   void          method(methodHandle m);  // method='k n s' ...
-  void          klass(KlassHandle k);    // klass='name'
+  void          klass(Klass* k);         // klass='name'
   void          name(const Symbol* s);   // name='name'
   void          object(const char* attr, Metadata* val);
   void          object(const char* attr, Handle val);
 
   // print the text alone (sans ''):
   void          method_text(methodHandle m);
-  void          klass_text(KlassHandle k);    // klass='name'
+  void          klass_text(Klass* k);         // klass='name'
   void          name_text(const Symbol* s);   // name='name'
   void          object_text(Metadata* x);
   void          object_text(Handle x);