Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @ 10405:f2110083203d
8005849: JEP 167: Event-Based JVM Tracing
Reviewed-by: acorn, coleenp, sla
Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>
author | sla |
---|---|
date | Mon, 10 Jun 2013 11:30:51 +0200 |
parents | 14d3f71f831d |
children | c49c7f835e8d |
comparison
equal
deleted
inserted
replaced
10404:d0add7016434 | 10405:f2110083203d |
---|---|
32 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp" | 32 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp" |
33 #include "gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp" | 33 #include "gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp" |
34 #include "gc_implementation/parallelScavenge/psOldGen.hpp" | 34 #include "gc_implementation/parallelScavenge/psOldGen.hpp" |
35 #include "gc_implementation/parallelScavenge/psScavenge.hpp" | 35 #include "gc_implementation/parallelScavenge/psScavenge.hpp" |
36 #include "gc_implementation/parallelScavenge/psYoungGen.hpp" | 36 #include "gc_implementation/parallelScavenge/psYoungGen.hpp" |
37 #include "gc_implementation/shared/gcHeapSummary.hpp" | |
38 #include "gc_implementation/shared/gcTimer.hpp" | |
39 #include "gc_implementation/shared/gcTrace.hpp" | |
40 #include "gc_implementation/shared/gcTraceTime.hpp" | |
37 #include "gc_implementation/shared/isGCActiveMark.hpp" | 41 #include "gc_implementation/shared/isGCActiveMark.hpp" |
38 #include "gc_implementation/shared/markSweep.hpp" | 42 #include "gc_implementation/shared/markSweep.hpp" |
39 #include "gc_implementation/shared/spaceDecorator.hpp" | 43 #include "gc_implementation/shared/spaceDecorator.hpp" |
40 #include "gc_interface/gcCause.hpp" | 44 #include "gc_interface/gcCause.hpp" |
41 #include "memory/gcLocker.inline.hpp" | 45 #include "memory/gcLocker.inline.hpp" |
106 if (GC_locker::check_active_before_gc()) { | 110 if (GC_locker::check_active_before_gc()) { |
107 return false; | 111 return false; |
108 } | 112 } |
109 | 113 |
110 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); | 114 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); |
115 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | |
111 GCCause::Cause gc_cause = heap->gc_cause(); | 116 GCCause::Cause gc_cause = heap->gc_cause(); |
112 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | 117 |
118 _gc_timer->register_gc_start(os::elapsed_counter()); | |
119 _gc_tracer->report_gc_start(gc_cause, _gc_timer->gc_start()); | |
120 | |
113 PSAdaptiveSizePolicy* size_policy = heap->size_policy(); | 121 PSAdaptiveSizePolicy* size_policy = heap->size_policy(); |
114 | 122 |
115 // The scope of casr should end after code that can change | 123 // The scope of casr should end after code that can change |
116 // CollectorPolicy::_should_clear_all_soft_refs. | 124 // CollectorPolicy::_should_clear_all_soft_refs. |
117 ClearedAllSoftRefs casr(clear_all_softrefs, heap->collector_policy()); | 125 ClearedAllSoftRefs casr(clear_all_softrefs, heap->collector_policy()); |
129 _total_invocations++; | 137 _total_invocations++; |
130 | 138 |
131 AdaptiveSizePolicyOutput(size_policy, heap->total_collections()); | 139 AdaptiveSizePolicyOutput(size_policy, heap->total_collections()); |
132 | 140 |
133 heap->print_heap_before_gc(); | 141 heap->print_heap_before_gc(); |
142 heap->trace_heap_before_gc(_gc_tracer); | |
134 | 143 |
135 // Fill in TLABs | 144 // Fill in TLABs |
136 heap->accumulate_statistics_all_tlabs(); | 145 heap->accumulate_statistics_all_tlabs(); |
137 heap->ensure_parsability(true); // retire TLABs | 146 heap->ensure_parsability(true); // retire TLABs |
138 | 147 |
145 if (VerifyObjectStartArray && | 154 if (VerifyObjectStartArray && |
146 VerifyBeforeGC) { | 155 VerifyBeforeGC) { |
147 old_gen->verify_object_start_array(); | 156 old_gen->verify_object_start_array(); |
148 } | 157 } |
149 | 158 |
150 heap->pre_full_gc_dump(); | 159 heap->pre_full_gc_dump(_gc_timer); |
151 | 160 |
152 // Filled in below to track the state of the young gen after the collection. | 161 // Filled in below to track the state of the young gen after the collection. |
153 bool eden_empty; | 162 bool eden_empty; |
154 bool survivors_empty; | 163 bool survivors_empty; |
155 bool young_gen_empty; | 164 bool young_gen_empty; |
157 { | 166 { |
158 HandleMark hm; | 167 HandleMark hm; |
159 | 168 |
160 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); | 169 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps); |
161 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); | 170 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); |
162 TraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty); | 171 GCTraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, NULL); |
163 TraceCollectorStats tcs(counters()); | 172 TraceCollectorStats tcs(counters()); |
164 TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); | 173 TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); |
165 | 174 |
166 if (TraceGen1Time) accumulated_time()->start(); | 175 if (TraceGen1Time) accumulated_time()->start(); |
167 | 176 |
372 } | 381 } |
373 | 382 |
374 NOT_PRODUCT(ref_processor()->verify_no_references_recorded()); | 383 NOT_PRODUCT(ref_processor()->verify_no_references_recorded()); |
375 | 384 |
376 heap->print_heap_after_gc(); | 385 heap->print_heap_after_gc(); |
377 | 386 heap->trace_heap_after_gc(_gc_tracer); |
378 heap->post_full_gc_dump(); | 387 |
388 heap->post_full_gc_dump(_gc_timer); | |
379 | 389 |
380 #ifdef TRACESPINNING | 390 #ifdef TRACESPINNING |
381 ParallelTaskTerminator::print_termination_counts(); | 391 ParallelTaskTerminator::print_termination_counts(); |
382 #endif | 392 #endif |
393 | |
394 _gc_timer->register_gc_end(os::elapsed_counter()); | |
395 | |
396 _gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions()); | |
383 | 397 |
384 return true; | 398 return true; |
385 } | 399 } |
386 | 400 |
387 bool PSMarkSweep::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy, | 401 bool PSMarkSweep::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy, |
496 _objarray_stack.clear(true); | 510 _objarray_stack.clear(true); |
497 } | 511 } |
498 | 512 |
499 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { | 513 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) { |
500 // Recursively traverse all live objects and mark them | 514 // Recursively traverse all live objects and mark them |
501 TraceTime tm("phase 1", PrintGCDetails && Verbose, true, gclog_or_tty); | 515 GCTraceTime tm("phase 1", PrintGCDetails && Verbose, true, _gc_timer); |
502 trace(" 1"); | 516 trace(" 1"); |
503 | 517 |
504 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); | 518 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); |
505 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | 519 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); |
506 | 520 |
529 follow_stack(); | 543 follow_stack(); |
530 | 544 |
531 // Process reference objects found during marking | 545 // Process reference objects found during marking |
532 { | 546 { |
533 ref_processor()->setup_policy(clear_all_softrefs); | 547 ref_processor()->setup_policy(clear_all_softrefs); |
534 ref_processor()->process_discovered_references( | 548 const ReferenceProcessorStats& stats = |
535 is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL); | 549 ref_processor()->process_discovered_references( |
550 is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, _gc_timer); | |
551 gc_tracer()->report_gc_reference_stats(stats); | |
536 } | 552 } |
537 | 553 |
538 // This is the point where the entire marking should have completed. | 554 // This is the point where the entire marking should have completed. |
539 assert(_marking_stack.is_empty(), "Marking should have completed"); | 555 assert(_marking_stack.is_empty(), "Marking should have completed"); |
540 | 556 |
550 // Delete entries for dead interned strings. | 566 // Delete entries for dead interned strings. |
551 StringTable::unlink(is_alive_closure()); | 567 StringTable::unlink(is_alive_closure()); |
552 | 568 |
553 // Clean up unreferenced symbols in symbol table. | 569 // Clean up unreferenced symbols in symbol table. |
554 SymbolTable::unlink(); | 570 SymbolTable::unlink(); |
571 _gc_tracer->report_object_count_after_gc(is_alive_closure()); | |
555 } | 572 } |
556 | 573 |
557 | 574 |
558 void PSMarkSweep::mark_sweep_phase2() { | 575 void PSMarkSweep::mark_sweep_phase2() { |
559 TraceTime tm("phase 2", PrintGCDetails && Verbose, true, gclog_or_tty); | 576 GCTraceTime tm("phase 2", PrintGCDetails && Verbose, true, _gc_timer); |
560 trace("2"); | 577 trace("2"); |
561 | 578 |
562 // Now all live objects are marked, compute the new object addresses. | 579 // Now all live objects are marked, compute the new object addresses. |
563 | 580 |
564 // It is not required that we traverse spaces in the same order in | 581 // It is not required that we traverse spaces in the same order in |
584 }; | 601 }; |
585 static PSAlwaysTrueClosure always_true; | 602 static PSAlwaysTrueClosure always_true; |
586 | 603 |
587 void PSMarkSweep::mark_sweep_phase3() { | 604 void PSMarkSweep::mark_sweep_phase3() { |
588 // Adjust the pointers to reflect the new locations | 605 // Adjust the pointers to reflect the new locations |
589 TraceTime tm("phase 3", PrintGCDetails && Verbose, true, gclog_or_tty); | 606 GCTraceTime tm("phase 3", PrintGCDetails && Verbose, true, _gc_timer); |
590 trace("3"); | 607 trace("3"); |
591 | 608 |
592 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); | 609 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); |
593 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | 610 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); |
594 | 611 |
627 old_gen->adjust_pointers(); | 644 old_gen->adjust_pointers(); |
628 } | 645 } |
629 | 646 |
630 void PSMarkSweep::mark_sweep_phase4() { | 647 void PSMarkSweep::mark_sweep_phase4() { |
631 EventMark m("4 compact heap"); | 648 EventMark m("4 compact heap"); |
632 TraceTime tm("phase 4", PrintGCDetails && Verbose, true, gclog_or_tty); | 649 GCTraceTime tm("phase 4", PrintGCDetails && Verbose, true, _gc_timer); |
633 trace("4"); | 650 trace("4"); |
634 | 651 |
635 // All pointers are now adjusted, move objects accordingly | 652 // All pointers are now adjusted, move objects accordingly |
636 | 653 |
637 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); | 654 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap(); |