src/hotspot/share/jfr/leakprofiler/sampling/objectSampler.hpp
changeset 55571 49102ba8cf14
parent 53244 9807daeb47c4
child 58132 caa25ab47aca
child 58154 060d9d139109
equal deleted inserted replaced
55570:1e95931e7d8f 55571:49102ba8cf14
    26 #define SHARE_JFR_LEAKPROFILER_SAMPLING_OBJECTSAMPLER_HPP
    26 #define SHARE_JFR_LEAKPROFILER_SAMPLING_OBJECTSAMPLER_HPP
    27 
    27 
    28 #include "memory/allocation.hpp"
    28 #include "memory/allocation.hpp"
    29 #include "jfr/utilities/jfrTime.hpp"
    29 #include "jfr/utilities/jfrTime.hpp"
    30 
    30 
       
    31 typedef u8 traceid;
       
    32 
    31 class BoolObjectClosure;
    33 class BoolObjectClosure;
       
    34 class JfrStackTrace;
    32 class OopClosure;
    35 class OopClosure;
    33 class ObjectSample;
    36 class ObjectSample;
    34 class ObjectSampler;
    37 class ObjectSampler;
    35 class SampleList;
    38 class SampleList;
    36 class SamplePriorityQueue;
    39 class SamplePriorityQueue;
    38 
    41 
    39 // Class reponsible for holding samples and
    42 // Class reponsible for holding samples and
    40 // making sure the samples are evenly distributed as
    43 // making sure the samples are evenly distributed as
    41 // new entries are added and removed.
    44 // new entries are added and removed.
    42 class ObjectSampler : public CHeapObj<mtTracing> {
    45 class ObjectSampler : public CHeapObj<mtTracing> {
       
    46   friend class EventEmitter;
       
    47   friend class JfrRecorderService;
    43   friend class LeakProfiler;
    48   friend class LeakProfiler;
    44   friend class ObjectSampleCheckpoint;
       
    45   friend class StartOperation;
    49   friend class StartOperation;
    46   friend class StopOperation;
    50   friend class StopOperation;
    47   friend class EmitEventOperation;
    51   friend class ObjectSampleCheckpoint;
       
    52   friend class WriteObjectSampleStacktrace;
    48  private:
    53  private:
    49   SamplePriorityQueue* _priority_queue;
    54   SamplePriorityQueue* _priority_queue;
    50   SampleList* _list;
    55   SampleList* _list;
    51   JfrTicks _last_sweep;
    56   JfrTicks _last_sweep;
    52   size_t _total_allocated;
    57   size_t _total_allocated;
    53   size_t _threshold;
    58   size_t _threshold;
    54   size_t _size;
    59   size_t _size;
    55   volatile int _tryLock;
       
    56   bool _dead_samples;
    60   bool _dead_samples;
    57 
    61 
       
    62   // Lifecycle
    58   explicit ObjectSampler(size_t size);
    63   explicit ObjectSampler(size_t size);
    59   ~ObjectSampler();
    64   ~ObjectSampler();
       
    65   static bool create(size_t size);
       
    66   static bool is_created();
       
    67   static ObjectSampler* sampler();
       
    68   static void destroy();
    60 
    69 
    61   void add(HeapWord* object, size_t size, JavaThread* thread);
    70   // For operations that require exclusive access (non-safepoint)
       
    71   static ObjectSampler* acquire();
       
    72   static void release();
       
    73 
       
    74   // Stacktrace
       
    75   static void fill_stacktrace(JfrStackTrace* stacktrace, JavaThread* thread);
       
    76   traceid stacktrace_id(const JfrStackTrace* stacktrace, JavaThread* thread);
       
    77 
       
    78   // Sampling
       
    79   static void sample(HeapWord* object, size_t size, JavaThread* thread);
       
    80   void add(HeapWord* object, size_t size, traceid thread_id, JfrStackTrace* stacktrace, JavaThread* thread);
       
    81   void scavenge();
    62   void remove_dead(ObjectSample* sample);
    82   void remove_dead(ObjectSample* sample);
    63   void scavenge();
       
    64 
    83 
    65   // Called by GC
    84   // Called by GC
    66   void oops_do(BoolObjectClosure* is_alive, OopClosure* f);
    85   static void oops_do(BoolObjectClosure* is_alive, OopClosure* f);
    67 
    86 
    68  public:
       
    69   const ObjectSample* item_at(int index) const;
    87   const ObjectSample* item_at(int index) const;
    70   ObjectSample* item_at(int index);
    88   ObjectSample* item_at(int index);
    71   int item_count() const;
    89   int item_count() const;
    72   const ObjectSample* first() const;
    90   const ObjectSample* first() const;
    73   const ObjectSample* last() const;
    91   const ObjectSample* last() const;