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; |