comparison src/share/vm/prims/whitebox.cpp @ 20360:833b0f92429a

8046598: Scalable Native memory tracking development Summary: Enhance scalability of native memory tracking Reviewed-by: coleenp, ctornqvi, gtriantafill
author zgu
date Wed, 27 Aug 2014 08:19:12 -0400
parents 4bfc44ba0d19
children e2452c3ff7fb
comparison
equal deleted inserted replaced
20359:4d3a43351904 20360:833b0f92429a
47 #include "gc_implementation/g1/concurrentMark.hpp" 47 #include "gc_implementation/g1/concurrentMark.hpp"
48 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" 48 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
49 #include "gc_implementation/g1/heapRegionRemSet.hpp" 49 #include "gc_implementation/g1/heapRegionRemSet.hpp"
50 #endif // INCLUDE_ALL_GCS 50 #endif // INCLUDE_ALL_GCS
51 51
52 #ifdef INCLUDE_NMT 52 #if INCLUDE_NMT
53 #include "services/mallocSiteTable.hpp"
53 #include "services/memTracker.hpp" 54 #include "services/memTracker.hpp"
55 #include "utilities/nativeCallStack.hpp"
54 #endif // INCLUDE_NMT 56 #endif // INCLUDE_NMT
55 57
56 #include "compiler/compileBroker.hpp" 58 #include "compiler/compileBroker.hpp"
57 #include "runtime/compilationPolicy.hpp" 59 #include "runtime/compilationPolicy.hpp"
58 60
274 #if INCLUDE_NMT 276 #if INCLUDE_NMT
275 // Alloc memory using the test memory type so that we can use that to see if 277 // Alloc memory using the test memory type so that we can use that to see if
276 // NMT picks it up correctly 278 // NMT picks it up correctly
277 WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size)) 279 WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size))
278 jlong addr = 0; 280 jlong addr = 0;
279
280 if (MemTracker::is_on() && !MemTracker::shutdown_in_progress()) {
281 addr = (jlong)(uintptr_t)os::malloc(size, mtTest); 281 addr = (jlong)(uintptr_t)os::malloc(size, mtTest);
282 }
283
284 return addr; 282 return addr;
283 WB_END
284
285 // Alloc memory with pseudo call stack. The test can create psudo malloc
286 // allocation site to stress the malloc tracking.
287 WB_ENTRY(jlong, WB_NMTMallocWithPseudoStack(JNIEnv* env, jobject o, jlong size, jint pseudo_stack))
288 address pc = (address)(size_t)pseudo_stack;
289 NativeCallStack stack(&pc, 1);
290 return (jlong)os::malloc(size, mtTest, stack);
285 WB_END 291 WB_END
286 292
287 // Free the memory allocated by NMTAllocTest 293 // Free the memory allocated by NMTAllocTest
288 WB_ENTRY(void, WB_NMTFree(JNIEnv* env, jobject o, jlong mem)) 294 WB_ENTRY(void, WB_NMTFree(JNIEnv* env, jobject o, jlong mem))
289 os::free((void*)(uintptr_t)mem, mtTest); 295 os::free((void*)(uintptr_t)mem, mtTest);
290 WB_END 296 WB_END
291 297
292 WB_ENTRY(jlong, WB_NMTReserveMemory(JNIEnv* env, jobject o, jlong size)) 298 WB_ENTRY(jlong, WB_NMTReserveMemory(JNIEnv* env, jobject o, jlong size))
293 jlong addr = 0; 299 jlong addr = 0;
294 300
295 if (MemTracker::is_on() && !MemTracker::shutdown_in_progress()) {
296 addr = (jlong)(uintptr_t)os::reserve_memory(size); 301 addr = (jlong)(uintptr_t)os::reserve_memory(size);
297 MemTracker::record_virtual_memory_type((address)addr, mtTest); 302 MemTracker::record_virtual_memory_type((address)addr, mtTest);
298 }
299 303
300 return addr; 304 return addr;
301 WB_END 305 WB_END
302 306
303 307
312 316
313 WB_ENTRY(void, WB_NMTReleaseMemory(JNIEnv* env, jobject o, jlong addr, jlong size)) 317 WB_ENTRY(void, WB_NMTReleaseMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
314 os::release_memory((char *)(uintptr_t)addr, size); 318 os::release_memory((char *)(uintptr_t)addr, size);
315 WB_END 319 WB_END
316 320
317 // Block until the current generation of NMT data to be merged, used to reliably test the NMT feature
318 WB_ENTRY(jboolean, WB_NMTWaitForDataMerge(JNIEnv* env))
319
320 if (!MemTracker::is_on() || MemTracker::shutdown_in_progress()) {
321 return false;
322 }
323
324 return MemTracker::wbtest_wait_for_data_merge();
325 WB_END
326
327 WB_ENTRY(jboolean, WB_NMTIsDetailSupported(JNIEnv* env)) 321 WB_ENTRY(jboolean, WB_NMTIsDetailSupported(JNIEnv* env))
328 return MemTracker::tracking_level() == MemTracker::NMT_detail; 322 return MemTracker::tracking_level() == NMT_detail;
329 WB_END 323 WB_END
324
325 WB_ENTRY(void, WB_NMTOverflowHashBucket(JNIEnv* env, jobject o, jlong num))
326 address pc = (address)1;
327 for (jlong index = 0; index < num; index ++) {
328 NativeCallStack stack(&pc, 1);
329 os::malloc(0, mtTest, stack);
330 pc += MallocSiteTable::hash_buckets();
331 }
332 WB_END
333
330 334
331 #endif // INCLUDE_NMT 335 #endif // INCLUDE_NMT
332 336
333 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) { 337 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
334 assert(method != NULL, "method should not be null"); 338 assert(method != NULL, "method should not be null");
859 {CC"g1NumFreeRegions", CC"()J", (void*)&WB_G1NumFreeRegions }, 863 {CC"g1NumFreeRegions", CC"()J", (void*)&WB_G1NumFreeRegions },
860 {CC"g1RegionSize", CC"()I", (void*)&WB_G1RegionSize }, 864 {CC"g1RegionSize", CC"()I", (void*)&WB_G1RegionSize },
861 #endif // INCLUDE_ALL_GCS 865 #endif // INCLUDE_ALL_GCS
862 #if INCLUDE_NMT 866 #if INCLUDE_NMT
863 {CC"NMTMalloc", CC"(J)J", (void*)&WB_NMTMalloc }, 867 {CC"NMTMalloc", CC"(J)J", (void*)&WB_NMTMalloc },
868 {CC"NMTMallocWithPseudoStack", CC"(JI)J", (void*)&WB_NMTMallocWithPseudoStack},
864 {CC"NMTFree", CC"(J)V", (void*)&WB_NMTFree }, 869 {CC"NMTFree", CC"(J)V", (void*)&WB_NMTFree },
865 {CC"NMTReserveMemory", CC"(J)J", (void*)&WB_NMTReserveMemory }, 870 {CC"NMTReserveMemory", CC"(J)J", (void*)&WB_NMTReserveMemory },
866 {CC"NMTCommitMemory", CC"(JJ)V", (void*)&WB_NMTCommitMemory }, 871 {CC"NMTCommitMemory", CC"(JJ)V", (void*)&WB_NMTCommitMemory },
867 {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory }, 872 {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory },
868 {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory }, 873 {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory },
869 {CC"NMTWaitForDataMerge", CC"()Z", (void*)&WB_NMTWaitForDataMerge}, 874 {CC"NMTOverflowHashBucket", CC"(J)V", (void*)&WB_NMTOverflowHashBucket},
870 {CC"NMTIsDetailSupported",CC"()Z", (void*)&WB_NMTIsDetailSupported}, 875 {CC"NMTIsDetailSupported",CC"()Z", (void*)&WB_NMTIsDetailSupported},
871 #endif // INCLUDE_NMT 876 #endif // INCLUDE_NMT
872 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll }, 877 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
873 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Executable;Z)I", 878 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Executable;Z)I",
874 (void*)&WB_DeoptimizeMethod }, 879 (void*)&WB_DeoptimizeMethod },