comparison src/share/vm/services/threadService.cpp @ 8673:5ee250974db9

8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address Summary: Make deadlock detection a little more robust in the case of being unable to find the JavaThread associated with an object lock. Reviewed-by: sla, acorn
author dcubed
date Wed, 27 Feb 2013 15:00:30 -0800
parents d8ce2825b193
children ef748153ee8f
comparison
equal deleted inserted replaced
8671:698b615a1cde 8673:5ee250974db9
1 /* 1 /*
2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
325 waitingToLockBlocker = jt->current_park_blocker(); 325 waitingToLockBlocker = jt->current_park_blocker();
326 } 326 }
327 while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) { 327 while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) {
328 cycle->add_thread(currentThread); 328 cycle->add_thread(currentThread);
329 if (waitingToLockMonitor != NULL) { 329 if (waitingToLockMonitor != NULL) {
330 currentThread = Threads::owning_thread_from_monitor_owner((address)waitingToLockMonitor->owner(), 330 currentThread = Threads::owning_thread_from_monitor_owner(
331 false /* no locking needed */); 331 (address)waitingToLockMonitor->owner(),
332 false /* no locking needed */);
333 if (currentThread == NULL) {
334 // This function is called at a safepoint so the JavaThread
335 // that owns waitingToLockMonitor should be findable, but
336 // if it is not findable, then the previous currentThread is
337 // blocked permanently. We record this as a deadlock.
338 num_deadlocks++;
339
340 cycle->set_deadlock(true);
341
342 // add this cycle to the deadlocks list
343 if (deadlocks == NULL) {
344 deadlocks = cycle;
345 } else {
346 last->set_next(cycle);
347 }
348 last = cycle;
349 cycle = new DeadlockCycle();
350 break;
351 }
332 } else { 352 } else {
333 if (concurrent_locks) { 353 if (concurrent_locks) {
334 if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) { 354 if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) {
335 oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker); 355 oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker);
336 currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL; 356 currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL;
839 } else { 859 } else {
840 // No Java object associated - a JVMTI raw monitor 860 // No Java object associated - a JVMTI raw monitor
841 owner_desc = " (JVMTI raw monitor),\n which is held by"; 861 owner_desc = " (JVMTI raw monitor),\n which is held by";
842 } 862 }
843 currentThread = Threads::owning_thread_from_monitor_owner( 863 currentThread = Threads::owning_thread_from_monitor_owner(
844 (address)waitingToLockMonitor->owner(), false /* no locking needed */); 864 (address)waitingToLockMonitor->owner(),
865 false /* no locking needed */);
866 if (currentThread == NULL) {
867 // The deadlock was detected at a safepoint so the JavaThread
868 // that owns waitingToLockMonitor should be findable, but
869 // if it is not findable, then the previous currentThread is
870 // blocked permanently.
871 st->print("%s UNKNOWN_owner_addr=" PTR_FORMAT, owner_desc,
872 (address)waitingToLockMonitor->owner());
873 continue;
874 }
845 } else { 875 } else {
846 st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)", 876 st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)",
847 (address)waitingToLockBlocker, 877 (address)waitingToLockBlocker,
848 (InstanceKlass::cast(waitingToLockBlocker->klass()))->external_name()); 878 (InstanceKlass::cast(waitingToLockBlocker->klass()))->external_name());
849 assert(waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass()), 879 assert(waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass()),