1.1 --- a/src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp Fri Sep 27 13:23:32 2019 +0800 1.2 +++ b/src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp Wed Oct 09 16:11:58 2019 +0800 1.3 @@ -28,7 +28,10 @@ 1.4 #include "memory/allocation.hpp" 1.5 #include "jfr/utilities/jfrTime.hpp" 1.6 1.7 +typedef u8 traceid; 1.8 + 1.9 class BoolObjectClosure; 1.10 +class JfrStackTrace; 1.11 class OopClosure; 1.12 class ObjectSample; 1.13 class ObjectSampler; 1.14 @@ -40,11 +43,13 @@ 1.15 // making sure the samples are evenly distributed as 1.16 // new entries are added and removed. 1.17 class ObjectSampler : public CHeapObj<mtTracing> { 1.18 + friend class EventEmitter; 1.19 + friend class JfrRecorderService; 1.20 friend class LeakProfiler; 1.21 - friend class ObjectSampleCheckpoint; 1.22 friend class StartOperation; 1.23 friend class StopOperation; 1.24 - friend class EmitEventOperation; 1.25 + friend class ObjectSampleCheckpoint; 1.26 + friend class WriteObjectSampleStacktrace; 1.27 private: 1.28 SamplePriorityQueue* _priority_queue; 1.29 SampleList* _list; 1.30 @@ -52,20 +57,33 @@ 1.31 size_t _total_allocated; 1.32 size_t _threshold; 1.33 size_t _size; 1.34 - volatile int _tryLock; 1.35 bool _dead_samples; 1.36 1.37 + // Lifecycle 1.38 explicit ObjectSampler(size_t size); 1.39 ~ObjectSampler(); 1.40 + static bool create(size_t size); 1.41 + static bool is_created(); 1.42 + static ObjectSampler* sampler(); 1.43 + static void destroy(); 1.44 1.45 - void add(HeapWord* object, size_t size, JavaThread* thread); 1.46 + // For operations that require exclusive access (non-safepoint) 1.47 + static ObjectSampler* acquire(); 1.48 + static void release(); 1.49 + 1.50 + // Stacktrace 1.51 + static void fill_stacktrace(JfrStackTrace* stacktrace, JavaThread* thread); 1.52 + traceid stacktrace_id(const JfrStackTrace* stacktrace, JavaThread* thread); 1.53 + 1.54 + // Sampling 1.55 + static void sample(HeapWord* object, size_t size, JavaThread* thread); 1.56 + void add(HeapWord* object, size_t size, traceid thread_id, JfrStackTrace* stacktrace, JavaThread* thread); 1.57 + void scavenge(); 1.58 void remove_dead(ObjectSample* sample); 1.59 - void scavenge(); 1.60 1.61 // Called by GC 1.62 - void oops_do(BoolObjectClosure* is_alive, OopClosure* f); 1.63 + static void oops_do(BoolObjectClosure* is_alive, OopClosure* f); 1.64 1.65 - public: 1.66 const ObjectSample* item_at(int index) const; 1.67 ObjectSample* item_at(int index); 1.68 int item_count() const;