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 },
|