# HG changeset patch # User tonyp # Date 1254514327 14400 # Node ID 035d2e036a9b1bab8dbaefcd3d5e57f05d7b4574 # Parent 8afee153274ac7fb8c5a76c8fa91a77cc47e0432 6885041: G1: inconsistent thread dump Summary: When G1 is enabled, thread dumps are inconsistent as the info for some of the G1 threads is not formatted properly. Reviewed-by: ysr, johnc diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp --- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -377,3 +377,11 @@ _g1h->g1_policy()->record_cc_clear_time(elapsed * 1000.0); #endif } + +void ConcurrentG1Refine::print_worker_threads_on(outputStream* st) const { + for (int i = 0; i < _n_threads; ++i) { + _threads[i]->print_on(st); + st->cr(); + } +} + diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp --- a/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Fri Oct 02 16:12:07 2009 -0400 @@ -179,4 +179,6 @@ void clear_and_record_card_counts(); static size_t thread_num(); + + void print_worker_threads_on(outputStream* st) const; }; diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp --- a/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -204,8 +204,12 @@ if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-stop"); } -void ConcurrentG1RefineThread::print() { - gclog_or_tty->print("\"Concurrent G1 Refinement Thread\" "); - Thread::print(); - gclog_or_tty->cr(); +void ConcurrentG1RefineThread::print() const { + print_on(tty); } + +void ConcurrentG1RefineThread::print_on(outputStream* st) const { + st->print("\"G1 Concurrent Refinement Thread#%d\" ", _worker_id); + Thread::print_on(st); + st->cr(); +} diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp --- a/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp Fri Oct 02 16:12:07 2009 -0400 @@ -77,7 +77,8 @@ int worker_id_offset, int worker_id); // Printing - void print(); + void print() const; + void print_on(outputStream* st) const; // Total virtual time so far. double vtime_accum() { return _vtime_accum; } diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentMark.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -543,7 +543,7 @@ #endif guarantee( parallel_marking_threads() > 0, "peace of mind" ); - _parallel_workers = new WorkGang("Parallel Marking Threads", + _parallel_workers = new WorkGang("G1 Parallel Marking Threads", (int) parallel_marking_threads(), false, true); if (_parallel_workers == NULL) vm_exit_during_initialization("Failed necessary allocation."); @@ -2637,6 +2637,10 @@ cmThread()->vtime_count_accum()); } +void ConcurrentMark::print_worker_threads_on(outputStream* st) const { + _parallel_workers->print_worker_threads_on(st); +} + // Closures // XXX: there seems to be a lot of code duplication here; // should refactor and consolidate the shared code. diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentMark.hpp --- a/src/share/vm/gc_implementation/g1/concurrentMark.hpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMark.hpp Fri Oct 02 16:12:07 2009 -0400 @@ -723,6 +723,8 @@ void print_summary_info(); + void print_worker_threads_on(outputStream* st) const; + // The following indicate whether a given verbose level has been // set. Notice that anything above stats is conditional to // _MARKING_VERBOSE_ having been set to 1 diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp --- a/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -286,10 +286,14 @@ } } -void ConcurrentMarkThread::print() { - gclog_or_tty->print("\"Concurrent Mark GC Thread\" "); - Thread::print(); - gclog_or_tty->cr(); +void ConcurrentMarkThread::print() const { + print_on(tty); +} + +void ConcurrentMarkThread::print_on(outputStream* st) const { + st->print("\"G1 Main Concurrent Mark GC Thread\" "); + Thread::print_on(st); + st->cr(); } void ConcurrentMarkThread::sleepBeforeNextCycle() { diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp --- a/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp Fri Oct 02 16:12:07 2009 -0400 @@ -57,7 +57,8 @@ static SurrogateLockerThread* slt() { return _slt; } // Printing - void print(); + void print_on(outputStream* st) const; + void print() const; // Total virtual time so far. double vtime_accum(); diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentZFThread.cpp --- a/src/share/vm/gc_implementation/g1/concurrentZFThread.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentZFThread.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -157,10 +157,14 @@ } } -void ConcurrentZFThread::print() { - gclog_or_tty->print("\"Concurrent ZF Thread\" "); - Thread::print(); - gclog_or_tty->cr(); +void ConcurrentZFThread::print() const { + print_on(tty); +} + +void ConcurrentZFThread::print_on(outputStream* st) const { + st->print("\"G1 Concurrent Zero-Fill Thread\" "); + Thread::print_on(st); + st->cr(); } diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/concurrentZFThread.hpp --- a/src/share/vm/gc_implementation/g1/concurrentZFThread.hpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/concurrentZFThread.hpp Fri Oct 02 16:12:07 2009 -0400 @@ -61,7 +61,8 @@ virtual void run(); // Printing - void print(); + void print_on(outputStream* st) const; + void print() const; // Waits until "r" has been zero-filled. Requires caller to hold the // ZF_mon. diff -r 8afee153274a -r 035d2e036a9b src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Mon Oct 05 05:51:22 2009 -0700 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Fri Oct 02 16:12:07 2009 -0400 @@ -2383,27 +2383,18 @@ _hrs->iterate(&blk); } -class PrintOnThreadsClosure : public ThreadClosure { - outputStream* _st; -public: - PrintOnThreadsClosure(outputStream* st) : _st(st) { } - virtual void do_thread(Thread *t) { - t->print_on(_st); - } -}; - void G1CollectedHeap::print_gc_threads_on(outputStream* st) const { if (ParallelGCThreads > 0) { - workers()->print_worker_threads(); - } - st->print("\"G1 concurrent mark GC Thread\" "); - _cmThread->print(); + workers()->print_worker_threads_on(st); + } + + _cmThread->print_on(st); st->cr(); - st->print("\"G1 concurrent refinement GC Threads\" "); - PrintOnThreadsClosure p(st); - _cg1r->threads_do(&p); - st->cr(); - st->print("\"G1 zero-fill GC Thread\" "); + + _cm->print_worker_threads_on(st); + + _cg1r->print_worker_threads_on(st); + _czft->print_on(st); st->cr(); }