< prev index next >

src/share/vm/jfr/leakprofiler/sampling/objectSampler.cpp

Print this page
rev 9464 : PR for JDK8

*** 126,168 **** } } // We were successful in acquiring the try lock and have been selected for adding a sample. // Go ahead with installing our previously taken stacktrace into the stacktrace repository. ! // traceid ObjectSampler::stacktrace_id(const JfrStackTrace* stacktrace, JavaThread* thread) { assert(stacktrace != NULL, "invariant"); assert(stacktrace->hash() != 0, "invariant"); ! const traceid stacktrace_id = JfrStackTraceRepository::add(stacktrace, thread); thread->jfr_thread_local()->set_cached_stack_trace_id(stacktrace_id, stacktrace->hash()); return stacktrace_id; } void ObjectSampler::sample(HeapWord* obj, size_t allocated, JavaThread* thread) { assert(thread != NULL, "invariant"); assert(is_created(), "invariant"); const traceid thread_id = get_thread_id(thread); if (thread_id == 0) { return; } const JfrThreadLocal* const tl = thread->jfr_thread_local(); JfrStackTrace stacktrace(tl->stackframes(), tl->stackdepth()); fill_stacktrace(&stacktrace, thread); // try enter critical section JfrTryLock tryLock(&_lock); if (!tryLock.has_lock()) { if (LogJFR && Verbose) tty->print_cr("Skipping old object sample due to lock contention"); return; } ! instance().add(obj, allocated, thread_id, &stacktrace, thread); } ! void ObjectSampler::add(HeapWord* obj, size_t allocated, traceid thread_id, JfrStackTrace* stacktrace, JavaThread* thread) { ! assert(stacktrace != NULL, "invariant"); assert(thread_id != 0, "invariant"); assert(thread != NULL, "invariant"); assert(thread->jfr_thread_local()->has_thread_checkpoint(), "invariant"); if (_dead_samples) { --- 126,195 ---- } } // We were successful in acquiring the try lock and have been selected for adding a sample. // Go ahead with installing our previously taken stacktrace into the stacktrace repository. ! ! // TODO: record_for_leak_profiler replaces this function because it's doing ! // the JfrStackTraceRepository::add in leak_profile instance and set_cached_stack_trace_id. ! traceid ObjectSampler::stacktrace_id(const JfrStackTrace* stacktrace, JavaThread* thread) { assert(stacktrace != NULL, "invariant"); assert(stacktrace->hash() != 0, "invariant"); ! const traceid stacktrace_id = JfrStackTraceRepository::add_for_leak_profiler(stacktrace, thread); thread->jfr_thread_local()->set_cached_stack_trace_id(stacktrace_id, stacktrace->hash()); return stacktrace_id; } + class RecordStackTrace { + private: + JavaThread* _jt; + JfrStackTrace* _stacktrace; + bool _enabled; + public: + RecordStackTrace(JavaThread* jt, JfrStackTrace* st) : _jt(jt), + _stacktrace(st), + _enabled(JfrEventSetting::has_stacktrace(EventOldObjectSample::eventId)) { + if (_enabled) { + //tty->print_cr("objectSampler.cpp | ", st->) + JfrStackTraceRepository::record_for_leak_profiler(jt, st); + } + } + ~RecordStackTrace() { + if (_enabled) { + _jt->jfr_thread_local()->clear_cached_stack_trace(); + } + } + }; + void ObjectSampler::sample(HeapWord* obj, size_t allocated, JavaThread* thread) { assert(thread != NULL, "invariant"); assert(is_created(), "invariant"); const traceid thread_id = get_thread_id(thread); if (thread_id == 0) { return; } + const JfrThreadLocal* const tl = thread->jfr_thread_local(); JfrStackTrace stacktrace(tl->stackframes(), tl->stackdepth()); fill_stacktrace(&stacktrace, thread); + RecordStackTrace rst(thread, &stacktrace); + // try enter critical section JfrTryLock tryLock(&_lock); if (!tryLock.has_lock()) { if (LogJFR && Verbose) tty->print_cr("Skipping old object sample due to lock contention"); return; } ! instance().add(obj, allocated, thread_id/*, &stacktrace*/, thread); } ! void ObjectSampler::add(HeapWord* obj, size_t allocated, traceid thread_id/*, JfrStackTrace* stacktrace*/, JavaThread* thread) { ! //assert(stacktrace != NULL, "invariant"); assert(thread_id != 0, "invariant"); assert(thread != NULL, "invariant"); assert(thread->jfr_thread_local()->has_thread_checkpoint(), "invariant"); if (_dead_samples) {
*** 187,201 **** assert(sample != NULL, "invariant"); sample->set_thread_id(thread_id); sample->set_thread_checkpoint(thread->jfr_thread_local()->thread_checkpoint()); const unsigned int stacktrace_hash = stacktrace->hash(); if (stacktrace_hash != 0) { sample->set_stack_trace_id(stacktrace_id(stacktrace, thread)); sample->set_stack_trace_hash(stacktrace_hash); ! } sample->set_span(allocated); sample->set_object((oop)obj); sample->set_allocated(allocated); sample->set_allocation_time(JfrTicks::now()); --- 214,238 ---- assert(sample != NULL, "invariant"); sample->set_thread_id(thread_id); sample->set_thread_checkpoint(thread->jfr_thread_local()->thread_checkpoint()); + const JfrThreadLocal* const tl = thread->jfr_thread_local(); + const unsigned int stacktrace_hash = tl->cached_stack_trace_hash(); + if (stacktrace_hash != 0) { + //tty->print_cr("objectSampler.cpp | Set sample stack trace id(%ld)/hash(%d)", tl->cached_stack_trace_id(), stacktrace_hash); + sample->set_stack_trace_id(tl->cached_stack_trace_id()); + sample->set_stack_trace_hash(stacktrace_hash); + } + /* const unsigned int stacktrace_hash = stacktrace->hash(); if (stacktrace_hash != 0) { + // Only place where stacktrace_id() is used + // stacktrace_id() sample->set_stack_trace_id(stacktrace_id(stacktrace, thread)); sample->set_stack_trace_hash(stacktrace_hash); ! }*/ sample->set_span(allocated); sample->set_object((oop)obj); sample->set_allocated(allocated); sample->set_allocation_time(JfrTicks::now());
< prev index next >