src/share/vm/prims/jvm.cpp

Print this page

        

@@ -871,10 +871,24 @@
 
   if (TraceClassResolution && k != NULL) {
     trace_class_resolution(k);
   }
 
+  if (UsePrimordialLoaderCache) {
+    // Skip caching the reflection loader and the extension loader
+    instanceKlass* loader_klass = instanceKlass::cast((JNIHandles::resolve(loader))->klass());
+    const char* loader_name = loader_klass->external_name();
+    bool  is_reflection_loader = strncmp(loader_name, "sun.reflect", 11) == 0 ? true : false;
+    bool  is_ext_loader = strncmp(loader_name, "sun.misc.Launcher$ExtClassLoader", 32) == 0 ? true : false;
+#ifdef ASSERT      
+    tty->print("NEW LDR TYPE is %s for %s, %1x\n", loader_name, name, is_reflection_loader);
+#endif
+    if ((!is_reflection_loader) && (!is_ext_loader)) {
+      Universe::check_or_set_cached_loader(*(class_loader.raw_value()));
+    }
+  }
+  
   return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
 }
 
 
 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))

@@ -3315,16 +3329,26 @@
 
 // Return the first non-null class loader up the execution stack, or null
 // if only code from the null class loader is on the stack.
 
 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
+  if (UsePrimordialLoaderCache) {      
+    oop cachedLoader = Universe::get_cached_loader();
+    if (cachedLoader != NULL && (oop)cachedLoader != (oop)-1) {
+      return JNIHandles::make_local(env, cachedLoader);
+    }
+  }
+
   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
     // UseNewReflection
     vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
     klassOop holder = vfst.method()->method_holder();
     oop loader = instanceKlass::cast(holder)->class_loader();
     if (loader != NULL) {
+      if (UsePrimordialLoaderCache) {      
+        Universe::check_or_set_cached_loader(loader);
+      }
       return JNIHandles::make_local(env, loader);
     }
   }
   return NULL;
 JVM_END