src/share/vm/prims/whitebox.cpp

Thu, 26 Jul 2018 16:04:06 +0800

author
aoqi
date
Thu, 26 Jul 2018 16:04:06 +0800
changeset 9203
53eec13fbaa5
parent 9186
1d0b6fcff115
parent 8604
04d83ba48607
child 9448
73d689add964
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
dbuck@9186 2 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #include "precompiled.hpp"
aoqi@0 26
stefank@6992 27 #include "memory/metadataFactory.hpp"
iklam@8497 28 #include "memory/metaspaceShared.hpp"
aoqi@0 29 #include "memory/universe.hpp"
aoqi@0 30 #include "oops/oop.inline.hpp"
aoqi@0 31
aoqi@0 32 #include "classfile/symbolTable.hpp"
aoqi@0 33 #include "classfile/classLoaderData.hpp"
aoqi@0 34
aoqi@0 35 #include "prims/whitebox.hpp"
aoqi@0 36 #include "prims/wbtestmethods/parserTests.hpp"
aoqi@0 37
aoqi@0 38 #include "runtime/arguments.hpp"
aoqi@0 39 #include "runtime/interfaceSupport.hpp"
aoqi@0 40 #include "runtime/os.hpp"
stefank@6992 41 #include "utilities/array.hpp"
aoqi@0 42 #include "utilities/debug.hpp"
aoqi@0 43 #include "utilities/macros.hpp"
aoqi@0 44 #include "utilities/exceptions.hpp"
aoqi@0 45
aoqi@0 46 #if INCLUDE_ALL_GCS
tschatzl@7071 47 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp"
aoqi@0 48 #include "gc_implementation/g1/concurrentMark.hpp"
kevinw@8194 49 #include "gc_implementation/g1/concurrentMarkThread.hpp"
aoqi@0 50 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
aoqi@0 51 #include "gc_implementation/g1/heapRegionRemSet.hpp"
aoqi@0 52 #endif // INCLUDE_ALL_GCS
aoqi@0 53
zgu@7074 54 #if INCLUDE_NMT
zgu@7074 55 #include "services/mallocSiteTable.hpp"
aoqi@0 56 #include "services/memTracker.hpp"
zgu@7074 57 #include "utilities/nativeCallStack.hpp"
aoqi@0 58 #endif // INCLUDE_NMT
aoqi@0 59
aoqi@0 60 #include "compiler/compileBroker.hpp"
iklam@7381 61 #include "jvmtifiles/jvmtiEnv.hpp"
aoqi@0 62 #include "runtime/compilationPolicy.hpp"
aoqi@0 63
aoqi@0 64 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
aoqi@0 65
aoqi@0 66 #define SIZE_T_MAX_VALUE ((size_t) -1)
aoqi@0 67
aoqi@0 68 bool WhiteBox::_used = false;
aoqi@0 69
aoqi@0 70 WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj))
aoqi@0 71 return (jlong)(void*)JNIHandles::resolve(obj);
aoqi@0 72 WB_END
aoqi@0 73
aoqi@0 74 WB_ENTRY(jint, WB_GetHeapOopSize(JNIEnv* env, jobject o))
aoqi@0 75 return heapOopSize;
aoqi@0 76 WB_END
aoqi@0 77
minqi@7779 78 WB_ENTRY(jint, WB_GetVMPageSize(JNIEnv* env, jobject o))
minqi@7779 79 return os::vm_page_size();
minqi@7779 80 WB_END
iklam@7382 81
tschatzl@7781 82 WB_ENTRY(jlong, WB_GetVMLargePageSize(JNIEnv* env, jobject o))
tschatzl@7781 83 return os::large_page_size();
tschatzl@7781 84 WB_END
aoqi@0 85
aoqi@0 86 class WBIsKlassAliveClosure : public KlassClosure {
aoqi@0 87 Symbol* _name;
aoqi@0 88 bool _found;
aoqi@0 89 public:
aoqi@0 90 WBIsKlassAliveClosure(Symbol* name) : _name(name), _found(false) {}
aoqi@0 91
aoqi@0 92 void do_klass(Klass* k) {
aoqi@0 93 if (_found) return;
aoqi@0 94 Symbol* ksym = k->name();
aoqi@0 95 if (ksym->fast_compare(_name) == 0) {
aoqi@0 96 _found = true;
aoqi@0 97 }
aoqi@0 98 }
aoqi@0 99
aoqi@0 100 bool found() const {
aoqi@0 101 return _found;
aoqi@0 102 }
aoqi@0 103 };
aoqi@0 104
aoqi@0 105 WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name))
aoqi@0 106 Handle h_name = JNIHandles::resolve(name);
aoqi@0 107 if (h_name.is_null()) return false;
aoqi@0 108 Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false);
aoqi@0 109 TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return
aoqi@0 110
aoqi@0 111 WBIsKlassAliveClosure closure(sym);
aoqi@0 112 ClassLoaderDataGraph::classes_do(&closure);
aoqi@0 113
aoqi@0 114 return closure.found();
aoqi@0 115 WB_END
aoqi@0 116
iklam@7322 117 WB_ENTRY(jboolean, WB_ClassKnownToNotExist(JNIEnv* env, jobject o, jobject loader, jstring name))
iklam@7322 118 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iklam@7322 119 const char* class_name = env->GetStringUTFChars(name, NULL);
iklam@7322 120 jboolean result = JVM_KnownToNotExist(env, loader, class_name);
iklam@7322 121 env->ReleaseStringUTFChars(name, class_name);
iklam@7322 122 return result;
iklam@7322 123 WB_END
iklam@7322 124
iklam@7322 125 WB_ENTRY(jobjectArray, WB_GetLookupCacheURLs(JNIEnv* env, jobject o, jobject loader))
iklam@7322 126 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iklam@7322 127 return JVM_GetResourceLookupCacheURLs(env, loader);
iklam@7322 128 WB_END
iklam@7322 129
iklam@7322 130 WB_ENTRY(jintArray, WB_GetLookupCacheMatches(JNIEnv* env, jobject o, jobject loader, jstring name))
iklam@7322 131 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iklam@7322 132 const char* resource_name = env->GetStringUTFChars(name, NULL);
iklam@7322 133 jintArray result = JVM_GetResourceLookupCache(env, loader, resource_name);
iklam@7322 134
iklam@7322 135 env->ReleaseStringUTFChars(name, resource_name);
iklam@7322 136 return result;
iklam@7322 137 WB_END
iklam@7322 138
iklam@7381 139 WB_ENTRY(void, WB_AddToBootstrapClassLoaderSearch(JNIEnv* env, jobject o, jstring segment)) {
iklam@7381 140 #if INCLUDE_JVMTI
iklam@7382 141 ResourceMark rm;
iklam@7382 142 const char* seg = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(segment));
iklam@7381 143 JvmtiEnv* jvmti_env = JvmtiEnv::create_a_jvmti(JVMTI_VERSION);
iklam@7381 144 jvmtiError err = jvmti_env->AddToBootstrapClassLoaderSearch(seg);
iklam@7381 145 assert(err == JVMTI_ERROR_NONE, "must not fail");
iklam@7381 146 #endif
iklam@7381 147 }
iklam@7381 148 WB_END
iklam@7381 149
iklam@7381 150 WB_ENTRY(void, WB_AddToSystemClassLoaderSearch(JNIEnv* env, jobject o, jstring segment)) {
iklam@7381 151 #if INCLUDE_JVMTI
iklam@7382 152 ResourceMark rm;
iklam@7382 153 const char* seg = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(segment));
iklam@7381 154 JvmtiEnv* jvmti_env = JvmtiEnv::create_a_jvmti(JVMTI_VERSION);
iklam@7381 155 jvmtiError err = jvmti_env->AddToSystemClassLoaderSearch(seg);
iklam@7381 156 assert(err == JVMTI_ERROR_NONE, "must not fail");
iklam@7381 157 #endif
iklam@7381 158 }
iklam@7381 159 WB_END
iklam@7381 160
dbuck@9186 161 #ifdef LINUX
dbuck@9186 162 #include "utilities/elfFile.hpp"
dbuck@9186 163 #endif
iklam@7381 164
aoqi@0 165 WB_ENTRY(jlong, WB_GetCompressedOopsMaxHeapSize(JNIEnv* env, jobject o)) {
aoqi@0 166 return (jlong)Arguments::max_heap_for_compressed_oops();
aoqi@0 167 }
aoqi@0 168 WB_END
aoqi@0 169
aoqi@0 170 WB_ENTRY(void, WB_PrintHeapSizes(JNIEnv* env, jobject o)) {
aoqi@0 171 CollectorPolicy * p = Universe::heap()->collector_policy();
aoqi@0 172 gclog_or_tty->print_cr("Minimum heap "SIZE_FORMAT" Initial heap "
aoqi@0 173 SIZE_FORMAT" Maximum heap "SIZE_FORMAT" Min alignment "SIZE_FORMAT" Max alignment "SIZE_FORMAT,
aoqi@0 174 p->min_heap_byte_size(), p->initial_heap_byte_size(), p->max_heap_byte_size(),
aoqi@0 175 p->space_alignment(), p->heap_alignment());
aoqi@0 176 }
aoqi@0 177 WB_END
aoqi@0 178
aoqi@0 179 #ifndef PRODUCT
aoqi@0 180 // Forward declaration
aoqi@0 181 void TestReservedSpace_test();
aoqi@0 182 void TestReserveMemorySpecial_test();
aoqi@0 183 void TestVirtualSpace_test();
aoqi@0 184 void TestMetaspaceAux_test();
aoqi@0 185 #endif
aoqi@0 186
aoqi@0 187 WB_ENTRY(void, WB_RunMemoryUnitTests(JNIEnv* env, jobject o))
aoqi@0 188 #ifndef PRODUCT
aoqi@0 189 TestReservedSpace_test();
aoqi@0 190 TestReserveMemorySpecial_test();
aoqi@0 191 TestVirtualSpace_test();
aoqi@0 192 TestMetaspaceAux_test();
aoqi@0 193 #endif
aoqi@0 194 WB_END
aoqi@0 195
aoqi@0 196 WB_ENTRY(void, WB_ReadFromNoaccessArea(JNIEnv* env, jobject o))
aoqi@0 197 size_t granularity = os::vm_allocation_granularity();
aoqi@0 198 ReservedHeapSpace rhs(100 * granularity, granularity, false, NULL);
aoqi@0 199 VirtualSpace vs;
aoqi@0 200 vs.initialize(rhs, 50 * granularity);
aoqi@0 201
aoqi@0 202 //Check if constraints are complied
aoqi@0 203 if (!( UseCompressedOops && rhs.base() != NULL &&
aoqi@0 204 Universe::narrow_oop_base() != NULL &&
aoqi@0 205 Universe::narrow_oop_use_implicit_null_checks() )) {
aoqi@0 206 tty->print_cr("WB_ReadFromNoaccessArea method is useless:\n "
aoqi@0 207 "\tUseCompressedOops is %d\n"
aoqi@0 208 "\trhs.base() is "PTR_FORMAT"\n"
aoqi@0 209 "\tUniverse::narrow_oop_base() is "PTR_FORMAT"\n"
aoqi@0 210 "\tUniverse::narrow_oop_use_implicit_null_checks() is %d",
aoqi@0 211 UseCompressedOops,
aoqi@0 212 rhs.base(),
aoqi@0 213 Universe::narrow_oop_base(),
aoqi@0 214 Universe::narrow_oop_use_implicit_null_checks());
aoqi@0 215 return;
aoqi@0 216 }
aoqi@0 217 tty->print_cr("Reading from no access area... ");
aoqi@0 218 tty->print_cr("*(vs.low_boundary() - rhs.noaccess_prefix() / 2 ) = %c",
aoqi@0 219 *(vs.low_boundary() - rhs.noaccess_prefix() / 2 ));
aoqi@0 220 WB_END
aoqi@0 221
aoqi@0 222 static jint wb_stress_virtual_space_resize(size_t reserved_space_size,
aoqi@0 223 size_t magnitude, size_t iterations) {
aoqi@0 224 size_t granularity = os::vm_allocation_granularity();
aoqi@0 225 ReservedHeapSpace rhs(reserved_space_size * granularity, granularity, false, NULL);
aoqi@0 226 VirtualSpace vs;
aoqi@0 227 if (!vs.initialize(rhs, 0)) {
aoqi@0 228 tty->print_cr("Failed to initialize VirtualSpace. Can't proceed.");
aoqi@0 229 return 3;
aoqi@0 230 }
aoqi@0 231
aoqi@0 232 long seed = os::random();
aoqi@0 233 tty->print_cr("Random seed is %ld", seed);
aoqi@0 234 os::init_random(seed);
aoqi@0 235
aoqi@0 236 for (size_t i = 0; i < iterations; i++) {
aoqi@0 237
aoqi@0 238 // Whether we will shrink or grow
aoqi@0 239 bool shrink = os::random() % 2L == 0;
aoqi@0 240
aoqi@0 241 // Get random delta to resize virtual space
aoqi@0 242 size_t delta = (size_t)os::random() % magnitude;
aoqi@0 243
aoqi@0 244 // If we are about to shrink virtual space below zero, then expand instead
aoqi@0 245 if (shrink && vs.committed_size() < delta) {
aoqi@0 246 shrink = false;
aoqi@0 247 }
aoqi@0 248
aoqi@0 249 // Resizing by delta
aoqi@0 250 if (shrink) {
aoqi@0 251 vs.shrink_by(delta);
aoqi@0 252 } else {
aoqi@0 253 // If expanding fails expand_by will silently return false
aoqi@0 254 vs.expand_by(delta, true);
aoqi@0 255 }
aoqi@0 256 }
aoqi@0 257 return 0;
aoqi@0 258 }
aoqi@0 259
aoqi@0 260 WB_ENTRY(jint, WB_StressVirtualSpaceResize(JNIEnv* env, jobject o,
aoqi@0 261 jlong reserved_space_size, jlong magnitude, jlong iterations))
aoqi@0 262 tty->print_cr("reservedSpaceSize="JLONG_FORMAT", magnitude="JLONG_FORMAT", "
aoqi@0 263 "iterations="JLONG_FORMAT"\n", reserved_space_size, magnitude,
aoqi@0 264 iterations);
aoqi@0 265 if (reserved_space_size < 0 || magnitude < 0 || iterations < 0) {
aoqi@0 266 tty->print_cr("One of variables printed above is negative. Can't proceed.\n");
aoqi@0 267 return 1;
aoqi@0 268 }
aoqi@0 269
aoqi@0 270 // sizeof(size_t) depends on whether OS is 32bit or 64bit. sizeof(jlong) is
aoqi@0 271 // always 8 byte. That's why we should avoid overflow in case of 32bit platform.
aoqi@0 272 if (sizeof(size_t) < sizeof(jlong)) {
aoqi@0 273 jlong size_t_max_value = (jlong) SIZE_T_MAX_VALUE;
aoqi@0 274 if (reserved_space_size > size_t_max_value || magnitude > size_t_max_value
aoqi@0 275 || iterations > size_t_max_value) {
aoqi@0 276 tty->print_cr("One of variables printed above overflows size_t. Can't proceed.\n");
aoqi@0 277 return 2;
aoqi@0 278 }
aoqi@0 279 }
aoqi@0 280
aoqi@0 281 return wb_stress_virtual_space_resize((size_t) reserved_space_size,
aoqi@0 282 (size_t) magnitude, (size_t) iterations);
aoqi@0 283 WB_END
aoqi@0 284
tschatzl@7071 285 WB_ENTRY(jboolean, WB_isObjectInOldGen(JNIEnv* env, jobject o, jobject obj))
tschatzl@7071 286 oop p = JNIHandles::resolve(obj);
tschatzl@7071 287 #if INCLUDE_ALL_GCS
tschatzl@7071 288 if (UseG1GC) {
tschatzl@7071 289 G1CollectedHeap* g1 = G1CollectedHeap::heap();
tschatzl@7071 290 const HeapRegion* hr = g1->heap_region_containing(p);
tschatzl@7071 291 if (hr == NULL) {
tschatzl@7071 292 return false;
tschatzl@7071 293 }
tschatzl@7071 294 return !(hr->is_young());
tschatzl@7071 295 } else if (UseParallelGC) {
tschatzl@7071 296 ParallelScavengeHeap* psh = ParallelScavengeHeap::heap();
tschatzl@7071 297 return !psh->is_in_young(p);
tschatzl@7071 298 }
tschatzl@7071 299 #endif // INCLUDE_ALL_GCS
tschatzl@7071 300 GenCollectedHeap* gch = GenCollectedHeap::heap();
tschatzl@7071 301 return !gch->is_in_young(p);
tschatzl@7071 302 WB_END
tschatzl@7071 303
tschatzl@7071 304 WB_ENTRY(jlong, WB_GetObjectSize(JNIEnv* env, jobject o, jobject obj))
tschatzl@7071 305 oop p = JNIHandles::resolve(obj);
tschatzl@7071 306 return p->size() * HeapWordSize;
tschatzl@7071 307 WB_END
tschatzl@7071 308
aoqi@0 309 #if INCLUDE_ALL_GCS
aoqi@0 310 WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj))
aoqi@0 311 G1CollectedHeap* g1 = G1CollectedHeap::heap();
aoqi@0 312 oop result = JNIHandles::resolve(obj);
aoqi@0 313 const HeapRegion* hr = g1->heap_region_containing(result);
aoqi@0 314 return hr->isHumongous();
aoqi@0 315 WB_END
aoqi@0 316
azakharov@7835 317 WB_ENTRY(jlong, WB_G1NumMaxRegions(JNIEnv* env, jobject o))
azakharov@7835 318 G1CollectedHeap* g1 = G1CollectedHeap::heap();
azakharov@7835 319 size_t nr = g1->max_regions();
azakharov@7835 320 return (jlong)nr;
azakharov@7835 321 WB_END
azakharov@7835 322
aoqi@0 323 WB_ENTRY(jlong, WB_G1NumFreeRegions(JNIEnv* env, jobject o))
aoqi@0 324 G1CollectedHeap* g1 = G1CollectedHeap::heap();
tschatzl@7050 325 size_t nr = g1->num_free_regions();
aoqi@0 326 return (jlong)nr;
aoqi@0 327 WB_END
aoqi@0 328
aoqi@0 329 WB_ENTRY(jboolean, WB_G1InConcurrentMark(JNIEnv* env, jobject o))
aoqi@0 330 G1CollectedHeap* g1 = G1CollectedHeap::heap();
kevinw@8194 331 return g1->concurrent_mark()->cmThread()->during_cycle();
kevinw@8194 332 WB_END
kevinw@8194 333
kevinw@8194 334 WB_ENTRY(jboolean, WB_G1StartMarkCycle(JNIEnv* env, jobject o))
kevinw@8194 335 G1CollectedHeap* g1h = G1CollectedHeap::heap();
kevinw@8194 336 if (!g1h->concurrent_mark()->cmThread()->during_cycle()) {
kevinw@8194 337 g1h->collect(GCCause::_wb_conc_mark);
kevinw@8194 338 return true;
kevinw@8194 339 }
kevinw@8194 340 return false;
aoqi@0 341 WB_END
aoqi@0 342
aoqi@0 343 WB_ENTRY(jint, WB_G1RegionSize(JNIEnv* env, jobject o))
aoqi@0 344 return (jint)HeapRegion::GrainBytes;
aoqi@0 345 WB_END
azakharov@7835 346
azakharov@7835 347 WB_ENTRY(jobject, WB_G1AuxiliaryMemoryUsage(JNIEnv* env))
azakharov@7835 348 ResourceMark rm(THREAD);
azakharov@7835 349 G1CollectedHeap* g1h = G1CollectedHeap::heap();
azakharov@7835 350 MemoryUsage usage = g1h->get_auxiliary_data_memory_usage();
azakharov@7835 351 Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
azakharov@7835 352 return JNIHandles::make_local(env, h());
azakharov@7835 353 WB_END
aoqi@0 354 #endif // INCLUDE_ALL_GCS
aoqi@0 355
aoqi@0 356 #if INCLUDE_NMT
aoqi@0 357 // Alloc memory using the test memory type so that we can use that to see if
aoqi@0 358 // NMT picks it up correctly
aoqi@0 359 WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size))
aoqi@0 360 jlong addr = 0;
ctornqvi@7344 361 addr = (jlong)(uintptr_t)os::malloc(size, mtTest);
zgu@7074 362 return addr;
zgu@7074 363 WB_END
aoqi@0 364
zgu@7074 365 // Alloc memory with pseudo call stack. The test can create psudo malloc
zgu@7074 366 // allocation site to stress the malloc tracking.
zgu@7074 367 WB_ENTRY(jlong, WB_NMTMallocWithPseudoStack(JNIEnv* env, jobject o, jlong size, jint pseudo_stack))
zgu@7074 368 address pc = (address)(size_t)pseudo_stack;
zgu@7074 369 NativeCallStack stack(&pc, 1);
ctornqvi@7344 370 return (jlong)(uintptr_t)os::malloc(size, mtTest, stack);
aoqi@0 371 WB_END
aoqi@0 372
aoqi@0 373 // Free the memory allocated by NMTAllocTest
aoqi@0 374 WB_ENTRY(void, WB_NMTFree(JNIEnv* env, jobject o, jlong mem))
aoqi@0 375 os::free((void*)(uintptr_t)mem, mtTest);
aoqi@0 376 WB_END
aoqi@0 377
aoqi@0 378 WB_ENTRY(jlong, WB_NMTReserveMemory(JNIEnv* env, jobject o, jlong size))
aoqi@0 379 jlong addr = 0;
aoqi@0 380
aoqi@0 381 addr = (jlong)(uintptr_t)os::reserve_memory(size);
aoqi@0 382 MemTracker::record_virtual_memory_type((address)addr, mtTest);
aoqi@0 383
aoqi@0 384 return addr;
aoqi@0 385 WB_END
aoqi@0 386
aoqi@0 387
aoqi@0 388 WB_ENTRY(void, WB_NMTCommitMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
aoqi@0 389 os::commit_memory((char *)(uintptr_t)addr, size, !ExecMem);
aoqi@0 390 MemTracker::record_virtual_memory_type((address)(uintptr_t)addr, mtTest);
aoqi@0 391 WB_END
aoqi@0 392
aoqi@0 393 WB_ENTRY(void, WB_NMTUncommitMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
aoqi@0 394 os::uncommit_memory((char *)(uintptr_t)addr, size);
aoqi@0 395 WB_END
aoqi@0 396
aoqi@0 397 WB_ENTRY(void, WB_NMTReleaseMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
aoqi@0 398 os::release_memory((char *)(uintptr_t)addr, size);
aoqi@0 399 WB_END
aoqi@0 400
zgu@7074 401 WB_ENTRY(jboolean, WB_NMTIsDetailSupported(JNIEnv* env))
zgu@7074 402 return MemTracker::tracking_level() == NMT_detail;
aoqi@0 403 WB_END
aoqi@0 404
coleenp@7267 405 WB_ENTRY(jboolean, WB_NMTChangeTrackingLevel(JNIEnv* env))
coleenp@7267 406 // Test that we can downgrade NMT levels but not upgrade them.
coleenp@7267 407 if (MemTracker::tracking_level() == NMT_off) {
coleenp@7267 408 MemTracker::transition_to(NMT_off);
coleenp@7267 409 return MemTracker::tracking_level() == NMT_off;
coleenp@7267 410 } else {
coleenp@7267 411 assert(MemTracker::tracking_level() == NMT_detail, "Should start out as detail tracking");
coleenp@7267 412 MemTracker::transition_to(NMT_summary);
coleenp@7267 413 assert(MemTracker::tracking_level() == NMT_summary, "Should be summary now");
zgu@7074 414
coleenp@7267 415 // Can't go to detail once NMT is set to summary.
coleenp@7267 416 MemTracker::transition_to(NMT_detail);
coleenp@7267 417 assert(MemTracker::tracking_level() == NMT_summary, "Should still be summary now");
coleenp@7267 418
coleenp@7267 419 // Shutdown sets tracking level to minimal.
coleenp@7267 420 MemTracker::shutdown();
coleenp@7267 421 assert(MemTracker::tracking_level() == NMT_minimal, "Should be minimal now");
coleenp@7267 422
coleenp@7267 423 // Once the tracking level is minimal, we cannot increase to summary.
coleenp@7267 424 // The code ignores this request instead of asserting because if the malloc site
coleenp@7267 425 // table overflows in another thread, it tries to change the code to summary.
coleenp@7267 426 MemTracker::transition_to(NMT_summary);
coleenp@7267 427 assert(MemTracker::tracking_level() == NMT_minimal, "Should still be minimal now");
coleenp@7267 428
coleenp@7267 429 // Really can never go up to detail, verify that the code would never do this.
coleenp@7267 430 MemTracker::transition_to(NMT_detail);
coleenp@7267 431 assert(MemTracker::tracking_level() == NMT_minimal, "Should still be minimal now");
coleenp@7267 432 return MemTracker::tracking_level() == NMT_minimal;
coleenp@7267 433 }
aoqi@0 434 WB_END
aoqi@0 435
gtriantafill@7342 436 WB_ENTRY(jint, WB_NMTGetHashSize(JNIEnv* env, jobject o))
gtriantafill@7342 437 int hash_size = MallocSiteTable::hash_buckets();
gtriantafill@7342 438 assert(hash_size > 0, "NMT hash_size should be > 0");
gtriantafill@7342 439 return (jint)hash_size;
gtriantafill@7342 440 WB_END
aoqi@0 441 #endif // INCLUDE_NMT
aoqi@0 442
aoqi@0 443 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
aoqi@0 444 assert(method != NULL, "method should not be null");
aoqi@0 445 ThreadToNativeFromVM ttn(thread);
aoqi@0 446 return env->FromReflectedMethod(method);
aoqi@0 447 }
aoqi@0 448
aoqi@0 449 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
aoqi@0 450 MutexLockerEx mu(Compile_lock);
aoqi@0 451 CodeCache::mark_all_nmethods_for_deoptimization();
aoqi@0 452 VM_Deoptimize op;
aoqi@0 453 VMThread::execute(&op);
aoqi@0 454 WB_END
aoqi@0 455
aoqi@0 456 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
aoqi@0 457 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 458 int result = 0;
aoqi@0 459 CHECK_JNI_EXCEPTION_(env, result);
aoqi@0 460 MutexLockerEx mu(Compile_lock);
aoqi@0 461 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 462 if (is_osr) {
thartmann@7325 463 result += mh->mark_osr_nmethods();
thartmann@7325 464 } else if (mh->code() != NULL) {
thartmann@7325 465 mh->code()->mark_for_deoptimization();
aoqi@0 466 ++result;
aoqi@0 467 }
aoqi@0 468 result += CodeCache::mark_for_deoptimization(mh());
aoqi@0 469 if (result > 0) {
aoqi@0 470 VM_Deoptimize op;
aoqi@0 471 VMThread::execute(&op);
aoqi@0 472 }
aoqi@0 473 return result;
aoqi@0 474 WB_END
aoqi@0 475
aoqi@0 476 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
aoqi@0 477 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 478 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 479 MutexLockerEx mu(Compile_lock);
aoqi@0 480 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 481 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
aoqi@0 482 if (code == NULL) {
aoqi@0 483 return JNI_FALSE;
aoqi@0 484 }
aoqi@0 485 return (code->is_alive() && !code->is_marked_for_deoptimization());
aoqi@0 486 WB_END
aoqi@0 487
aoqi@0 488 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
aoqi@0 489 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 490 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 491 MutexLockerEx mu(Compile_lock);
aoqi@0 492 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 493 if (is_osr) {
aoqi@0 494 return CompilationPolicy::can_be_osr_compiled(mh, comp_level);
aoqi@0 495 } else {
aoqi@0 496 return CompilationPolicy::can_be_compiled(mh, comp_level);
aoqi@0 497 }
aoqi@0 498 WB_END
aoqi@0 499
aoqi@0 500 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
aoqi@0 501 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 502 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 503 MutexLockerEx mu(Compile_lock);
aoqi@0 504 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 505 return mh->queued_for_compilation();
aoqi@0 506 WB_END
aoqi@0 507
aoqi@0 508 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
aoqi@0 509 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 510 CHECK_JNI_EXCEPTION_(env, CompLevel_none);
aoqi@0 511 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 512 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
aoqi@0 513 return (code != NULL ? code->comp_level() : CompLevel_none);
aoqi@0 514 WB_END
aoqi@0 515
aoqi@0 516 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level, jboolean is_osr))
aoqi@0 517 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 518 CHECK_JNI_EXCEPTION(env);
aoqi@0 519 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 520 if (is_osr) {
aoqi@0 521 mh->set_not_osr_compilable(comp_level, true /* report */, "WhiteBox");
aoqi@0 522 } else {
aoqi@0 523 mh->set_not_compilable(comp_level, true /* report */, "WhiteBox");
aoqi@0 524 }
aoqi@0 525 WB_END
aoqi@0 526
aoqi@0 527 WB_ENTRY(jint, WB_GetMethodEntryBci(JNIEnv* env, jobject o, jobject method))
aoqi@0 528 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 529 CHECK_JNI_EXCEPTION_(env, InvocationEntryBci);
aoqi@0 530 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 531 nmethod* code = mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false);
aoqi@0 532 return (code != NULL && code->is_osr_method() ? code->osr_entry_bci() : InvocationEntryBci);
aoqi@0 533 WB_END
aoqi@0 534
aoqi@0 535 WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
aoqi@0 536 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 537 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 538 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 539 bool result = mh->dont_inline();
aoqi@0 540 mh->set_dont_inline(value == JNI_TRUE);
aoqi@0 541 return result;
aoqi@0 542 WB_END
aoqi@0 543
aoqi@0 544 WB_ENTRY(jint, WB_GetCompileQueueSize(JNIEnv* env, jobject o, jint comp_level))
aoqi@0 545 if (comp_level == CompLevel_any) {
aoqi@0 546 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
aoqi@0 547 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
aoqi@0 548 } else {
aoqi@0 549 return CompileBroker::queue_size(comp_level);
aoqi@0 550 }
aoqi@0 551 WB_END
aoqi@0 552
aoqi@0 553 WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
aoqi@0 554 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 555 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 556 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 557 bool result = mh->force_inline();
aoqi@0 558 mh->set_force_inline(value == JNI_TRUE);
aoqi@0 559 return result;
aoqi@0 560 WB_END
aoqi@0 561
aoqi@0 562 WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level, jint bci))
aoqi@0 563 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 564 CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
aoqi@0 565 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 566 nmethod* nm = CompileBroker::compile_method(mh, bci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
aoqi@0 567 MutexLockerEx mu(Compile_lock);
aoqi@0 568 return (mh->queued_for_compilation() || nm != NULL);
aoqi@0 569 WB_END
aoqi@0 570
aoqi@0 571 class VM_WhiteBoxOperation : public VM_Operation {
aoqi@0 572 public:
aoqi@0 573 VM_WhiteBoxOperation() { }
aoqi@0 574 VMOp_Type type() const { return VMOp_WhiteBoxOperation; }
aoqi@0 575 bool allow_nested_vm_operations() const { return true; }
aoqi@0 576 };
aoqi@0 577
aoqi@0 578 class AlwaysFalseClosure : public BoolObjectClosure {
aoqi@0 579 public:
aoqi@0 580 bool do_object_b(oop p) { return false; }
aoqi@0 581 };
aoqi@0 582
aoqi@0 583 static AlwaysFalseClosure always_false;
aoqi@0 584
aoqi@0 585 class VM_WhiteBoxCleanMethodData : public VM_WhiteBoxOperation {
aoqi@0 586 public:
aoqi@0 587 VM_WhiteBoxCleanMethodData(MethodData* mdo) : _mdo(mdo) { }
aoqi@0 588 void doit() {
aoqi@0 589 _mdo->clean_method_data(&always_false);
aoqi@0 590 }
aoqi@0 591 private:
aoqi@0 592 MethodData* _mdo;
aoqi@0 593 };
aoqi@0 594
aoqi@0 595 WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
aoqi@0 596 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 597 CHECK_JNI_EXCEPTION(env);
aoqi@0 598 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 599 MutexLockerEx mu(Compile_lock);
aoqi@0 600 MethodData* mdo = mh->method_data();
aoqi@0 601 MethodCounters* mcs = mh->method_counters();
aoqi@0 602
aoqi@0 603 if (mdo != NULL) {
aoqi@0 604 mdo->init();
aoqi@0 605 ResourceMark rm;
aoqi@0 606 int arg_count = mdo->method()->size_of_parameters();
aoqi@0 607 for (int i = 0; i < arg_count; i++) {
aoqi@0 608 mdo->set_arg_modified(i, 0);
aoqi@0 609 }
aoqi@0 610 VM_WhiteBoxCleanMethodData op(mdo);
aoqi@0 611 VMThread::execute(&op);
aoqi@0 612 }
aoqi@0 613
aoqi@0 614 mh->clear_not_c1_compilable();
aoqi@0 615 mh->clear_not_c2_compilable();
aoqi@0 616 mh->clear_not_c2_osr_compilable();
aoqi@0 617 NOT_PRODUCT(mh->set_compiled_invocation_count(0));
aoqi@0 618 if (mcs != NULL) {
aoqi@0 619 mcs->backedge_counter()->init();
aoqi@0 620 mcs->invocation_counter()->init();
aoqi@0 621 mcs->set_interpreter_invocation_count(0);
aoqi@0 622 mcs->set_interpreter_throwout_count(0);
aoqi@0 623
aoqi@0 624 #ifdef TIERED
aoqi@0 625 mcs->set_rate(0.0F);
vlivanov@7179 626 mh->set_prev_event_count(0);
vlivanov@7179 627 mh->set_prev_time(0);
aoqi@0 628 #endif
aoqi@0 629 }
aoqi@0 630 WB_END
aoqi@0 631
iignatyev@6963 632 template <typename T>
iignatyev@6963 633 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) {
iignatyev@6963 634 if (name == NULL) {
iignatyev@6963 635 return false;
iignatyev@6963 636 }
iignatyev@6963 637 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 638 const char* flag_name = env->GetStringUTFChars(name, NULL);
iignatyev@6963 639 bool result = (*TAt)(flag_name, value);
iignatyev@6963 640 env->ReleaseStringUTFChars(name, flag_name);
iignatyev@6963 641 return result;
iignatyev@6963 642 }
iignatyev@6963 643
iignatyev@6963 644 template <typename T>
iignatyev@6963 645 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) {
iignatyev@6963 646 if (name == NULL) {
iignatyev@6963 647 return false;
iignatyev@6963 648 }
iignatyev@6963 649 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 650 const char* flag_name = env->GetStringUTFChars(name, NULL);
iignatyev@6963 651 bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL);
iignatyev@6963 652 env->ReleaseStringUTFChars(name, flag_name);
iignatyev@6963 653 return result;
iignatyev@6963 654 }
iignatyev@6963 655
iignatyev@6963 656 template <typename T>
iignatyev@6963 657 static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) {
iignatyev@6963 658 ResourceMark rm(thread);
iignatyev@6963 659 jclass clazz = env->FindClass(name->as_C_string());
iignatyev@6963 660 CHECK_JNI_EXCEPTION_(env, NULL);
iignatyev@6963 661 jmethodID methodID = env->GetStaticMethodID(clazz,
iignatyev@6963 662 vmSymbols::valueOf_name()->as_C_string(),
iignatyev@6963 663 sig->as_C_string());
iignatyev@6963 664 CHECK_JNI_EXCEPTION_(env, NULL);
iignatyev@6963 665 jobject result = env->CallStaticObjectMethod(clazz, methodID, value);
iignatyev@6963 666 CHECK_JNI_EXCEPTION_(env, NULL);
iignatyev@6963 667 return result;
iignatyev@6963 668 }
iignatyev@6963 669
iignatyev@6963 670 static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) {
iignatyev@6963 671 return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value);
iignatyev@6963 672 }
iignatyev@6963 673 static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) {
iignatyev@6963 674 return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value);
iignatyev@6963 675 }
iignatyev@6963 676 static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) {
iignatyev@6963 677 return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value);
iignatyev@6963 678 }
iignatyev@6963 679 /* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) {
iignatyev@6963 680 return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value);
iignatyev@6963 681 }*/
iignatyev@6963 682 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) {
iignatyev@6963 683 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value);
iignatyev@6963 684 }
iignatyev@6963 685
iignatyev@6963 686 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 687 bool result;
iignatyev@6963 688 if (GetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAt)) {
iignatyev@6963 689 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 690 return booleanBox(thread, env, result);
iignatyev@6963 691 }
iignatyev@6963 692 return NULL;
iignatyev@6963 693 WB_END
iignatyev@6963 694
iignatyev@6963 695 WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 696 intx result;
iignatyev@6963 697 if (GetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAt)) {
iignatyev@6963 698 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 699 return longBox(thread, env, result);
iignatyev@6963 700 }
iignatyev@6963 701 return NULL;
iignatyev@6963 702 WB_END
iignatyev@6963 703
iignatyev@6963 704 WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 705 uintx result;
iignatyev@6963 706 if (GetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAt)) {
iignatyev@6963 707 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 708 return longBox(thread, env, result);
iignatyev@6963 709 }
iignatyev@6963 710 return NULL;
iignatyev@6963 711 WB_END
iignatyev@6963 712
iignatyev@6963 713 WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 714 uint64_t result;
iignatyev@6963 715 if (GetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) {
iignatyev@6963 716 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 717 return longBox(thread, env, result);
iignatyev@6963 718 }
iignatyev@6963 719 return NULL;
iignatyev@6963 720 WB_END
iignatyev@6963 721
iignatyev@6963 722 WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 723 double result;
iignatyev@6963 724 if (GetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAt)) {
iignatyev@6963 725 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 726 return doubleBox(thread, env, result);
iignatyev@6963 727 }
iignatyev@6963 728 return NULL;
iignatyev@6963 729 WB_END
iignatyev@6963 730
iignatyev@6963 731 WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name))
iignatyev@6963 732 ccstr ccstrResult;
iignatyev@6963 733 if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) {
iignatyev@6963 734 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 735 jstring result = env->NewStringUTF(ccstrResult);
iignatyev@6963 736 CHECK_JNI_EXCEPTION_(env, NULL);
iignatyev@6963 737 return result;
iignatyev@6963 738 }
iignatyev@6963 739 return NULL;
iignatyev@6963 740 WB_END
iignatyev@6963 741
iignatyev@6963 742 WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value))
iignatyev@6963 743 bool result = value == JNI_TRUE ? true : false;
iignatyev@6963 744 SetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAtPut);
iignatyev@6963 745 WB_END
iignatyev@6963 746
iignatyev@6963 747 WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
iignatyev@6963 748 intx result = value;
iignatyev@6963 749 SetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAtPut);
iignatyev@6963 750 WB_END
iignatyev@6963 751
iignatyev@6963 752 WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
iignatyev@6963 753 uintx result = value;
iignatyev@6963 754 SetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAtPut);
iignatyev@6963 755 WB_END
iignatyev@6963 756
iignatyev@6963 757 WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
iignatyev@6963 758 uint64_t result = value;
iignatyev@6963 759 SetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut);
iignatyev@6963 760 WB_END
iignatyev@6963 761
iignatyev@6963 762 WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value))
iignatyev@6963 763 double result = value;
iignatyev@6963 764 SetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAtPut);
iignatyev@6963 765 WB_END
iignatyev@6963 766
iignatyev@6963 767 WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value))
iignatyev@6963 768 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
iignatyev@6963 769 const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL);
iignatyev@6963 770 ccstr ccstrResult = ccstrValue;
iignatyev@6963 771 bool needFree;
iignatyev@6963 772 {
iignatyev@6963 773 ThreadInVMfromNative ttvfn(thread); // back to VM
iignatyev@6963 774 needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut);
iignatyev@6963 775 }
iignatyev@6963 776 if (value != NULL) {
iignatyev@6963 777 env->ReleaseStringUTFChars(value, ccstrValue);
iignatyev@6963 778 }
iignatyev@6963 779 if (needFree) {
iignatyev@6963 780 FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal);
iignatyev@6963 781 }
iignatyev@6963 782 WB_END
iignatyev@6963 783
iignatyev@6963 784
aoqi@0 785 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
aoqi@0 786 ResourceMark rm(THREAD);
aoqi@0 787 int len;
aoqi@0 788 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false);
aoqi@0 789 return (StringTable::lookup(name, len) != NULL);
aoqi@0 790 WB_END
aoqi@0 791
aoqi@0 792 WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o))
aoqi@0 793 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(true);
aoqi@0 794 Universe::heap()->collect(GCCause::_last_ditch_collection);
sjohanss@7165 795 #if INCLUDE_ALL_GCS
sjohanss@7165 796 if (UseG1GC) {
sjohanss@7165 797 // Needs to be cleared explicitly for G1
sjohanss@7165 798 Universe::heap()->collector_policy()->set_should_clear_all_soft_refs(false);
sjohanss@7165 799 }
sjohanss@7165 800 #endif // INCLUDE_ALL_GCS
aoqi@0 801 WB_END
aoqi@0 802
tschatzl@7071 803 WB_ENTRY(void, WB_YoungGC(JNIEnv* env, jobject o))
tschatzl@7071 804 Universe::heap()->collect(GCCause::_wb_young_gc);
tschatzl@7071 805 WB_END
aoqi@0 806
aoqi@0 807 WB_ENTRY(void, WB_ReadReservedMemory(JNIEnv* env, jobject o))
aoqi@0 808 // static+volatile in order to force the read to happen
aoqi@0 809 // (not be eliminated by the compiler)
aoqi@0 810 static char c;
aoqi@0 811 static volatile char* p;
aoqi@0 812
aoqi@0 813 p = os::reserve_memory(os::vm_allocation_granularity(), NULL, 0);
aoqi@0 814 if (p == NULL) {
aoqi@0 815 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Failed to reserve memory");
aoqi@0 816 }
aoqi@0 817
aoqi@0 818 c = *p;
aoqi@0 819 WB_END
aoqi@0 820
aoqi@0 821 WB_ENTRY(jstring, WB_GetCPUFeatures(JNIEnv* env, jobject o))
aoqi@0 822 const char* cpu_features = VM_Version::cpu_features();
aoqi@0 823 ThreadToNativeFromVM ttn(thread);
aoqi@0 824 jstring features_string = env->NewStringUTF(cpu_features);
aoqi@0 825
aoqi@0 826 CHECK_JNI_EXCEPTION_(env, NULL);
aoqi@0 827
aoqi@0 828 return features_string;
aoqi@0 829 WB_END
aoqi@0 830
aoqi@0 831
aoqi@0 832 WB_ENTRY(jobjectArray, WB_GetNMethod(JNIEnv* env, jobject o, jobject method, jboolean is_osr))
aoqi@0 833 ResourceMark rm(THREAD);
aoqi@0 834 jmethodID jmid = reflected_method_to_jmid(thread, env, method);
aoqi@0 835 CHECK_JNI_EXCEPTION_(env, NULL);
aoqi@0 836 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
aoqi@0 837 nmethod* code = is_osr ? mh->lookup_osr_nmethod_for(InvocationEntryBci, CompLevel_none, false) : mh->code();
aoqi@0 838 jobjectArray result = NULL;
aoqi@0 839 if (code == NULL) {
aoqi@0 840 return result;
aoqi@0 841 }
aoqi@0 842 int insts_size = code->insts_size();
aoqi@0 843
aoqi@0 844 ThreadToNativeFromVM ttn(thread);
aoqi@0 845 jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
aoqi@0 846 CHECK_JNI_EXCEPTION_(env, NULL);
aoqi@0 847 result = env->NewObjectArray(2, clazz, NULL);
aoqi@0 848 if (result == NULL) {
aoqi@0 849 return result;
aoqi@0 850 }
aoqi@0 851
iignatyev@6963 852 jobject obj = integerBox(thread, env, code->comp_level());
aoqi@0 853 CHECK_JNI_EXCEPTION_(env, NULL);
aoqi@0 854 env->SetObjectArrayElement(result, 0, obj);
aoqi@0 855
aoqi@0 856 jbyteArray insts = env->NewByteArray(insts_size);
aoqi@0 857 CHECK_JNI_EXCEPTION_(env, NULL);
aoqi@0 858 env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
aoqi@0 859 env->SetObjectArrayElement(result, 1, insts);
aoqi@0 860
aoqi@0 861 return result;
aoqi@0 862 WB_END
aoqi@0 863
aoqi@0 864
stefank@6992 865 int WhiteBox::array_bytes_to_length(size_t bytes) {
stefank@6992 866 return Array<u1>::bytes_to_length(bytes);
stefank@6992 867 }
stefank@6992 868
stefank@6992 869 WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
stefank@6992 870 if (size < 0) {
stefank@6992 871 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
stefank@6992 872 err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
stefank@6992 873 }
stefank@6992 874
stefank@6992 875 oop class_loader_oop = JNIHandles::resolve(class_loader);
stefank@6992 876 ClassLoaderData* cld = class_loader_oop != NULL
stefank@6992 877 ? java_lang_ClassLoader::loader_data(class_loader_oop)
stefank@6992 878 : ClassLoaderData::the_null_class_loader_data();
stefank@6992 879
stefank@6992 880 void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
stefank@6992 881
stefank@6992 882 return (jlong)(uintptr_t)metadata;
stefank@6992 883 WB_END
stefank@6992 884
stefank@6992 885 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
stefank@6992 886 oop class_loader_oop = JNIHandles::resolve(class_loader);
stefank@6992 887 ClassLoaderData* cld = class_loader_oop != NULL
stefank@6992 888 ? java_lang_ClassLoader::loader_data(class_loader_oop)
stefank@6992 889 : ClassLoaderData::the_null_class_loader_data();
stefank@6992 890
stefank@6992 891 MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
stefank@6992 892 WB_END
stefank@6992 893
ehelin@7254 894 WB_ENTRY(jlong, WB_IncMetaspaceCapacityUntilGC(JNIEnv* env, jobject wb, jlong inc))
ehelin@7254 895 if (inc < 0) {
ehelin@7254 896 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
ehelin@7254 897 err_msg("WB_IncMetaspaceCapacityUntilGC: inc is negative: " JLONG_FORMAT, inc));
ehelin@7254 898 }
ehelin@7254 899
ehelin@7254 900 jlong max_size_t = (jlong) ((size_t) -1);
ehelin@7254 901 if (inc > max_size_t) {
ehelin@7254 902 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
ehelin@7254 903 err_msg("WB_IncMetaspaceCapacityUntilGC: inc does not fit in size_t: " JLONG_FORMAT, inc));
ehelin@7254 904 }
ehelin@7254 905
ehelin@7254 906 size_t new_cap_until_GC = 0;
ehelin@7254 907 size_t aligned_inc = align_size_down((size_t) inc, Metaspace::commit_alignment());
ehelin@7254 908 bool success = MetaspaceGC::inc_capacity_until_GC(aligned_inc, &new_cap_until_GC);
ehelin@7254 909 if (!success) {
ehelin@7254 910 THROW_MSG_0(vmSymbols::java_lang_IllegalStateException(),
ehelin@7254 911 "WB_IncMetaspaceCapacityUntilGC: could not increase capacity until GC "
ehelin@7254 912 "due to contention with another thread");
ehelin@7254 913 }
ehelin@7254 914 return (jlong) new_cap_until_GC;
ehelin@7254 915 WB_END
ehelin@7254 916
ehelin@7254 917 WB_ENTRY(jlong, WB_MetaspaceCapacityUntilGC(JNIEnv* env, jobject wb))
ehelin@7254 918 return (jlong) MetaspaceGC::capacity_until_GC();
ehelin@7254 919 WB_END
ehelin@7254 920
iklam@8497 921 WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))
iklam@8497 922 return (jboolean)MetaspaceShared::is_in_shared_space(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
iklam@8497 923 WB_END
iklam@8497 924
bmoloden@7797 925 WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
bmoloden@7797 926 oop obj_oop = JNIHandles::resolve(obj);
bmoloden@7797 927 return (jboolean) obj_oop->mark()->has_monitor();
bmoloden@7797 928 WB_END
bmoloden@7797 929
bmoloden@7797 930 WB_ENTRY(void, WB_ForceSafepoint(JNIEnv* env, jobject wb))
bmoloden@7797 931 VM_ForceSafepoint force_safepoint_op;
bmoloden@7797 932 VMThread::execute(&force_safepoint_op);
bmoloden@7797 933 WB_END
bmoloden@7797 934
aoqi@0 935 //Some convenience methods to deal with objects from java
aoqi@0 936 int WhiteBox::offset_for_field(const char* field_name, oop object,
aoqi@0 937 Symbol* signature_symbol) {
aoqi@0 938 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
aoqi@0 939 Thread* THREAD = Thread::current();
aoqi@0 940
aoqi@0 941 //Get the class of our object
aoqi@0 942 Klass* arg_klass = object->klass();
aoqi@0 943 //Turn it into an instance-klass
aoqi@0 944 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
aoqi@0 945
aoqi@0 946 //Create symbols to look for in the class
aoqi@0 947 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
aoqi@0 948 THREAD);
aoqi@0 949
aoqi@0 950 //To be filled in with an offset of the field we're looking for
aoqi@0 951 fieldDescriptor fd;
aoqi@0 952
aoqi@0 953 Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
aoqi@0 954 if (res == NULL) {
aoqi@0 955 tty->print_cr("Invalid layout of %s at %s", ik->external_name(),
aoqi@0 956 name_symbol->as_C_string());
dbuck@7788 957 vm_exit_during_initialization("Invalid layout of preloaded class: use -XX:+TraceClassLoading to see the origin of the problem class");
aoqi@0 958 }
aoqi@0 959
aoqi@0 960 //fetch the field at the offset we've found
aoqi@0 961 int dest_offset = fd.offset();
aoqi@0 962
aoqi@0 963 return dest_offset;
aoqi@0 964 }
aoqi@0 965
aoqi@0 966
aoqi@0 967 const char* WhiteBox::lookup_jstring(const char* field_name, oop object) {
aoqi@0 968 int offset = offset_for_field(field_name, object,
aoqi@0 969 vmSymbols::string_signature());
aoqi@0 970 oop string = object->obj_field(offset);
aoqi@0 971 if (string == NULL) {
aoqi@0 972 return NULL;
aoqi@0 973 }
aoqi@0 974 const char* ret = java_lang_String::as_utf8_string(string);
aoqi@0 975 return ret;
aoqi@0 976 }
aoqi@0 977
aoqi@0 978 bool WhiteBox::lookup_bool(const char* field_name, oop object) {
aoqi@0 979 int offset =
aoqi@0 980 offset_for_field(field_name, object, vmSymbols::bool_signature());
aoqi@0 981 bool ret = (object->bool_field(offset) == JNI_TRUE);
aoqi@0 982 return ret;
aoqi@0 983 }
aoqi@0 984
sjohanss@7165 985 void WhiteBox::register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, JNINativeMethod* method_array, int method_count) {
sjohanss@7165 986 ResourceMark rm;
sjohanss@7165 987 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
sjohanss@7165 988
sjohanss@7165 989 // one by one registration natives for exception catching
sjohanss@7165 990 jclass no_such_method_error_klass = env->FindClass(vmSymbols::java_lang_NoSuchMethodError()->as_C_string());
sjohanss@7165 991 CHECK_JNI_EXCEPTION(env);
sjohanss@7165 992 for (int i = 0, n = method_count; i < n; ++i) {
sjohanss@7165 993 // Skip dummy entries
sjohanss@7165 994 if (method_array[i].fnPtr == NULL) continue;
sjohanss@7165 995 if (env->RegisterNatives(wbclass, &method_array[i], 1) != 0) {
sjohanss@7165 996 jthrowable throwable_obj = env->ExceptionOccurred();
sjohanss@7165 997 if (throwable_obj != NULL) {
sjohanss@7165 998 env->ExceptionClear();
sjohanss@7165 999 if (env->IsInstanceOf(throwable_obj, no_such_method_error_klass)) {
sjohanss@7165 1000 // NoSuchMethodError is thrown when a method can't be found or a method is not native.
sjohanss@7165 1001 // Ignoring the exception since it is not preventing use of other WhiteBox methods.
sjohanss@7165 1002 tty->print_cr("Warning: 'NoSuchMethodError' on register of sun.hotspot.WhiteBox::%s%s",
sjohanss@7165 1003 method_array[i].name, method_array[i].signature);
sjohanss@7165 1004 }
sjohanss@7165 1005 } else {
sjohanss@7165 1006 // Registration failed unexpectedly.
sjohanss@7165 1007 tty->print_cr("Warning: unexpected error on register of sun.hotspot.WhiteBox::%s%s. All methods will be unregistered",
sjohanss@7165 1008 method_array[i].name, method_array[i].signature);
sjohanss@7165 1009 env->UnregisterNatives(wbclass);
sjohanss@7165 1010 break;
sjohanss@7165 1011 }
sjohanss@7165 1012 }
sjohanss@7165 1013 }
sjohanss@7165 1014 }
aoqi@0 1015
dbuck@9186 1016 // Checks that the library libfile has the noexecstack bit set.
dbuck@9186 1017 WB_ENTRY(jboolean, WB_CheckLibSpecifiesNoexecstack(JNIEnv* env, jobject o, jstring libfile))
dbuck@9186 1018 jboolean ret = false;
dbuck@9186 1019 #ifdef LINUX
dbuck@9186 1020 // Can't be in VM when we call JNI.
dbuck@9186 1021 ThreadToNativeFromVM ttnfv(thread);
dbuck@9186 1022 const char* lf = env->GetStringUTFChars(libfile, NULL);
dbuck@9186 1023 CHECK_JNI_EXCEPTION_(env, 0);
dbuck@9186 1024 ElfFile ef(lf);
dbuck@9186 1025 ret = (jboolean) ef.specifies_noexecstack();
dbuck@9186 1026 env->ReleaseStringUTFChars(libfile, lf);
dbuck@9186 1027 #endif
dbuck@9186 1028 return ret;
dbuck@9186 1029 WB_END
dbuck@9186 1030
aoqi@0 1031 #define CC (char*)
aoqi@0 1032
aoqi@0 1033 static JNINativeMethod methods[] = {
aoqi@0 1034 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress },
tschatzl@7071 1035 {CC"getObjectSize", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectSize },
tschatzl@7071 1036 {CC"isObjectInOldGen", CC"(Ljava/lang/Object;)Z", (void*)&WB_isObjectInOldGen },
aoqi@0 1037 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize },
minqi@7779 1038 {CC"getVMPageSize", CC"()I", (void*)&WB_GetVMPageSize },
tschatzl@7781 1039 {CC"getVMLargePageSize", CC"()J", (void*)&WB_GetVMLargePageSize},
aoqi@0 1040 {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive },
iklam@7322 1041 {CC"classKnownToNotExist",
iklam@7322 1042 CC"(Ljava/lang/ClassLoader;Ljava/lang/String;)Z",(void*)&WB_ClassKnownToNotExist},
iklam@7322 1043 {CC"getLookupCacheURLs", CC"(Ljava/lang/ClassLoader;)[Ljava/net/URL;", (void*)&WB_GetLookupCacheURLs},
iklam@7322 1044 {CC"getLookupCacheMatches", CC"(Ljava/lang/ClassLoader;Ljava/lang/String;)[I",
iklam@7322 1045 (void*)&WB_GetLookupCacheMatches},
aoqi@0 1046 {CC"parseCommandLine",
aoqi@0 1047 CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
aoqi@0 1048 (void*) &WB_ParseCommandLine
aoqi@0 1049 },
iklam@7381 1050 {CC"addToBootstrapClassLoaderSearch", CC"(Ljava/lang/String;)V",
iklam@7381 1051 (void*)&WB_AddToBootstrapClassLoaderSearch},
iklam@7381 1052 {CC"addToSystemClassLoaderSearch", CC"(Ljava/lang/String;)V",
iklam@7381 1053 (void*)&WB_AddToSystemClassLoaderSearch},
aoqi@0 1054 {CC"getCompressedOopsMaxHeapSize", CC"()J",
aoqi@0 1055 (void*)&WB_GetCompressedOopsMaxHeapSize},
aoqi@0 1056 {CC"printHeapSizes", CC"()V", (void*)&WB_PrintHeapSizes },
aoqi@0 1057 {CC"runMemoryUnitTests", CC"()V", (void*)&WB_RunMemoryUnitTests},
aoqi@0 1058 {CC"readFromNoaccessArea",CC"()V", (void*)&WB_ReadFromNoaccessArea},
aoqi@0 1059 {CC"stressVirtualSpaceResize",CC"(JJJ)I", (void*)&WB_StressVirtualSpaceResize},
iklam@8497 1060 {CC"isSharedClass", CC"(Ljava/lang/Class;)Z", (void*)&WB_IsSharedClass },
aoqi@0 1061 #if INCLUDE_ALL_GCS
aoqi@0 1062 {CC"g1InConcurrentMark", CC"()Z", (void*)&WB_G1InConcurrentMark},
aoqi@0 1063 {CC"g1IsHumongous", CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous },
azakharov@7835 1064 {CC"g1NumMaxRegions", CC"()J", (void*)&WB_G1NumMaxRegions },
aoqi@0 1065 {CC"g1NumFreeRegions", CC"()J", (void*)&WB_G1NumFreeRegions },
aoqi@0 1066 {CC"g1RegionSize", CC"()I", (void*)&WB_G1RegionSize },
kevinw@8194 1067 {CC"g1StartConcMarkCycle", CC"()Z", (void*)&WB_G1StartMarkCycle },
azakharov@7835 1068 {CC"g1AuxiliaryMemoryUsage", CC"()Ljava/lang/management/MemoryUsage;",
azakharov@7835 1069 (void*)&WB_G1AuxiliaryMemoryUsage },
aoqi@0 1070 #endif // INCLUDE_ALL_GCS
aoqi@0 1071 #if INCLUDE_NMT
aoqi@0 1072 {CC"NMTMalloc", CC"(J)J", (void*)&WB_NMTMalloc },
zgu@7074 1073 {CC"NMTMallocWithPseudoStack", CC"(JI)J", (void*)&WB_NMTMallocWithPseudoStack},
aoqi@0 1074 {CC"NMTFree", CC"(J)V", (void*)&WB_NMTFree },
aoqi@0 1075 {CC"NMTReserveMemory", CC"(J)J", (void*)&WB_NMTReserveMemory },
aoqi@0 1076 {CC"NMTCommitMemory", CC"(JJ)V", (void*)&WB_NMTCommitMemory },
aoqi@0 1077 {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory },
aoqi@0 1078 {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory },
aoqi@0 1079 {CC"NMTIsDetailSupported",CC"()Z", (void*)&WB_NMTIsDetailSupported},
coleenp@7267 1080 {CC"NMTChangeTrackingLevel", CC"()Z", (void*)&WB_NMTChangeTrackingLevel},
gtriantafill@7342 1081 {CC"NMTGetHashSize", CC"()I", (void*)&WB_NMTGetHashSize },
aoqi@0 1082 #endif // INCLUDE_NMT
aoqi@0 1083 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
aoqi@0 1084 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Executable;Z)I",
aoqi@0 1085 (void*)&WB_DeoptimizeMethod },
aoqi@0 1086 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Executable;Z)Z",
aoqi@0 1087 (void*)&WB_IsMethodCompiled },
aoqi@0 1088 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Executable;IZ)Z",
aoqi@0 1089 (void*)&WB_IsMethodCompilable},
aoqi@0 1090 {CC"isMethodQueuedForCompilation",
aoqi@0 1091 CC"(Ljava/lang/reflect/Executable;)Z", (void*)&WB_IsMethodQueuedForCompilation},
aoqi@0 1092 {CC"makeMethodNotCompilable",
aoqi@0 1093 CC"(Ljava/lang/reflect/Executable;IZ)V", (void*)&WB_MakeMethodNotCompilable},
aoqi@0 1094 {CC"testSetDontInlineMethod",
aoqi@0 1095 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetDontInlineMethod},
aoqi@0 1096 {CC"getMethodCompilationLevel",
aoqi@0 1097 CC"(Ljava/lang/reflect/Executable;Z)I", (void*)&WB_GetMethodCompilationLevel},
aoqi@0 1098 {CC"getMethodEntryBci",
aoqi@0 1099 CC"(Ljava/lang/reflect/Executable;)I", (void*)&WB_GetMethodEntryBci},
aoqi@0 1100 {CC"getCompileQueueSize",
aoqi@0 1101 CC"(I)I", (void*)&WB_GetCompileQueueSize},
aoqi@0 1102 {CC"testSetForceInlineMethod",
aoqi@0 1103 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod},
aoqi@0 1104 {CC"enqueueMethodForCompilation",
aoqi@0 1105 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
aoqi@0 1106 {CC"clearMethodState",
aoqi@0 1107 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
iignatyev@6963 1108 {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag},
iignatyev@6963 1109 {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag},
iignatyev@6963 1110 {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
iignatyev@6963 1111 {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
iignatyev@6963 1112 {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
iignatyev@6963 1113 {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
iignatyev@6963 1114 (void*)&WB_SetStringVMFlag},
iignatyev@6963 1115 {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
iignatyev@6963 1116 (void*)&WB_GetBooleanVMFlag},
iignatyev@6963 1117 {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
iignatyev@6963 1118 (void*)&WB_GetIntxVMFlag},
iignatyev@6963 1119 {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
iignatyev@6963 1120 (void*)&WB_GetUintxVMFlag},
iignatyev@6963 1121 {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
iignatyev@6963 1122 (void*)&WB_GetUint64VMFlag},
iignatyev@6963 1123 {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
iignatyev@6963 1124 (void*)&WB_GetDoubleVMFlag},
iignatyev@6963 1125 {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
iignatyev@6963 1126 (void*)&WB_GetStringVMFlag},
iignatyev@6963 1127 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
aoqi@0 1128 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
tschatzl@7071 1129 {CC"youngGC", CC"()V", (void*)&WB_YoungGC },
aoqi@0 1130 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
stefank@6992 1131 {CC"allocateMetaspace",
stefank@6992 1132 CC"(Ljava/lang/ClassLoader;J)J", (void*)&WB_AllocateMetaspace },
stefank@6992 1133 {CC"freeMetaspace",
stefank@6992 1134 CC"(Ljava/lang/ClassLoader;JJ)V", (void*)&WB_FreeMetaspace },
ehelin@7254 1135 {CC"incMetaspaceCapacityUntilGC", CC"(J)J", (void*)&WB_IncMetaspaceCapacityUntilGC },
ehelin@7254 1136 {CC"metaspaceCapacityUntilGC", CC"()J", (void*)&WB_MetaspaceCapacityUntilGC },
aoqi@0 1137 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
aoqi@0 1138 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
aoqi@0 1139 (void*)&WB_GetNMethod },
bmoloden@7797 1140 {CC"isMonitorInflated", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated },
bmoloden@7797 1141 {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint },
dbuck@9186 1142 {CC"checkLibSpecifiesNoexecstack", CC"(Ljava/lang/String;)Z",
dbuck@9186 1143 (void*)&WB_CheckLibSpecifiesNoexecstack},
aoqi@0 1144 };
aoqi@0 1145
aoqi@0 1146 #undef CC
aoqi@0 1147
aoqi@0 1148 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
aoqi@0 1149 {
aoqi@0 1150 if (WhiteBoxAPI) {
aoqi@0 1151 // Make sure that wbclass is loaded by the null classloader
aoqi@0 1152 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
aoqi@0 1153 Handle loader(ikh->class_loader());
aoqi@0 1154 if (loader.is_null()) {
sjohanss@7165 1155 WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0]));
sjohanss@7165 1156 WhiteBox::register_extended(env, wbclass, thread);
sjohanss@7165 1157 WhiteBox::set_used();
aoqi@0 1158 }
aoqi@0 1159 }
aoqi@0 1160 }
aoqi@0 1161 JVM_END

mercurial