Path: blob/master/src/hotspot/share/services/threadService.cpp
41145 views
/*1* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "classfile/systemDictionary.hpp"26#include "classfile/vmClasses.hpp"27#include "classfile/vmSymbols.hpp"28#include "gc/shared/oopStorageSet.hpp"29#include "memory/allocation.hpp"30#include "memory/heapInspection.hpp"31#include "memory/oopFactory.hpp"32#include "memory/resourceArea.hpp"33#include "memory/universe.hpp"34#include "oops/instanceKlass.hpp"35#include "oops/klass.inline.hpp"36#include "oops/objArrayKlass.hpp"37#include "oops/objArrayOop.inline.hpp"38#include "oops/oop.inline.hpp"39#include "oops/oopHandle.inline.hpp"40#include "prims/jvmtiRawMonitor.hpp"41#include "runtime/atomic.hpp"42#include "runtime/handles.inline.hpp"43#include "runtime/init.hpp"44#include "runtime/objectMonitor.inline.hpp"45#include "runtime/thread.inline.hpp"46#include "runtime/threadSMR.inline.hpp"47#include "runtime/vframe.hpp"48#include "runtime/vmThread.hpp"49#include "runtime/vmOperations.hpp"50#include "services/threadService.hpp"5152// TODO: we need to define a naming convention for perf counters53// to distinguish counters for:54// - standard JSR174 use55// - Hotspot extension (public and committed)56// - Hotspot extension (private/internal and uncommitted)5758// Default is disabled.59bool ThreadService::_thread_monitoring_contention_enabled = false;60bool ThreadService::_thread_cpu_time_enabled = false;61bool ThreadService::_thread_allocated_memory_enabled = false;6263PerfCounter* ThreadService::_total_threads_count = NULL;64PerfVariable* ThreadService::_live_threads_count = NULL;65PerfVariable* ThreadService::_peak_threads_count = NULL;66PerfVariable* ThreadService::_daemon_threads_count = NULL;67volatile int ThreadService::_atomic_threads_count = 0;68volatile int ThreadService::_atomic_daemon_threads_count = 0;6970ThreadDumpResult* ThreadService::_threaddump_list = NULL;7172static const int INITIAL_ARRAY_SIZE = 10;7374// OopStorage for thread stack sampling75static OopStorage* _thread_service_storage = NULL;7677void ThreadService::init() {78EXCEPTION_MARK;7980// These counters are for java.lang.management API support.81// They are created even if -XX:-UsePerfData is set and in82// that case, they will be allocated on C heap.8384_total_threads_count =85PerfDataManager::create_counter(JAVA_THREADS, "started",86PerfData::U_Events, CHECK);8788_live_threads_count =89PerfDataManager::create_variable(JAVA_THREADS, "live",90PerfData::U_None, CHECK);9192_peak_threads_count =93PerfDataManager::create_variable(JAVA_THREADS, "livePeak",94PerfData::U_None, CHECK);9596_daemon_threads_count =97PerfDataManager::create_variable(JAVA_THREADS, "daemon",98PerfData::U_None, CHECK);99100if (os::is_thread_cpu_time_supported()) {101_thread_cpu_time_enabled = true;102}103104_thread_allocated_memory_enabled = true; // Always on, so enable it105106// Initialize OopStorage for thread stack sampling walking107_thread_service_storage = OopStorageSet::create_strong("ThreadService OopStorage",108mtServiceability);109}110111void ThreadService::reset_peak_thread_count() {112// Acquire the lock to update the peak thread count113// to synchronize with thread addition and removal.114MutexLocker mu(Threads_lock);115_peak_threads_count->set_value(get_live_thread_count());116}117118static bool is_hidden_thread(JavaThread *thread) {119// hide VM internal or JVMTI agent threads120return thread->is_hidden_from_external_view() || thread->is_jvmti_agent_thread();121}122123void ThreadService::add_thread(JavaThread* thread, bool daemon) {124assert(Threads_lock->owned_by_self(), "must have threads lock");125126// Do not count hidden threads127if (is_hidden_thread(thread)) {128return;129}130131_total_threads_count->inc();132_live_threads_count->inc();133Atomic::inc(&_atomic_threads_count);134int count = _atomic_threads_count;135136if (count > _peak_threads_count->get_value()) {137_peak_threads_count->set_value(count);138}139140if (daemon) {141_daemon_threads_count->inc();142Atomic::inc(&_atomic_daemon_threads_count);143}144}145146void ThreadService::decrement_thread_counts(JavaThread* jt, bool daemon) {147Atomic::dec(&_atomic_threads_count);148149if (daemon) {150Atomic::dec(&_atomic_daemon_threads_count);151}152}153154void ThreadService::remove_thread(JavaThread* thread, bool daemon) {155assert(Threads_lock->owned_by_self(), "must have threads lock");156157// Do not count hidden threads158if (is_hidden_thread(thread)) {159return;160}161162assert(!thread->is_terminated(), "must not be terminated");163if (!thread->is_exiting()) {164// JavaThread::exit() skipped calling current_thread_exiting()165decrement_thread_counts(thread, daemon);166}167168int daemon_count = _atomic_daemon_threads_count;169int count = _atomic_threads_count;170171// Counts are incremented at the same time, but atomic counts are172// decremented earlier than perf counts.173assert(_live_threads_count->get_value() > count,174"thread count mismatch %d : %d",175(int)_live_threads_count->get_value(), count);176177_live_threads_count->dec(1);178if (daemon) {179assert(_daemon_threads_count->get_value() > daemon_count,180"thread count mismatch %d : %d",181(int)_daemon_threads_count->get_value(), daemon_count);182183_daemon_threads_count->dec(1);184}185186// Counts are incremented at the same time, but atomic counts are187// decremented earlier than perf counts.188assert(_daemon_threads_count->get_value() >= daemon_count,189"thread count mismatch %d : %d",190(int)_daemon_threads_count->get_value(), daemon_count);191assert(_live_threads_count->get_value() >= count,192"thread count mismatch %d : %d",193(int)_live_threads_count->get_value(), count);194assert(_live_threads_count->get_value() > 0 ||195(_live_threads_count->get_value() == 0 && count == 0 &&196_daemon_threads_count->get_value() == 0 && daemon_count == 0),197"thread counts should reach 0 at the same time, live %d,%d daemon %d,%d",198(int)_live_threads_count->get_value(), count,199(int)_daemon_threads_count->get_value(), daemon_count);200assert(_daemon_threads_count->get_value() > 0 ||201(_daemon_threads_count->get_value() == 0 && daemon_count == 0),202"thread counts should reach 0 at the same time, daemon %d,%d",203(int)_daemon_threads_count->get_value(), daemon_count);204}205206void ThreadService::current_thread_exiting(JavaThread* jt, bool daemon) {207// Do not count hidden threads208if (is_hidden_thread(jt)) {209return;210}211212assert(jt == JavaThread::current(), "Called by current thread");213assert(!jt->is_terminated() && jt->is_exiting(), "must be exiting");214215decrement_thread_counts(jt, daemon);216}217218// FIXME: JVMTI should call this function219Handle ThreadService::get_current_contended_monitor(JavaThread* thread) {220assert(thread != NULL, "should be non-NULL");221debug_only(Thread::check_for_dangling_thread_pointer(thread);)222223// This function can be called on a target JavaThread that is not224// the caller and we are not at a safepoint. So it is possible for225// the waiting or pending condition to be over/stale and for the226// first stage of async deflation to clear the object field in227// the ObjectMonitor. It is also possible for the object to be228// inflated again and to be associated with a completely different229// ObjectMonitor by the time this object reference is processed230// by the caller.231ObjectMonitor *wait_obj = thread->current_waiting_monitor();232233oop obj = NULL;234if (wait_obj != NULL) {235// thread is doing an Object.wait() call236obj = wait_obj->object();237} else {238ObjectMonitor *enter_obj = thread->current_pending_monitor();239if (enter_obj != NULL) {240// thread is trying to enter() an ObjectMonitor.241obj = enter_obj->object();242}243}244245Handle h(Thread::current(), obj);246return h;247}248249bool ThreadService::set_thread_monitoring_contention(bool flag) {250MutexLocker m(Management_lock);251252bool prev = _thread_monitoring_contention_enabled;253_thread_monitoring_contention_enabled = flag;254255return prev;256}257258bool ThreadService::set_thread_cpu_time_enabled(bool flag) {259MutexLocker m(Management_lock);260261bool prev = _thread_cpu_time_enabled;262_thread_cpu_time_enabled = flag;263264return prev;265}266267bool ThreadService::set_thread_allocated_memory_enabled(bool flag) {268MutexLocker m(Management_lock);269270bool prev = _thread_allocated_memory_enabled;271_thread_allocated_memory_enabled = flag;272273return prev;274}275276void ThreadService::metadata_do(void f(Metadata*)) {277for (ThreadDumpResult* dump = _threaddump_list; dump != NULL; dump = dump->next()) {278dump->metadata_do(f);279}280}281282void ThreadService::add_thread_dump(ThreadDumpResult* dump) {283MutexLocker ml(Management_lock);284if (_threaddump_list == NULL) {285_threaddump_list = dump;286} else {287dump->set_next(_threaddump_list);288_threaddump_list = dump;289}290}291292void ThreadService::remove_thread_dump(ThreadDumpResult* dump) {293MutexLocker ml(Management_lock);294295ThreadDumpResult* prev = NULL;296bool found = false;297for (ThreadDumpResult* d = _threaddump_list; d != NULL; prev = d, d = d->next()) {298if (d == dump) {299if (prev == NULL) {300_threaddump_list = dump->next();301} else {302prev->set_next(dump->next());303}304found = true;305break;306}307}308assert(found, "The threaddump result to be removed must exist.");309}310311// Dump stack trace of threads specified in the given threads array.312// Returns StackTraceElement[][] each element is the stack trace of a thread in313// the corresponding entry in the given threads array314Handle ThreadService::dump_stack_traces(GrowableArray<instanceHandle>* threads,315int num_threads,316TRAPS) {317assert(num_threads > 0, "just checking");318319ThreadDumpResult dump_result;320VM_ThreadDump op(&dump_result,321threads,322num_threads,323-1, /* entire stack */324false, /* with locked monitors */325false /* with locked synchronizers */);326VMThread::execute(&op);327328// Allocate the resulting StackTraceElement[][] object329330ResourceMark rm(THREAD);331Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_StackTraceElement_array(), true, CHECK_NH);332ObjArrayKlass* ik = ObjArrayKlass::cast(k);333objArrayOop r = oopFactory::new_objArray(ik, num_threads, CHECK_NH);334objArrayHandle result_obj(THREAD, r);335336int num_snapshots = dump_result.num_snapshots();337assert(num_snapshots == num_threads, "Must have num_threads thread snapshots");338assert(num_snapshots == 0 || dump_result.t_list_has_been_set(), "ThreadsList must have been set if we have a snapshot");339int i = 0;340for (ThreadSnapshot* ts = dump_result.snapshots(); ts != NULL; i++, ts = ts->next()) {341ThreadStackTrace* stacktrace = ts->get_stack_trace();342if (stacktrace == NULL) {343// No stack trace344result_obj->obj_at_put(i, NULL);345} else {346// Construct an array of java/lang/StackTraceElement object347Handle backtrace_h = stacktrace->allocate_fill_stack_trace_element_array(CHECK_NH);348result_obj->obj_at_put(i, backtrace_h());349}350}351352return result_obj;353}354355void ThreadService::reset_contention_count_stat(JavaThread* thread) {356ThreadStatistics* stat = thread->get_thread_stat();357if (stat != NULL) {358stat->reset_count_stat();359}360}361362void ThreadService::reset_contention_time_stat(JavaThread* thread) {363ThreadStatistics* stat = thread->get_thread_stat();364if (stat != NULL) {365stat->reset_time_stat();366}367}368369// Find deadlocks involving raw monitors, object monitors and concurrent locks370// if concurrent_locks is true.371DeadlockCycle* ThreadService::find_deadlocks_at_safepoint(ThreadsList * t_list, bool concurrent_locks) {372assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");373374// This code was modified from the original Threads::find_deadlocks code.375int globalDfn = 0, thisDfn;376ObjectMonitor* waitingToLockMonitor = NULL;377JvmtiRawMonitor* waitingToLockRawMonitor = NULL;378oop waitingToLockBlocker = NULL;379bool blocked_on_monitor = false;380JavaThread *currentThread, *previousThread;381int num_deadlocks = 0;382383// Initialize the depth-first-number for each JavaThread.384JavaThreadIterator jti(t_list);385for (JavaThread* jt = jti.first(); jt != NULL; jt = jti.next()) {386jt->set_depth_first_number(-1);387}388389DeadlockCycle* deadlocks = NULL;390DeadlockCycle* last = NULL;391DeadlockCycle* cycle = new DeadlockCycle();392for (JavaThread* jt = jti.first(); jt != NULL; jt = jti.next()) {393if (jt->depth_first_number() >= 0) {394// this thread was already visited395continue;396}397398thisDfn = globalDfn;399jt->set_depth_first_number(globalDfn++);400previousThread = jt;401currentThread = jt;402403cycle->reset();404405// The ObjectMonitor* can't be async deflated since we are at a safepoint.406// When there is a deadlock, all the monitors involved in the dependency407// cycle must be contended and heavyweight. So we only care about the408// heavyweight monitor a thread is waiting to lock.409waitingToLockMonitor = jt->current_pending_monitor();410// JVM TI raw monitors can also be involved in deadlocks, and we can be411// waiting to lock both a raw monitor and ObjectMonitor at the same time.412// It isn't clear how to make deadlock detection work correctly if that413// happens.414waitingToLockRawMonitor = jt->current_pending_raw_monitor();415416if (concurrent_locks) {417waitingToLockBlocker = jt->current_park_blocker();418}419420while (waitingToLockMonitor != NULL ||421waitingToLockRawMonitor != NULL ||422waitingToLockBlocker != NULL) {423cycle->add_thread(currentThread);424// Give preference to the raw monitor425if (waitingToLockRawMonitor != NULL) {426Thread* owner = waitingToLockRawMonitor->owner();427if (owner != NULL && // the raw monitor could be released at any time428owner->is_Java_thread()) {429currentThread = owner->as_Java_thread();430}431} else if (waitingToLockMonitor != NULL) {432address currentOwner = (address)waitingToLockMonitor->owner();433if (currentOwner != NULL) {434currentThread = Threads::owning_thread_from_monitor_owner(t_list,435currentOwner);436if (currentThread == NULL) {437// This function is called at a safepoint so the JavaThread438// that owns waitingToLockMonitor should be findable, but439// if it is not findable, then the previous currentThread is440// blocked permanently. We record this as a deadlock.441num_deadlocks++;442443cycle->set_deadlock(true);444445// add this cycle to the deadlocks list446if (deadlocks == NULL) {447deadlocks = cycle;448} else {449last->set_next(cycle);450}451last = cycle;452cycle = new DeadlockCycle();453break;454}455}456} else {457if (concurrent_locks) {458if (waitingToLockBlocker->is_a(vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass())) {459oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker);460// This JavaThread (if there is one) is protected by the461// ThreadsListSetter in VM_FindDeadlocks::doit().462currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL;463} else {464currentThread = NULL;465}466}467}468469if (currentThread == NULL) {470// No dependency on another thread471break;472}473if (currentThread->depth_first_number() < 0) {474// First visit to this thread475currentThread->set_depth_first_number(globalDfn++);476} else if (currentThread->depth_first_number() < thisDfn) {477// Thread already visited, and not on a (new) cycle478break;479} else if (currentThread == previousThread) {480// Self-loop, ignore481break;482} else {483// We have a (new) cycle484num_deadlocks++;485486cycle->set_deadlock(true);487488// add this cycle to the deadlocks list489if (deadlocks == NULL) {490deadlocks = cycle;491} else {492last->set_next(cycle);493}494last = cycle;495cycle = new DeadlockCycle();496break;497}498previousThread = currentThread;499waitingToLockMonitor = (ObjectMonitor*)currentThread->current_pending_monitor();500if (concurrent_locks) {501waitingToLockBlocker = currentThread->current_park_blocker();502}503}504505}506delete cycle;507return deadlocks;508}509510ThreadDumpResult::ThreadDumpResult() : _num_threads(0), _num_snapshots(0), _snapshots(NULL), _last(NULL), _next(NULL), _setter() {511512// Create a new ThreadDumpResult object and append to the list.513// If GC happens before this function returns, Method*514// in the stack trace will be visited.515ThreadService::add_thread_dump(this);516}517518ThreadDumpResult::ThreadDumpResult(int num_threads) : _num_threads(num_threads), _num_snapshots(0), _snapshots(NULL), _last(NULL), _next(NULL), _setter() {519// Create a new ThreadDumpResult object and append to the list.520// If GC happens before this function returns, oops521// will be visited.522ThreadService::add_thread_dump(this);523}524525ThreadDumpResult::~ThreadDumpResult() {526ThreadService::remove_thread_dump(this);527528// free all the ThreadSnapshot objects created during529// the VM_ThreadDump operation530ThreadSnapshot* ts = _snapshots;531while (ts != NULL) {532ThreadSnapshot* p = ts;533ts = ts->next();534delete p;535}536}537538ThreadSnapshot* ThreadDumpResult::add_thread_snapshot() {539ThreadSnapshot* ts = new ThreadSnapshot();540link_thread_snapshot(ts);541return ts;542}543544ThreadSnapshot* ThreadDumpResult::add_thread_snapshot(JavaThread* thread) {545ThreadSnapshot* ts = new ThreadSnapshot();546link_thread_snapshot(ts);547ts->initialize(t_list(), thread);548return ts;549}550551void ThreadDumpResult::link_thread_snapshot(ThreadSnapshot* ts) {552assert(_num_threads == 0 || _num_snapshots < _num_threads,553"_num_snapshots must be less than _num_threads");554_num_snapshots++;555if (_snapshots == NULL) {556_snapshots = ts;557} else {558_last->set_next(ts);559}560_last = ts;561}562563void ThreadDumpResult::metadata_do(void f(Metadata*)) {564for (ThreadSnapshot* ts = _snapshots; ts != NULL; ts = ts->next()) {565ts->metadata_do(f);566}567}568569ThreadsList* ThreadDumpResult::t_list() {570return _setter.list();571}572573StackFrameInfo::StackFrameInfo(javaVFrame* jvf, bool with_lock_info) {574_method = jvf->method();575_bci = jvf->bci();576_class_holder = OopHandle(_thread_service_storage, _method->method_holder()->klass_holder());577_locked_monitors = NULL;578if (with_lock_info) {579Thread* current_thread = Thread::current();580ResourceMark rm(current_thread);581HandleMark hm(current_thread);582GrowableArray<MonitorInfo*>* list = jvf->locked_monitors();583int length = list->length();584if (length > 0) {585_locked_monitors = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<OopHandle>(length, mtServiceability);586for (int i = 0; i < length; i++) {587MonitorInfo* monitor = list->at(i);588assert(monitor->owner() != NULL, "This monitor must have an owning object");589_locked_monitors->append(OopHandle(_thread_service_storage, monitor->owner()));590}591}592}593}594595StackFrameInfo::~StackFrameInfo() {596if (_locked_monitors != NULL) {597for (int i = 0; i < _locked_monitors->length(); i++) {598_locked_monitors->at(i).release(_thread_service_storage);599}600delete _locked_monitors;601}602_class_holder.release(_thread_service_storage);603}604605void StackFrameInfo::metadata_do(void f(Metadata*)) {606f(_method);607}608609void StackFrameInfo::print_on(outputStream* st) const {610ResourceMark rm;611java_lang_Throwable::print_stack_element(st, method(), bci());612int len = (_locked_monitors != NULL ? _locked_monitors->length() : 0);613for (int i = 0; i < len; i++) {614oop o = _locked_monitors->at(i).resolve();615st->print_cr("\t- locked <" INTPTR_FORMAT "> (a %s)", p2i(o), o->klass()->external_name());616}617618}619620// Iterate through monitor cache to find JNI locked monitors621class InflatedMonitorsClosure: public MonitorClosure {622private:623ThreadStackTrace* _stack_trace;624Thread* _thread;625public:626InflatedMonitorsClosure(Thread* t, ThreadStackTrace* st) {627_thread = t;628_stack_trace = st;629}630void do_monitor(ObjectMonitor* mid) {631if (mid->owner() == _thread) {632oop object = mid->object();633if (!_stack_trace->is_owned_monitor_on_stack(object)) {634_stack_trace->add_jni_locked_monitor(object);635}636}637}638};639640ThreadStackTrace::ThreadStackTrace(JavaThread* t, bool with_locked_monitors) {641_thread = t;642_frames = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<StackFrameInfo*>(INITIAL_ARRAY_SIZE, mtServiceability);643_depth = 0;644_with_locked_monitors = with_locked_monitors;645if (_with_locked_monitors) {646_jni_locked_monitors = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<OopHandle>(INITIAL_ARRAY_SIZE, mtServiceability);647} else {648_jni_locked_monitors = NULL;649}650}651652void ThreadStackTrace::add_jni_locked_monitor(oop object) {653_jni_locked_monitors->append(OopHandle(_thread_service_storage, object));654}655656ThreadStackTrace::~ThreadStackTrace() {657for (int i = 0; i < _frames->length(); i++) {658delete _frames->at(i);659}660delete _frames;661if (_jni_locked_monitors != NULL) {662for (int i = 0; i < _jni_locked_monitors->length(); i++) {663_jni_locked_monitors->at(i).release(_thread_service_storage);664}665delete _jni_locked_monitors;666}667}668669void ThreadStackTrace::dump_stack_at_safepoint(int maxDepth) {670assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");671672if (_thread->has_last_Java_frame()) {673RegisterMap reg_map(_thread);674vframe* start_vf = _thread->last_java_vframe(®_map);675int count = 0;676for (vframe* f = start_vf; f; f = f->sender() ) {677if (maxDepth >= 0 && count == maxDepth) {678// Skip frames if more than maxDepth679break;680}681if (f->is_java_frame()) {682javaVFrame* jvf = javaVFrame::cast(f);683add_stack_frame(jvf);684count++;685} else {686// Ignore non-Java frames687}688}689}690691if (_with_locked_monitors) {692// Iterate inflated monitors and find monitors locked by this thread693// not found in the stack694InflatedMonitorsClosure imc(_thread, this);695ObjectSynchronizer::monitors_iterate(&imc);696}697}698699700bool ThreadStackTrace::is_owned_monitor_on_stack(oop object) {701assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");702703bool found = false;704int num_frames = get_stack_depth();705for (int depth = 0; depth < num_frames; depth++) {706StackFrameInfo* frame = stack_frame_at(depth);707int len = frame->num_locked_monitors();708GrowableArray<OopHandle>* locked_monitors = frame->locked_monitors();709for (int j = 0; j < len; j++) {710oop monitor = locked_monitors->at(j).resolve();711assert(monitor != NULL, "must be a Java object");712if (monitor == object) {713found = true;714break;715}716}717}718return found;719}720721Handle ThreadStackTrace::allocate_fill_stack_trace_element_array(TRAPS) {722InstanceKlass* ik = vmClasses::StackTraceElement_klass();723assert(ik != NULL, "must be loaded in 1.4+");724725// Allocate an array of java/lang/StackTraceElement object726objArrayOop ste = oopFactory::new_objArray(ik, _depth, CHECK_NH);727objArrayHandle backtrace(THREAD, ste);728for (int j = 0; j < _depth; j++) {729StackFrameInfo* frame = _frames->at(j);730methodHandle mh(THREAD, frame->method());731oop element = java_lang_StackTraceElement::create(mh, frame->bci(), CHECK_NH);732backtrace->obj_at_put(j, element);733}734return backtrace;735}736737void ThreadStackTrace::add_stack_frame(javaVFrame* jvf) {738StackFrameInfo* frame = new StackFrameInfo(jvf, _with_locked_monitors);739_frames->append(frame);740_depth++;741}742743void ThreadStackTrace::metadata_do(void f(Metadata*)) {744int length = _frames->length();745for (int i = 0; i < length; i++) {746_frames->at(i)->metadata_do(f);747}748}749750751ConcurrentLocksDump::~ConcurrentLocksDump() {752if (_retain_map_on_free) {753return;754}755756for (ThreadConcurrentLocks* t = _map; t != NULL;) {757ThreadConcurrentLocks* tcl = t;758t = t->next();759delete tcl;760}761}762763void ConcurrentLocksDump::dump_at_safepoint() {764// dump all locked concurrent locks765assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");766767GrowableArray<oop>* aos_objects = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<oop>(INITIAL_ARRAY_SIZE, mtServiceability);768769// Find all instances of AbstractOwnableSynchronizer770HeapInspection::find_instances_at_safepoint(vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass(),771aos_objects);772// Build a map of thread to its owned AQS locks773build_map(aos_objects);774775delete aos_objects;776}777778779// build a map of JavaThread to all its owned AbstractOwnableSynchronizer780void ConcurrentLocksDump::build_map(GrowableArray<oop>* aos_objects) {781int length = aos_objects->length();782for (int i = 0; i < length; i++) {783oop o = aos_objects->at(i);784oop owner_thread_obj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(o);785if (owner_thread_obj != NULL) {786// See comments in ThreadConcurrentLocks to see how this787// JavaThread* is protected.788JavaThread* thread = java_lang_Thread::thread(owner_thread_obj);789assert(o->is_instance(), "Must be an instanceOop");790add_lock(thread, (instanceOop) o);791}792}793}794795void ConcurrentLocksDump::add_lock(JavaThread* thread, instanceOop o) {796ThreadConcurrentLocks* tcl = thread_concurrent_locks(thread);797if (tcl != NULL) {798tcl->add_lock(o);799return;800}801802// First owned lock found for this thread803tcl = new ThreadConcurrentLocks(thread);804tcl->add_lock(o);805if (_map == NULL) {806_map = tcl;807} else {808_last->set_next(tcl);809}810_last = tcl;811}812813ThreadConcurrentLocks* ConcurrentLocksDump::thread_concurrent_locks(JavaThread* thread) {814for (ThreadConcurrentLocks* tcl = _map; tcl != NULL; tcl = tcl->next()) {815if (tcl->java_thread() == thread) {816return tcl;817}818}819return NULL;820}821822void ConcurrentLocksDump::print_locks_on(JavaThread* t, outputStream* st) {823st->print_cr(" Locked ownable synchronizers:");824ThreadConcurrentLocks* tcl = thread_concurrent_locks(t);825GrowableArray<OopHandle>* locks = (tcl != NULL ? tcl->owned_locks() : NULL);826if (locks == NULL || locks->is_empty()) {827st->print_cr("\t- None");828st->cr();829return;830}831832for (int i = 0; i < locks->length(); i++) {833oop obj = locks->at(i).resolve();834st->print_cr("\t- <" INTPTR_FORMAT "> (a %s)", p2i(obj), obj->klass()->external_name());835}836st->cr();837}838839ThreadConcurrentLocks::ThreadConcurrentLocks(JavaThread* thread) {840_thread = thread;841_owned_locks = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<OopHandle>(INITIAL_ARRAY_SIZE, mtServiceability);842_next = NULL;843}844845ThreadConcurrentLocks::~ThreadConcurrentLocks() {846for (int i = 0; i < _owned_locks->length(); i++) {847_owned_locks->at(i).release(_thread_service_storage);848}849delete _owned_locks;850}851852void ThreadConcurrentLocks::add_lock(instanceOop o) {853_owned_locks->append(OopHandle(_thread_service_storage, o));854}855856ThreadStatistics::ThreadStatistics() {857_contended_enter_count = 0;858_monitor_wait_count = 0;859_sleep_count = 0;860_count_pending_reset = false;861_timer_pending_reset = false;862memset((void*) _perf_recursion_counts, 0, sizeof(_perf_recursion_counts));863}864865oop ThreadSnapshot::threadObj() const { return _threadObj.resolve(); }866867void ThreadSnapshot::initialize(ThreadsList * t_list, JavaThread* thread) {868_thread = thread;869oop threadObj = thread->threadObj();870_threadObj = OopHandle(_thread_service_storage, threadObj);871872ThreadStatistics* stat = thread->get_thread_stat();873_contended_enter_ticks = stat->contended_enter_ticks();874_contended_enter_count = stat->contended_enter_count();875_monitor_wait_ticks = stat->monitor_wait_ticks();876_monitor_wait_count = stat->monitor_wait_count();877_sleep_ticks = stat->sleep_ticks();878_sleep_count = stat->sleep_count();879880_thread_status = java_lang_Thread::get_thread_status(threadObj);881_is_suspended = thread->is_suspended();882_is_in_native = (thread->thread_state() == _thread_in_native);883884Handle obj = ThreadService::get_current_contended_monitor(thread);885886oop blocker_object = NULL;887oop blocker_object_owner = NULL;888889if (_thread_status == JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER ||890_thread_status == JavaThreadStatus::IN_OBJECT_WAIT ||891_thread_status == JavaThreadStatus::IN_OBJECT_WAIT_TIMED) {892893if (obj() == NULL) {894// monitor no longer exists; thread is not blocked895_thread_status = JavaThreadStatus::RUNNABLE;896} else {897blocker_object = obj();898JavaThread* owner = ObjectSynchronizer::get_lock_owner(t_list, obj);899if ((owner == NULL && _thread_status == JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER)900|| (owner != NULL && owner->is_attaching_via_jni())) {901// ownership information of the monitor is not available902// (may no longer be owned or releasing to some other thread)903// make this thread in RUNNABLE state.904// And when the owner thread is in attaching state, the java thread905// is not completely initialized. For example thread name and id906// and may not be set, so hide the attaching thread.907_thread_status = JavaThreadStatus::RUNNABLE;908blocker_object = NULL;909} else if (owner != NULL) {910blocker_object_owner = owner->threadObj();911}912}913}914915// Support for JSR-166 locks916if (_thread_status == JavaThreadStatus::PARKED || _thread_status == JavaThreadStatus::PARKED_TIMED) {917blocker_object = thread->current_park_blocker();918if (blocker_object != NULL && blocker_object->is_a(vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass())) {919blocker_object_owner = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(blocker_object);920}921}922923if (blocker_object != NULL) {924_blocker_object = OopHandle(_thread_service_storage, blocker_object);925}926if (blocker_object_owner != NULL) {927_blocker_object_owner = OopHandle(_thread_service_storage, blocker_object_owner);928}929}930931oop ThreadSnapshot::blocker_object() const { return _blocker_object.resolve(); }932oop ThreadSnapshot::blocker_object_owner() const { return _blocker_object_owner.resolve(); }933934ThreadSnapshot::~ThreadSnapshot() {935_blocker_object.release(_thread_service_storage);936_blocker_object_owner.release(_thread_service_storage);937_threadObj.release(_thread_service_storage);938939delete _stack_trace;940delete _concurrent_locks;941}942943void ThreadSnapshot::dump_stack_at_safepoint(int max_depth, bool with_locked_monitors) {944_stack_trace = new ThreadStackTrace(_thread, with_locked_monitors);945_stack_trace->dump_stack_at_safepoint(max_depth);946}947948949void ThreadSnapshot::metadata_do(void f(Metadata*)) {950if (_stack_trace != NULL) {951_stack_trace->metadata_do(f);952}953}954955956DeadlockCycle::DeadlockCycle() {957_is_deadlock = false;958_threads = new (ResourceObj::C_HEAP, mtServiceability) GrowableArray<JavaThread*>(INITIAL_ARRAY_SIZE, mtServiceability);959_next = NULL;960}961962DeadlockCycle::~DeadlockCycle() {963delete _threads;964}965966void DeadlockCycle::print_on_with(ThreadsList * t_list, outputStream* st) const {967st->cr();968st->print_cr("Found one Java-level deadlock:");969st->print("=============================");970971JavaThread* currentThread;972JvmtiRawMonitor* waitingToLockRawMonitor;973oop waitingToLockBlocker;974int len = _threads->length();975for (int i = 0; i < len; i++) {976currentThread = _threads->at(i);977// The ObjectMonitor* can't be async deflated since we are at a safepoint.978ObjectMonitor* waitingToLockMonitor = currentThread->current_pending_monitor();979waitingToLockRawMonitor = currentThread->current_pending_raw_monitor();980waitingToLockBlocker = currentThread->current_park_blocker();981st->cr();982st->print_cr("\"%s\":", currentThread->get_thread_name());983const char* owner_desc = ",\n which is held by";984985// Note: As the JVM TI "monitor contended enter" event callback is executed after ObjectMonitor986// sets the current pending monitor, it is possible to then see a pending raw monitor as well.987if (waitingToLockRawMonitor != NULL) {988st->print(" waiting to lock JVM TI raw monitor " INTPTR_FORMAT, p2i(waitingToLockRawMonitor));989Thread* owner = waitingToLockRawMonitor->owner();990// Could be NULL as the raw monitor could be released at any time if held by non-JavaThread991if (owner != NULL) {992if (owner->is_Java_thread()) {993currentThread = owner->as_Java_thread();994st->print_cr("%s \"%s\"", owner_desc, currentThread->get_thread_name());995} else {996st->print_cr(",\n which has now been released");997}998} else {999st->print_cr("%s non-Java thread=" PTR_FORMAT, owner_desc, p2i(owner));1000}1001}10021003if (waitingToLockMonitor != NULL) {1004st->print(" waiting to lock monitor " INTPTR_FORMAT, p2i(waitingToLockMonitor));1005oop obj = waitingToLockMonitor->object();1006st->print(" (object " INTPTR_FORMAT ", a %s)", p2i(obj),1007obj->klass()->external_name());10081009if (!currentThread->current_pending_monitor_is_from_java()) {1010owner_desc = "\n in JNI, which is held by";1011}1012currentThread = Threads::owning_thread_from_monitor_owner(t_list,1013(address)waitingToLockMonitor->owner());1014if (currentThread == NULL) {1015// The deadlock was detected at a safepoint so the JavaThread1016// that owns waitingToLockMonitor should be findable, but1017// if it is not findable, then the previous currentThread is1018// blocked permanently.1019st->print_cr("%s UNKNOWN_owner_addr=" PTR_FORMAT, owner_desc,1020p2i(waitingToLockMonitor->owner()));1021continue;1022}1023} else {1024st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)",1025p2i(waitingToLockBlocker),1026waitingToLockBlocker->klass()->external_name());1027assert(waitingToLockBlocker->is_a(vmClasses::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass()),1028"Must be an AbstractOwnableSynchronizer");1029oop ownerObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker);1030currentThread = java_lang_Thread::thread(ownerObj);1031assert(currentThread != NULL, "AbstractOwnableSynchronizer owning thread is unexpectedly NULL");1032}1033st->print_cr("%s \"%s\"", owner_desc, currentThread->get_thread_name());1034}10351036st->cr();10371038// Print stack traces1039bool oldJavaMonitorsInStackTrace = JavaMonitorsInStackTrace;1040JavaMonitorsInStackTrace = true;1041st->print_cr("Java stack information for the threads listed above:");1042st->print_cr("===================================================");1043for (int j = 0; j < len; j++) {1044currentThread = _threads->at(j);1045st->print_cr("\"%s\":", currentThread->get_thread_name());1046currentThread->print_stack_on(st);1047}1048JavaMonitorsInStackTrace = oldJavaMonitorsInStackTrace;1049}10501051ThreadsListEnumerator::ThreadsListEnumerator(Thread* cur_thread,1052bool include_jvmti_agent_threads,1053bool include_jni_attaching_threads) {1054assert(cur_thread == Thread::current(), "Check current thread");10551056int init_size = ThreadService::get_live_thread_count();1057_threads_array = new GrowableArray<instanceHandle>(init_size);10581059for (JavaThreadIteratorWithHandle jtiwh; JavaThread *jt = jtiwh.next(); ) {1060// skips JavaThreads in the process of exiting1061// and also skips VM internal JavaThreads1062// Threads in _thread_new or _thread_new_trans state are included.1063// i.e. threads have been started but not yet running.1064if (jt->threadObj() == NULL ||1065jt->is_exiting() ||1066!java_lang_Thread::is_alive(jt->threadObj()) ||1067jt->is_hidden_from_external_view()) {1068continue;1069}10701071// skip agent threads1072if (!include_jvmti_agent_threads && jt->is_jvmti_agent_thread()) {1073continue;1074}10751076// skip jni threads in the process of attaching1077if (!include_jni_attaching_threads && jt->is_attaching_via_jni()) {1078continue;1079}10801081instanceHandle h(cur_thread, (instanceOop) jt->threadObj());1082_threads_array->append(h);1083}1084}108510861087