31 // Support class for sampling heap allocations across the VM.
32 class HeapMonitoring : AllStatic {
33 private:
34 // Cheap random number generator
35 static uint64_t _rnd;
36 static jint _monitoring_rate;
37 static bool _enabled;
38
39 // Statics for the fast log
40 static const int FastLogNumBits = 10;
41 static const int FastLogMask = (1 << FastLogNumBits) - 1;
42 static double _log_table[1<<FastLogNumBits]; // Constant
43
44 static void pick_next_sample(JavaThread *t);
45
46 // Returns the next prng value.
47 // pRNG is: aX+b mod c with a = 0x5DEECE66D, b = 0xB, c = 1<<48
48 // This is the lrand64 generator.
49 static inline uint64_t next_random(uint64_t rnd) {
50 const uint64_t PrngMult = 0x5DEECE66DLL;
51 const uint64_t prng_add = 0xB;
52 const uint64_t prng_mod_power = 48;
53 const uint64_t prng_mod_mask = right_n_bits(prng_mod_power);
54 return (PrngMult * rnd + prng_add) & prng_mod_mask;
55 }
56
57 static inline double fast_log2(const double & d) {
58 assert(d>0, "bad value passed to assert");
59 uint64_t x = 0;
60 memcpy(&x, &d, sizeof(uint64_t));
61 const uint32_t x_high = x >> 32;
62 const uint32_t y = x_high >> (20 - FastLogNumBits) & FastLogMask;
63 const int32_t exponent = ((x_high >> 20) & 0x7FF) - 1023;
64 return exponent + _log_table[y];
65 }
66
67 public:
68 /*
69 * General note: currently none of these methods are deemed thread-safe.
70 */
71
72 // First method called by user to start the profiler:
73 // - Note: the lower the monitoring rate, the higher the overhead incurred.
74 static void initialize_profiling(jint monitoring_rate, jint max_gc_storage);
|
31 // Support class for sampling heap allocations across the VM.
32 class HeapMonitoring : AllStatic {
33 private:
34 // Cheap random number generator
35 static uint64_t _rnd;
36 static jint _monitoring_rate;
37 static bool _enabled;
38
39 // Statics for the fast log
40 static const int FastLogNumBits = 10;
41 static const int FastLogMask = (1 << FastLogNumBits) - 1;
42 static double _log_table[1<<FastLogNumBits]; // Constant
43
44 static void pick_next_sample(JavaThread *t);
45
46 // Returns the next prng value.
47 // pRNG is: aX+b mod c with a = 0x5DEECE66D, b = 0xB, c = 1<<48
48 // This is the lrand64 generator.
49 static inline uint64_t next_random(uint64_t rnd) {
50 const uint64_t PrngMult = 0x5DEECE66DLL;
51 const uint64_t PrngAdd = 0xB;
52 const uint64_t PrngModPower = 48;
53 const uint64_t PrngModMask = right_n_bits(PrngModPower);
54 return (PrngMult * rnd + PrngAdd) & PrngModMask;
55 }
56
57 static inline double fast_log2(const double & d) {
58 assert(d>0, "bad value passed to assert");
59 uint64_t x = 0;
60 memcpy(&x, &d, sizeof(uint64_t));
61 const uint32_t x_high = x >> 32;
62 const uint32_t y = x_high >> (20 - FastLogNumBits) & FastLogMask;
63 const int32_t exponent = ((x_high >> 20) & 0x7FF) - 1023;
64 return exponent + _log_table[y];
65 }
66
67 public:
68 /*
69 * General note: currently none of these methods are deemed thread-safe.
70 */
71
72 // First method called by user to start the profiler:
73 // - Note: the lower the monitoring rate, the higher the overhead incurred.
74 static void initialize_profiling(jint monitoring_rate, jint max_gc_storage);
|