< prev index next >
src/share/vm/jfr/leakprofiler/sampling/objectSampler.hpp
Print this page
rev 9055 : 8214542: JFR: Old Object Sample event slow on a deep heap in debug builds
Reviewed-by: egahlin, rwestberg
@@ -26,11 +26,14 @@
#define SHARE_VM_LEAKPROFILER_SAMPLING_OBJECTSAMPLER_HPP
#include "memory/allocation.hpp"
#include "jfr/utilities/jfrTime.hpp"
+typedef u8 traceid;
+
class BoolObjectClosure;
+class JfrStackTrace;
class OopClosure;
class ObjectSample;
class ObjectSampler;
class SampleList;
class SamplePriorityQueue;
@@ -38,36 +41,51 @@
// Class reponsible for holding samples and
// making sure the samples are evenly distributed as
// new entries are added and removed.
class ObjectSampler : public CHeapObj<mtTracing> {
+ 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;
JfrTicks _last_sweep;
size_t _total_allocated;
size_t _threshold;
size_t _size;
- volatile int _tryLock;
bool _dead_samples;
+ // Lifecycle
explicit ObjectSampler(size_t size);
~ObjectSampler();
-
- void add(HeapWord* object, size_t size, JavaThread* thread);
- void remove_dead(ObjectSample* sample);
+ static bool create(size_t size);
+ static bool is_created();
+ static ObjectSampler* sampler();
+ static void destroy();
+
+ // 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);
// 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;
const ObjectSample* first() const;
const ObjectSample* last() const;
< prev index next >