195 }
196 };
197
198
199
200 #define DEFAULT_RECORDER_PTR_ARRAY_SIZE 512
201
202 class MemRecorder : public CHeapObj<mtNMT|otNMTRecorder> {
203 friend class MemSnapshot;
204 friend class MemTracker;
205 friend class MemTrackWorker;
206
207 protected:
208 // the array that holds memory records
209 MemPointerArray* _pointer_records;
210
211 private:
212 // used for linked list
213 MemRecorder* _next;
214 // active recorder can only record a certain generation data
215 debug_only(unsigned long _generation;)
216
217 protected:
218 _NOINLINE_ MemRecorder();
219 ~MemRecorder();
220
221 // record a memory operation
222 bool record(address addr, MEMFLAGS flags, size_t size, address caller_pc = 0);
223
224 // linked list support
225 inline void set_next(MemRecorder* rec) {
226 _next = rec;
227 }
228
229 inline MemRecorder* next() const {
230 return _next;
231 }
232
233 // if the recorder is full
234 inline bool is_full() const {
235 assert(_pointer_records != NULL, "just check");
236 return _pointer_records->is_full();
237 }
238
239 // if running out of memory when initializing recorder's internal
240 // data
241 inline bool out_of_memory() const {
242 return (_pointer_records == NULL ||
243 _pointer_records->out_of_memory());
244 }
245
246 inline void clear() {
247 assert(_pointer_records != NULL, "Just check");
248 _pointer_records->clear();
249 }
250
251 SequencedRecordIterator pointer_itr();
252
253 protected:
254 // number of MemRecorder instance
255 static volatile jint _instance_count;
256
257 private:
258 // sorting function, sort records into following order
259 // 1. memory address
260 // 2. allocation type
261 // 3. sequence number
262 static int sort_record_fn(const void* e1, const void* e2);
263
264 debug_only(void check_dup_seq(jint seq) const;)
265 debug_only(void set_generation();)
266 };
267
268 #endif // SHARE_VM_SERVICES_MEM_RECORDER_HPP
|
195 }
196 };
197
198
199
200 #define DEFAULT_RECORDER_PTR_ARRAY_SIZE 512
201
202 class MemRecorder : public CHeapObj<mtNMT|otNMTRecorder> {
203 friend class MemSnapshot;
204 friend class MemTracker;
205 friend class MemTrackWorker;
206
207 protected:
208 // the array that holds memory records
209 MemPointerArray* _pointer_records;
210
211 private:
212 // used for linked list
213 MemRecorder* _next;
214 // active recorder can only record a certain generation data
215 unsigned long _generation;
216
217 protected:
218 _NOINLINE_ MemRecorder();
219 ~MemRecorder();
220
221 // record a memory operation
222 bool record(address addr, MEMFLAGS flags, size_t size, address caller_pc = 0);
223
224 // linked list support
225 inline void set_next(MemRecorder* rec) {
226 _next = rec;
227 }
228
229 inline MemRecorder* next() const {
230 return _next;
231 }
232
233 // if the recorder is full
234 inline bool is_full() const {
235 assert(_pointer_records != NULL, "just check");
236 return _pointer_records->is_full();
237 }
238
239 // if running out of memory when initializing recorder's internal
240 // data
241 inline bool out_of_memory() const {
242 return (_pointer_records == NULL ||
243 _pointer_records->out_of_memory());
244 }
245
246 inline void clear() {
247 assert(_pointer_records != NULL, "Just check");
248 _pointer_records->clear();
249 }
250
251 SequencedRecordIterator pointer_itr();
252
253 // return the generation of this recorder which it belongs to
254 unsigned long get_generation() const { return _generation; }
255 protected:
256 // number of MemRecorder instance
257 static volatile jint _instance_count;
258
259 private:
260 // sorting function, sort records into following order
261 // 1. memory address
262 // 2. allocation type
263 // 3. sequence number
264 static int sort_record_fn(const void* e1, const void* e2);
265
266 debug_only(void check_dup_seq(jint seq) const;)
267 void set_generation();
268 };
269
270 #endif // SHARE_VM_SERVICES_MEM_RECORDER_HPP
|