diff -r 1258121876f8 -r 8e875c964f41 src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp --- a/src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp Fri Sep 27 13:23:32 2019 +0800 +++ b/src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp Wed Oct 09 16:11:58 2019 +0800 @@ -28,7 +28,10 @@ #include "memory/allocation.hpp" #include "jfr/utilities/jfrTime.hpp" +typedef u8 traceid; + class BoolObjectClosure; +class JfrStackTrace; class OopClosure; class ObjectSample; class ObjectSampler; @@ -40,11 +43,13 @@ // making sure the samples are evenly distributed as // new entries are added and removed. class ObjectSampler : public CHeapObj { + friend class EventEmitter; + friend class JfrRecorderService; friend class LeakProfiler; - friend class ObjectSampleCheckpoint; friend class StartOperation; friend class StopOperation; - friend class EmitEventOperation; + friend class ObjectSampleCheckpoint; + friend class WriteObjectSampleStacktrace; private: SamplePriorityQueue* _priority_queue; SampleList* _list; @@ -52,20 +57,33 @@ size_t _total_allocated; size_t _threshold; size_t _size; - volatile int _tryLock; bool _dead_samples; + // Lifecycle explicit ObjectSampler(size_t size); ~ObjectSampler(); + static bool create(size_t size); + static bool is_created(); + static ObjectSampler* sampler(); + static void destroy(); - void add(HeapWord* object, size_t size, JavaThread* thread); + // For operations that require exclusive access (non-safepoint) + static ObjectSampler* acquire(); + static void release(); + + // Stacktrace + static void fill_stacktrace(JfrStackTrace* stacktrace, JavaThread* thread); + traceid stacktrace_id(const JfrStackTrace* stacktrace, JavaThread* thread); + + // Sampling + static void sample(HeapWord* object, size_t size, JavaThread* thread); + void add(HeapWord* object, size_t size, traceid thread_id, JfrStackTrace* stacktrace, JavaThread* thread); + void scavenge(); void remove_dead(ObjectSample* sample); - void scavenge(); // Called by GC - void oops_do(BoolObjectClosure* is_alive, OopClosure* f); + static void oops_do(BoolObjectClosure* is_alive, OopClosure* f); - public: const ObjectSample* item_at(int index) const; ObjectSample* item_at(int index); int item_count() const;