< prev index next >

src/share/vm/prims/whitebox.cpp

Print this page
rev 6864 : 8061651: Interface to the Lookup Index Cache to improve URLClassPath search time
Summary: Implemented the interface in sun.misc.URLClassPath and corresponding JVM_XXX APIs
Reviewed-by: mchung, acorn, jiangli, dholmes
rev 6867 : 8061817: Whitebox.deoptimizeMethod() does not deoptimize all OSR versions of method
Summary: Fixed Whitebox.deoptimizeMethod() to deoptimize all OSR versions of the method.
Reviewed-by: kvn, iignatyev


  87       }
  88     }
  89 
  90     bool found() const {
  91         return _found;
  92     }
  93 };
  94 
  95 WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name))
  96   Handle h_name = JNIHandles::resolve(name);
  97   if (h_name.is_null()) return false;
  98   Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false);
  99   TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return
 100 
 101   WBIsKlassAliveClosure closure(sym);
 102   ClassLoaderDataGraph::classes_do(&closure);
 103 
 104   return closure.found();
 105 WB_END
 106 






















 107 WB_ENTRY(jlong, WB_GetCompressedOopsMaxHeapSize(JNIEnv* env, jobject o)) {
 108   return (jlong)Arguments::max_heap_for_compressed_oops();
 109 }
 110 WB_END
 111 
 112 WB_ENTRY(void, WB_PrintHeapSizes(JNIEnv* env, jobject o)) {
 113   CollectorPolicy * p = Universe::heap()->collector_policy();
 114   gclog_or_tty->print_cr("Minimum heap "SIZE_FORMAT" Initial heap "
 115     SIZE_FORMAT" Maximum heap "SIZE_FORMAT" Min alignment "SIZE_FORMAT" Max alignment "SIZE_FORMAT,
 116     p->min_heap_byte_size(), p->initial_heap_byte_size(), p->max_heap_byte_size(),
 117     p->space_alignment(), p->heap_alignment());
 118 }
 119 WB_END
 120 
 121 #ifndef PRODUCT
 122 // Forward declaration
 123 void TestReservedSpace_test();
 124 void TestReserveMemorySpecial_test();
 125 void TestVirtualSpace_test();
 126 void TestMetaspaceAux_test();


 365 
 366 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
 367   assert(method != NULL, "method should not be null");
 368   ThreadToNativeFromVM ttn(thread);
 369   return env->FromReflectedMethod(method);
 370 }
 371 
 372 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
 373   MutexLockerEx mu(Compile_lock);
 374   CodeCache::mark_all_nmethods_for_deoptimization();
 375   VM_Deoptimize op;
 376   VMThread::execute(&op);
 377 WB_END
 378 
 379 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
 380   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
 381   int result = 0;
 382   CHECK_JNI_EXCEPTION_(env, result);
 383   MutexLockerEx mu(Compile_lock);
 384   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
 385   nmethod* code;
 386   if (is_osr) {
 387     int bci = InvocationEntryBci;
 388     while ((code = mh->lookup_osr_nmethod_for(bci, CompLevel_none, false)) != NULL) {
 389       code->mark_for_deoptimization();
 390       ++result;
 391       bci = code->osr_entry_bci() + 1;
 392     }
 393   } else {
 394     code = mh->code();
 395   }
 396   if (code != NULL) {
 397     code->mark_for_deoptimization();
 398     ++result;
 399   }
 400   result += CodeCache::mark_for_deoptimization(mh());
 401   if (result > 0) {
 402     VM_Deoptimize op;
 403     VMThread::execute(&op);
 404   }
 405   return result;
 406 WB_END
 407 
 408 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
 409   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
 410   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
 411   MutexLockerEx mu(Compile_lock);
 412   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
 413   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
 414   if (code == NULL) {
 415     return JNI_FALSE;
 416   }
 417   return (code->is_alive() && !code->is_marked_for_deoptimization());


 922         }
 923       } else {
 924         // Registration failed unexpectedly.
 925         tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered",
 926             method_array[i].name, method_array[i].signature);
 927         env->UnregisterNatives(wbclass);
 928         break;
 929       }
 930     }
 931   }
 932 }
 933 
 934 #define CC (char*)
 935 
 936 static JNINativeMethod methods[] = {
 937   {CC"getObjectAddress",   CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress  },
 938   {CC"getObjectSize",      CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectSize     },
 939   {CC"isObjectInOldGen",   CC"(Ljava/lang/Object;)Z", (void*)&WB_isObjectInOldGen  },
 940   {CC"getHeapOopSize",     CC"()I",                   (void*)&WB_GetHeapOopSize    },
 941   {CC"isClassAlive0",      CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive      },





 942   {CC"parseCommandLine",
 943       CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
 944       (void*) &WB_ParseCommandLine
 945   },
 946   {CC"getCompressedOopsMaxHeapSize", CC"()J",
 947       (void*)&WB_GetCompressedOopsMaxHeapSize},
 948   {CC"printHeapSizes",     CC"()V",                   (void*)&WB_PrintHeapSizes    },
 949   {CC"runMemoryUnitTests", CC"()V",                   (void*)&WB_RunMemoryUnitTests},
 950   {CC"readFromNoaccessArea",CC"()V",                  (void*)&WB_ReadFromNoaccessArea},
 951   {CC"stressVirtualSpaceResize",CC"(JJJ)I",           (void*)&WB_StressVirtualSpaceResize},
 952 #if INCLUDE_ALL_GCS
 953   {CC"g1InConcurrentMark", CC"()Z",                   (void*)&WB_G1InConcurrentMark},
 954   {CC"g1IsHumongous",      CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous     },
 955   {CC"g1NumFreeRegions",   CC"()J",                   (void*)&WB_G1NumFreeRegions  },
 956   {CC"g1RegionSize",       CC"()I",                   (void*)&WB_G1RegionSize      },
 957 #endif // INCLUDE_ALL_GCS
 958 #if INCLUDE_NMT
 959   {CC"NMTMalloc",           CC"(J)J",                 (void*)&WB_NMTMalloc          },
 960   {CC"NMTMallocWithPseudoStack", CC"(JI)J",           (void*)&WB_NMTMallocWithPseudoStack},
 961   {CC"NMTFree",             CC"(J)V",                 (void*)&WB_NMTFree            },




  87       }
  88     }
  89 
  90     bool found() const {
  91         return _found;
  92     }
  93 };
  94 
  95 WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name))
  96   Handle h_name = JNIHandles::resolve(name);
  97   if (h_name.is_null()) return false;
  98   Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false);
  99   TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return
 100 
 101   WBIsKlassAliveClosure closure(sym);
 102   ClassLoaderDataGraph::classes_do(&closure);
 103 
 104   return closure.found();
 105 WB_END
 106 
 107 WB_ENTRY(jboolean, WB_ClassKnownToNotExist(JNIEnv* env, jobject o, jobject loader, jstring name))
 108   ThreadToNativeFromVM ttnfv(thread);   // can't be in VM when we call JNI
 109   const char* class_name = env->GetStringUTFChars(name, NULL);
 110   jboolean result = JVM_KnownToNotExist(env, loader, class_name);
 111   env->ReleaseStringUTFChars(name, class_name);
 112   return result;
 113 WB_END
 114 
 115 WB_ENTRY(jobjectArray, WB_GetLookupCacheURLs(JNIEnv* env, jobject o, jobject loader))
 116   ThreadToNativeFromVM ttnfv(thread);   // can't be in VM when we call JNI
 117   return JVM_GetResourceLookupCacheURLs(env, loader);
 118 WB_END
 119 
 120 WB_ENTRY(jintArray, WB_GetLookupCacheMatches(JNIEnv* env, jobject o, jobject loader, jstring name))
 121   ThreadToNativeFromVM ttnfv(thread);   // can't be in VM when we call JNI
 122   const char* resource_name = env->GetStringUTFChars(name, NULL);
 123   jintArray result = JVM_GetResourceLookupCache(env, loader, resource_name);
 124 
 125   env->ReleaseStringUTFChars(name, resource_name);
 126   return result;
 127 WB_END
 128 
 129 WB_ENTRY(jlong, WB_GetCompressedOopsMaxHeapSize(JNIEnv* env, jobject o)) {
 130   return (jlong)Arguments::max_heap_for_compressed_oops();
 131 }
 132 WB_END
 133 
 134 WB_ENTRY(void, WB_PrintHeapSizes(JNIEnv* env, jobject o)) {
 135   CollectorPolicy * p = Universe::heap()->collector_policy();
 136   gclog_or_tty->print_cr("Minimum heap "SIZE_FORMAT" Initial heap "
 137     SIZE_FORMAT" Maximum heap "SIZE_FORMAT" Min alignment "SIZE_FORMAT" Max alignment "SIZE_FORMAT,
 138     p->min_heap_byte_size(), p->initial_heap_byte_size(), p->max_heap_byte_size(),
 139     p->space_alignment(), p->heap_alignment());
 140 }
 141 WB_END
 142 
 143 #ifndef PRODUCT
 144 // Forward declaration
 145 void TestReservedSpace_test();
 146 void TestReserveMemorySpecial_test();
 147 void TestVirtualSpace_test();
 148 void TestMetaspaceAux_test();


 387 
 388 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
 389   assert(method != NULL, "method should not be null");
 390   ThreadToNativeFromVM ttn(thread);
 391   return env->FromReflectedMethod(method);
 392 }
 393 
 394 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
 395   MutexLockerEx mu(Compile_lock);
 396   CodeCache::mark_all_nmethods_for_deoptimization();
 397   VM_Deoptimize op;
 398   VMThread::execute(&op);
 399 WB_END
 400 
 401 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
 402   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
 403   int result = 0;
 404   CHECK_JNI_EXCEPTION_(env, result);
 405   MutexLockerEx mu(Compile_lock);
 406   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));

 407   if (is_osr) {
 408     result += mh->mark_osr_nmethods();
 409   } else if (mh->code() != NULL) {
 410     mh->code()->mark_for_deoptimization();








 411     ++result;
 412   }
 413   result += CodeCache::mark_for_deoptimization(mh());
 414   if (result > 0) {
 415     VM_Deoptimize op;
 416     VMThread::execute(&op);
 417   }
 418   return result;
 419 WB_END
 420 
 421 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
 422   jmethodID jmid = reflected_method_to_jmid(thread, env, method);
 423   CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
 424   MutexLockerEx mu(Compile_lock);
 425   methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
 426   nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
 427   if (code == NULL) {
 428     return JNI_FALSE;
 429   }
 430   return (code->is_alive() && !code->is_marked_for_deoptimization());


 935         }
 936       } else {
 937         // Registration failed unexpectedly.
 938         tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered",
 939             method_array[i].name, method_array[i].signature);
 940         env->UnregisterNatives(wbclass);
 941         break;
 942       }
 943     }
 944   }
 945 }
 946 
 947 #define CC (char*)
 948 
 949 static JNINativeMethod methods[] = {
 950   {CC"getObjectAddress",   CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress  },
 951   {CC"getObjectSize",      CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectSize     },
 952   {CC"isObjectInOldGen",   CC"(Ljava/lang/Object;)Z", (void*)&WB_isObjectInOldGen  },
 953   {CC"getHeapOopSize",     CC"()I",                   (void*)&WB_GetHeapOopSize    },
 954   {CC"isClassAlive0",      CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive      },
 955   {CC"classKnownToNotExist",
 956                            CC"(Ljava/lang/ClassLoader;Ljava/lang/String;)Z",(void*)&WB_ClassKnownToNotExist},
 957   {CC"getLookupCacheURLs", CC"(Ljava/lang/ClassLoader;)[Ljava/net/URL;",    (void*)&WB_GetLookupCacheURLs},
 958   {CC"getLookupCacheMatches", CC"(Ljava/lang/ClassLoader;Ljava/lang/String;)[I",
 959                                                       (void*)&WB_GetLookupCacheMatches},
 960   {CC"parseCommandLine",
 961       CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
 962       (void*) &WB_ParseCommandLine
 963   },
 964   {CC"getCompressedOopsMaxHeapSize", CC"()J",
 965       (void*)&WB_GetCompressedOopsMaxHeapSize},
 966   {CC"printHeapSizes",     CC"()V",                   (void*)&WB_PrintHeapSizes    },
 967   {CC"runMemoryUnitTests", CC"()V",                   (void*)&WB_RunMemoryUnitTests},
 968   {CC"readFromNoaccessArea",CC"()V",                  (void*)&WB_ReadFromNoaccessArea},
 969   {CC"stressVirtualSpaceResize",CC"(JJJ)I",           (void*)&WB_StressVirtualSpaceResize},
 970 #if INCLUDE_ALL_GCS
 971   {CC"g1InConcurrentMark", CC"()Z",                   (void*)&WB_G1InConcurrentMark},
 972   {CC"g1IsHumongous",      CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous     },
 973   {CC"g1NumFreeRegions",   CC"()J",                   (void*)&WB_G1NumFreeRegions  },
 974   {CC"g1RegionSize",       CC"()I",                   (void*)&WB_G1RegionSize      },
 975 #endif // INCLUDE_ALL_GCS
 976 #if INCLUDE_NMT
 977   {CC"NMTMalloc",           CC"(J)J",                 (void*)&WB_NMTMalloc          },
 978   {CC"NMTMallocWithPseudoStack", CC"(JI)J",           (void*)&WB_NMTMallocWithPseudoStack},
 979   {CC"NMTFree",             CC"(J)V",                 (void*)&WB_NMTFree            },


< prev index next >