diff -r 01684f7fee1b src/share/vm/services/management.cpp
--- a/src/share/vm/services/management.cpp	Fri Nov 16 09:36:41 2012 -0800
+++ b/src/share/vm/services/management.cpp	Tue Nov 27 13:10:50 2012 +0200
@@ -1944,7 +1944,7 @@
   for (cycle = deadlocks; cycle != NULL; cycle = cycle->next()) {
     GrowableArray<JavaThread*>* deadlock_threads = cycle->threads();
     int len = deadlock_threads->length();
-    for (int i = 0; i < len; i++) {
+    for (int i = cycle->leader(); i < len; i++) {
       threads_ah->obj_at_put(index, deadlock_threads->at(i)->threadObj());
       index++;
     }
diff -r 01684f7fee1b src/share/vm/services/threadService.cpp
--- a/src/share/vm/services/threadService.cpp	Fri Nov 16 09:36:41 2012 -0800
+++ b/src/share/vm/services/threadService.cpp	Tue Nov 27 13:10:50 2012 +0200
@@ -357,7 +357,7 @@
         // We have a (new) cycle
         num_deadlocks++;
 
-        cycle->set_deadlock(true);
+        cycle->set_deadlock_leader(currentThread->depth_first_number() - thisDfn);
 
         // add this cycle to the deadlocks list
         if (deadlocks == NULL) {
@@ -801,7 +801,7 @@
 }
 
 DeadlockCycle::DeadlockCycle() {
-  _is_deadlock = false;
+  _leader = 0;
   _threads = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JavaThread*>(INITIAL_ARRAY_SIZE, true);
   _next = NULL;
 }
@@ -819,7 +819,7 @@
   ObjectMonitor* waitingToLockMonitor;
   oop waitingToLockBlocker;
   int len = _threads->length();
-  for (int i = 0; i < len; i++) {
+  for (int i = _leader; i < len; i++) {
     currentThread = _threads->at(i);
     waitingToLockMonitor = (ObjectMonitor*)currentThread->current_pending_monitor();
     waitingToLockBlocker = currentThread->current_park_blocker();
diff -r 01684f7fee1b src/share/vm/services/threadService.hpp
--- a/src/share/vm/services/threadService.hpp	Fri Nov 16 09:36:41 2012 -0800
+++ b/src/share/vm/services/threadService.hpp	Tue Nov 27 13:10:50 2012 +0200
@@ -358,7 +358,7 @@
 
 class DeadlockCycle : public CHeapObj<mtInternal> {
  private:
-  bool _is_deadlock;
+  int _leader;
   GrowableArray<JavaThread*>* _threads;
   DeadlockCycle*              _next;
  public:
@@ -368,10 +368,10 @@
   DeadlockCycle* next()                     { return _next; }
   void           set_next(DeadlockCycle* d) { _next = d; }
   void           add_thread(JavaThread* t)  { _threads->append(t); }
-  void           reset()                    { _is_deadlock = false; _threads->clear(); }
-  void           set_deadlock(bool value)   { _is_deadlock = value; }
-  bool           is_deadlock()              { return _is_deadlock; }
-  int            num_threads()              { return _threads->length(); }
+  void           reset()                    { _leader = 0; _threads->clear(); }
+  void           set_deadlock_leader(int leader) { _leader = leader; }
+  int            num_threads()              { return _threads->length() - _leader; }
+  int            leader()                   { return _leader; }
   GrowableArray<JavaThread*>* threads()     { return _threads; }
   void           print_on(outputStream* st) const;
 };
