# HG changeset patch # User jcbeyler # Date 1539202218 25200 # Wed Oct 10 13:10:18 2018 -0700 # Node ID 36c9a3f900c815f4fd00b7a9a5747a9254c96e03 # Parent eb1ecdd3611e8147a464431265476188d6e8de3b 8211980: Remove ThreadHeapSampler enable/disable/enabled methods Summary: Reviewed-by: diff --git a/src/hotspot/share/gc/shared/memAllocator.cpp b/src/hotspot/share/gc/shared/memAllocator.cpp --- a/src/hotspot/share/gc/shared/memAllocator.cpp +++ b/src/hotspot/share/gc/shared/memAllocator.cpp @@ -187,7 +187,7 @@ // support for JVMTI VMObjectAlloc event (no-op if not enabled) JvmtiExport::vm_object_alloc_event_collector(obj()); - if (!ThreadHeapSampler::enabled()) { + if (!JvmtiExport::should_post_sampled_object_alloc()) { // Sampling disabled return; } @@ -282,7 +282,7 @@ HeapWord* mem = NULL; ThreadLocalAllocBuffer& tlab = _thread->tlab(); - if (ThreadHeapSampler::enabled()) { + if (JvmtiExport::should_post_sampled_object_alloc()) { // Try to allocate the sampled object from TLAB, it is possible a sample // point was put and the TLAB still has space. tlab.set_back_allocation_end(); diff --git a/src/hotspot/share/prims/jvmtiEnv.cpp b/src/hotspot/share/prims/jvmtiEnv.cpp --- a/src/hotspot/share/prims/jvmtiEnv.cpp +++ b/src/hotspot/share/prims/jvmtiEnv.cpp @@ -540,13 +540,6 @@ record_class_file_load_hook_enabled(); } - if (event_type == JVMTI_EVENT_SAMPLED_OBJECT_ALLOC) { - if (enabled) { - ThreadHeapSampler::enable(); - } else { - ThreadHeapSampler::disable(); - } - } JvmtiEventController::set_user_enabled(this, (JavaThread*) NULL, event_type, enabled); } else { // We have a specified event_thread. diff --git a/src/hotspot/share/runtime/threadHeapSampler.cpp b/src/hotspot/share/runtime/threadHeapSampler.cpp --- a/src/hotspot/share/runtime/threadHeapSampler.cpp +++ b/src/hotspot/share/runtime/threadHeapSampler.cpp @@ -29,22 +29,29 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/threadHeapSampler.hpp" -// Cheap random number generator +// Cheap random number generator. uint64_t ThreadHeapSampler::_rnd; // Default is 512kb. int ThreadHeapSampler::_sampling_interval = 512 * 1024; -int ThreadHeapSampler::_enabled; + +// Ordering here is important: _log_table first, _log_table_initialized second. +double ThreadHeapSampler::_log_table[1 << ThreadHeapSampler::FastLogNumBits] = {}; + +// Force initialization of the log_table. +bool ThreadHeapSampler::_log_table_initialized = init_log_table(); -// Statics for the fast log -static const int FastLogNumBits = 10; -static const int FastLogMask = (1 << FastLogNumBits) - 1; -static double log_table[1<(i+0.5) / (1 << FastLogNumBits)) + / log(2.0)); + } + return true; +} // Returns the next prng value. // pRNG is: aX+b mod c with a = 0x5DEECE66D, b = 0xB, c = 1<<48 // This is the lrand64 generator. -static uint64_t next_random(uint64_t rnd) { +uint64_t ThreadHeapSampler::next_random(uint64_t rnd) { const uint64_t PrngMult = 0x5DEECE66DLL; const uint64_t PrngAdd = 0xB; const uint64_t PrngModPower = 48; @@ -54,7 +61,7 @@ return (PrngMult * rnd + PrngAdd) & PrngModMask; } -static double fast_log2(const double & d) { +double ThreadHeapSampler::fast_log2(const double& d) { assert(d>0, "bad value passed to assert"); uint64_t x = 0; assert(sizeof(d) == sizeof(x), @@ -64,7 +71,9 @@ assert(FastLogNumBits <= 20, "FastLogNumBits should be less than 20."); const uint32_t y = x_high >> (20 - FastLogNumBits) & FastLogMask; const int32_t exponent = ((x_high >> 20) & 0x7FF) - 1023; - return exponent + log_table[y]; + + assert(_log_table_initialized, "log table should be initialized"); + return exponent + _log_table[y]; } // Generates a geometric variable with the specified mean (512K by default). @@ -134,36 +143,6 @@ pick_next_sample(overflow_bytes); } -void ThreadHeapSampler::init_log_table() { - MutexLockerEx mu(ThreadHeapSampler_lock, Mutex::_no_safepoint_check_flag); - - if (log_table_initialized) { - return; - } - - for (int i = 0; i < (1 << FastLogNumBits); i++) { - log_table[i] = (log(1.0 + static_cast(i+0.5) / (1 << FastLogNumBits)) - / log(2.0)); - } - - log_table_initialized = true; -} - -void ThreadHeapSampler::enable() { - // Done here to be done when things have settled. This adds a mutex lock but - // presumably, users won't be enabling and disabling all the time. - init_log_table(); - OrderAccess::release_store(&_enabled, 1); -} - -int ThreadHeapSampler::enabled() { - return OrderAccess::load_acquire(&_enabled); -} - -void ThreadHeapSampler::disable() { - OrderAccess::release_store(&_enabled, 0); -} - int ThreadHeapSampler::get_sampling_interval() { return OrderAccess::load_acquire(&_sampling_interval); } diff --git a/src/hotspot/share/runtime/threadHeapSampler.hpp b/src/hotspot/share/runtime/threadHeapSampler.hpp --- a/src/hotspot/share/runtime/threadHeapSampler.hpp +++ b/src/hotspot/share/runtime/threadHeapSampler.hpp @@ -30,20 +30,28 @@ class ThreadHeapSampler { private: + // Statics for the fast log + static const int FastLogNumBits = 10; + static const int FastLogMask = (1 << FastLogNumBits) - 1; + size_t _bytes_until_sample; // Cheap random number generator static uint64_t _rnd; + static bool _log_table_initialized; + + static double _log_table[1<