17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "code/codeCache.hpp"
28 #include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
29 #include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
30 #include "gc_implementation/parallelScavenge/generationSizer.hpp"
31 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
32 #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
33 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
34 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
35 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
36 #include "gc_implementation/parallelScavenge/psTasks.hpp"
37 #include "gc_implementation/shared/isGCActiveMark.hpp"
38 #include "gc_implementation/shared/spaceDecorator.hpp"
39 #include "gc_interface/gcCause.hpp"
40 #include "memory/collectorPolicy.hpp"
41 #include "memory/gcLocker.inline.hpp"
42 #include "memory/referencePolicy.hpp"
43 #include "memory/referenceProcessor.hpp"
44 #include "memory/resourceArea.hpp"
45 #include "oops/oop.inline.hpp"
46 #include "oops/oop.psgc.inline.hpp"
47 #include "runtime/biasedLocking.hpp"
48 #include "runtime/fprofiler.hpp"
49 #include "runtime/handles.inline.hpp"
50 #include "runtime/threadCritical.hpp"
51 #include "runtime/vmThread.hpp"
52 #include "runtime/vm_operations.hpp"
53 #include "services/memoryService.hpp"
54 #include "utilities/stack.inline.hpp"
55
56
57 HeapWord* PSScavenge::_to_space_top_before_gc = NULL;
58 int PSScavenge::_consecutive_skipped_scavenges = 0;
59 ReferenceProcessor* PSScavenge::_ref_processor = NULL;
60 CardTableExtension* PSScavenge::_card_table = NULL;
61 bool PSScavenge::_survivor_overflow = false;
62 uint PSScavenge::_tenuring_threshold = 0;
63 HeapWord* PSScavenge::_young_generation_boundary = NULL;
64 elapsedTimer PSScavenge::_accumulated_time;
65 Stack<markOop, mtGC> PSScavenge::_preserved_mark_stack;
66 Stack<oop, mtGC> PSScavenge::_preserved_oop_stack;
67 CollectorCounters* PSScavenge::_counters = NULL;
68 bool PSScavenge::_promotion_failed = false;
69
70 // Define before use
71 class PSIsAliveClosure: public BoolObjectClosure {
72 public:
73 bool do_object_b(oop p) {
74 return (!PSScavenge::is_obj_in_young((HeapWord*) p)) || p->is_forwarded();
75 }
76 };
77
78 PSIsAliveClosure PSScavenge::_is_alive_closure;
79
80 class PSKeepAliveClosure: public OopClosure {
81 protected:
82 MutableSpace* _to_space;
83 PSPromotionManager* _promotion_manager;
84
85 public:
86 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
87 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
88 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
241
242 if (UseParallelOldGC) {
243 full_gc_done = PSParallelCompact::invoke_no_policy(clear_all_softrefs);
244 } else {
245 full_gc_done = PSMarkSweep::invoke_no_policy(clear_all_softrefs);
246 }
247 }
248
249 return full_gc_done;
250 }
251
252 // This method contains no policy. You should probably
253 // be calling invoke() instead.
254 bool PSScavenge::invoke_no_policy() {
255 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
256 assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
257
258 assert(_preserved_mark_stack.is_empty(), "should be empty");
259 assert(_preserved_oop_stack.is_empty(), "should be empty");
260
261 TimeStamp scavenge_entry;
262 TimeStamp scavenge_midpoint;
263 TimeStamp scavenge_exit;
264
265 scavenge_entry.update();
266
267 if (GC_locker::check_active_before_gc()) {
268 return false;
269 }
270
271 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
272 GCCause::Cause gc_cause = heap->gc_cause();
273 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
274
275 // Check for potential problems.
276 if (!should_attempt_scavenge()) {
277 return false;
278 }
279
280 bool promotion_failure_occurred = false;
281
282 PSYoungGen* young_gen = heap->young_gen();
283 PSOldGen* old_gen = heap->old_gen();
284 PSAdaptiveSizePolicy* size_policy = heap->size_policy();
285 heap->increment_total_collections();
286
287 AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
288
289 if ((gc_cause != GCCause::_java_lang_system_gc) ||
290 UseAdaptiveSizePolicyWithSystemGC) {
291 // Gather the feedback data for eden occupancy.
292 young_gen->eden_space()->accumulate_statistics();
293 }
294
295 if (ZapUnusedHeapArea) {
296 // Save information needed to minimize mangling
297 heap->record_gen_tops_before_GC();
298 }
299
300 heap->print_heap_before_gc();
301
302 assert(!NeverTenure || _tenuring_threshold == markOopDesc::max_age + 1, "Sanity");
303 assert(!AlwaysTenure || _tenuring_threshold == 0, "Sanity");
304
305 size_t prev_used = heap->used();
306 assert(promotion_failed() == false, "Sanity");
307
308 // Fill in TLABs
309 heap->accumulate_statistics_all_tlabs();
310 heap->ensure_parsability(true); // retire TLABs
311
312 if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
313 HandleMark hm; // Discard invalid handles created during verification
314 Universe::verify(" VerifyBeforeGC:");
315 }
316
317 {
318 ResourceMark rm;
319 HandleMark hm;
320
321 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
322 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
323 TraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, gclog_or_tty);
324 TraceCollectorStats tcs(counters());
325 TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
326
327 if (TraceGen0Time) accumulated_time()->start();
328
329 // Let the size policy know we're starting
330 size_policy->minor_collection_begin();
331
332 // Verify the object start arrays.
333 if (VerifyObjectStartArray &&
334 VerifyBeforeGC) {
335 old_gen->verify_object_start_array();
336 }
337
338 // Verify no unmarked old->young roots
339 if (VerifyRememberedSets) {
340 CardTableExtension::verify_all_young_refs_imprecise();
341 }
342
343 if (!ScavengeWithObjectsInToSpace) {
369 // values to the card_table, to prevent it from
370 // straying into the promotion labs.
371 HeapWord* old_top = old_gen->object_space()->top();
372
373 // Release all previously held resources
374 gc_task_manager()->release_all_resources();
375
376 // Set the number of GC threads to be used in this collection
377 gc_task_manager()->set_active_gang();
378 gc_task_manager()->task_idle_workers();
379 // Get the active number of workers here and use that value
380 // throughout the methods.
381 uint active_workers = gc_task_manager()->active_workers();
382 heap->set_par_threads(active_workers);
383
384 PSPromotionManager::pre_scavenge();
385
386 // We'll use the promotion manager again later.
387 PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
388 {
389 // TraceTime("Roots");
390 ParallelScavengeHeap::ParStrongRootsScope psrs;
391
392 GCTaskQueue* q = GCTaskQueue::create();
393
394 if (!old_gen->object_space()->is_empty()) {
395 // There are only old-to-young pointers if there are objects
396 // in the old gen.
397 uint stripe_total = active_workers;
398 for(uint i=0; i < stripe_total; i++) {
399 q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i, stripe_total));
400 }
401 }
402
403 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::universe));
404 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jni_handles));
405 // We scan the thread roots in parallel
406 Threads::create_thread_roots_tasks(q);
407 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::object_synchronizer));
408 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
409 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
411 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
412 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
413 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
414
415 ParallelTaskTerminator terminator(
416 active_workers,
417 (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
418 if (active_workers > 1) {
419 for (uint j = 0; j < active_workers; j++) {
420 q->enqueue(new StealTask(&terminator));
421 }
422 }
423
424 gc_task_manager()->execute_and_wait(q);
425 }
426
427 scavenge_midpoint.update();
428
429 // Process reference objects discovered during scavenge
430 {
431 reference_processor()->setup_policy(false); // not always_clear
432 reference_processor()->set_active_mt_degree(active_workers);
433 PSKeepAliveClosure keep_alive(promotion_manager);
434 PSEvacuateFollowersClosure evac_followers(promotion_manager);
435 if (reference_processor()->processing_is_mt()) {
436 PSRefProcTaskExecutor task_executor;
437 reference_processor()->process_discovered_references(
438 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor);
439 } else {
440 reference_processor()->process_discovered_references(
441 &_is_alive_closure, &keep_alive, &evac_followers, NULL);
442 }
443 }
444
445 // Enqueue reference objects discovered during scavenge.
446 if (reference_processor()->processing_is_mt()) {
447 PSRefProcTaskExecutor task_executor;
448 reference_processor()->enqueue_discovered_references(&task_executor);
449 } else {
450 reference_processor()->enqueue_discovered_references(NULL);
451 }
452
453 // Unlink any dead interned Strings and process the remaining live ones.
454 PSScavengeRootsClosure root_closure(promotion_manager);
455 StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
456
457 // Finally, flush the promotion_manager's labs, and deallocate its stacks.
458 PSPromotionManager::post_scavenge();
459
460 promotion_failure_occurred = promotion_failed();
461 if (promotion_failure_occurred) {
462 clean_up_failed_promotion();
463 if (PrintGC) {
464 gclog_or_tty->print("--");
465 }
466 }
467
468 // Let the size policy know we're done. Note that we count promotion
469 // failure cleanup time as part of the collection (otherwise, we're
470 // implicitly saying it's mutator time).
471 size_policy->minor_collection_end(gc_cause);
472
473 if (!promotion_failure_occurred) {
474 // Swap the survivor spaces.
475
476
477 young_gen->eden_space()->clear(SpaceDecorator::Mangle);
478 young_gen->from_space()->clear(SpaceDecorator::Mangle);
479 young_gen->swap_spaces();
480
481 size_t survived = young_gen->from_space()->used_in_bytes();
482 size_t promoted = old_gen->used_in_bytes() - old_gen_used_before;
483 size_policy->update_averages(_survivor_overflow, survived, promoted);
484
485 // A successful scavenge should restart the GC time limit count which is
486 // for full GC's.
487 size_policy->reset_gc_overhead_limit_count();
488 if (UseAdaptiveSizePolicy) {
489 // Calculate the new survivor size and tenuring threshold
490
491 if (PrintAdaptiveSizePolicy) {
492 gclog_or_tty->print("AdaptiveSizeStart: ");
493 gclog_or_tty->stamp();
494 gclog_or_tty->print_cr(" collection: %d ",
495 heap->total_collections());
496
594 }
595 }
596
597 // Update the structure of the eden. With NUMA-eden CPU hotplugging or offlining can
598 // cause the change of the heap layout. Make sure eden is reshaped if that's the case.
599 // Also update() will case adaptive NUMA chunk resizing.
600 assert(young_gen->eden_space()->is_empty(), "eden space should be empty now");
601 young_gen->eden_space()->update();
602
603 heap->gc_policy_counters()->update_counters();
604
605 heap->resize_all_tlabs();
606
607 assert(young_gen->to_space()->is_empty(), "to space should be empty now");
608 }
609
610 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
611
612 NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
613
614 CodeCache::prune_scavenge_root_nmethods();
615
616 // Re-verify object start arrays
617 if (VerifyObjectStartArray &&
618 VerifyAfterGC) {
619 old_gen->verify_object_start_array();
620 }
621
622 // Verify all old -> young cards are now precise
623 if (VerifyRememberedSets) {
624 // Precise verification will give false positives. Until this is fixed,
625 // use imprecise verification.
626 // CardTableExtension::verify_all_young_refs_precise();
627 CardTableExtension::verify_all_young_refs_imprecise();
628 }
629
630 if (TraceGen0Time) accumulated_time()->stop();
631
632 if (PrintGC) {
633 if (PrintGCDetails) {
634 // Don't print a GC timestamp here. This is after the GC so
635 // would be confusing.
636 young_gen->print_used_change(young_gen_used_before);
637 }
638 heap->print_heap_change(prev_used);
639 }
640
641 // Track memory usage and detect low memory
642 MemoryService::track_memory_usage();
643 heap->update_counters();
644
645 gc_task_manager()->release_idle_workers();
646 }
647
648 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
649 HandleMark hm; // Discard invalid handles created during verification
650 Universe::verify(" VerifyAfterGC:");
651 }
652
653 heap->print_heap_after_gc();
654
655 if (ZapUnusedHeapArea) {
656 young_gen->eden_space()->check_mangled_unused_area_complete();
657 young_gen->from_space()->check_mangled_unused_area_complete();
658 young_gen->to_space()->check_mangled_unused_area_complete();
659 }
660
661 scavenge_exit.update();
662
663 if (PrintGCTaskTimeStamps) {
664 tty->print_cr("VM-Thread " INT64_FORMAT " " INT64_FORMAT " " INT64_FORMAT,
665 scavenge_entry.ticks(), scavenge_midpoint.ticks(),
666 scavenge_exit.ticks());
667 gc_task_manager()->print_task_time_stamps();
668 }
669
670 #ifdef TRACESPINNING
671 ParallelTaskTerminator::print_termination_counts();
672 #endif
673
674 return !promotion_failure_occurred;
675 }
676
677 // This method iterates over all objects in the young generation,
678 // unforwarding markOops. It then restores any preserved mark oops,
679 // and clears the _preserved_mark_stack.
680 void PSScavenge::clean_up_failed_promotion() {
681 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
682 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
683 assert(promotion_failed(), "Sanity");
684
685 PSYoungGen* young_gen = heap->young_gen();
686
687 {
688 ResourceMark rm;
689
690 // Unforward all pointers in the young gen.
691 PSPromotionFailedClosure unforward_closure;
692 young_gen->object_iterate(&unforward_closure);
693
694 if (PrintGC && Verbose) {
695 gclog_or_tty->print_cr("Restoring %d marks", _preserved_oop_stack.size());
696 }
697
698 // Restore any saved marks.
699 while (!_preserved_oop_stack.is_empty()) {
700 oop obj = _preserved_oop_stack.pop();
701 markOop mark = _preserved_mark_stack.pop();
702 obj->set_mark(mark);
703 }
704
705 // Clear the preserved mark and oop stack caches.
706 _preserved_mark_stack.clear(true);
707 _preserved_oop_stack.clear(true);
708 _promotion_failed = false;
709 }
710
711 // Reset the PromotionFailureALot counters.
712 NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
713 }
714
715 // This method is called whenever an attempt to promote an object
716 // fails. Some markOops will need preservation, some will not. Note
717 // that the entire eden is traversed after a failed promotion, with
718 // all forwarded headers replaced by the default markOop. This means
719 // it is not neccessary to preserve most markOops.
720 void PSScavenge::oop_promotion_failed(oop obj, markOop obj_mark) {
721 _promotion_failed = true;
722 if (obj_mark->must_be_preserved_for_promotion_failure(obj)) {
723 // Should use per-worker private stakcs hetre rather than
724 // locking a common pair of stacks.
725 ThreadCritical tc;
726 _preserved_oop_stack.push(obj);
727 _preserved_mark_stack.push(obj_mark);
728 }
729 }
730
731 bool PSScavenge::should_attempt_scavenge() {
732 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
733 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
734 PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
735
736 if (UsePerfData) {
737 counters->update_scavenge_skipped(not_skipped);
738 }
739
740 PSYoungGen* young_gen = heap->young_gen();
741 PSOldGen* old_gen = heap->old_gen();
742
743 if (!ScavengeWithObjectsInToSpace) {
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "code/codeCache.hpp"
28 #include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
29 #include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
30 #include "gc_implementation/parallelScavenge/generationSizer.hpp"
31 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
32 #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
33 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
34 #include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
35 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
36 #include "gc_implementation/parallelScavenge/psTasks.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"
41 #include "gc_implementation/shared/isGCActiveMark.hpp"
42 #include "gc_implementation/shared/spaceDecorator.hpp"
43 #include "gc_interface/gcCause.hpp"
44 #include "memory/collectorPolicy.hpp"
45 #include "memory/gcLocker.inline.hpp"
46 #include "memory/referencePolicy.hpp"
47 #include "memory/referenceProcessor.hpp"
48 #include "memory/resourceArea.hpp"
49 #include "oops/oop.inline.hpp"
50 #include "oops/oop.psgc.inline.hpp"
51 #include "runtime/biasedLocking.hpp"
52 #include "runtime/fprofiler.hpp"
53 #include "runtime/handles.inline.hpp"
54 #include "runtime/threadCritical.hpp"
55 #include "runtime/vmThread.hpp"
56 #include "runtime/vm_operations.hpp"
57 #include "services/memoryService.hpp"
58 #include "utilities/stack.inline.hpp"
59
60
61 HeapWord* PSScavenge::_to_space_top_before_gc = NULL;
62 int PSScavenge::_consecutive_skipped_scavenges = 0;
63 ReferenceProcessor* PSScavenge::_ref_processor = NULL;
64 CardTableExtension* PSScavenge::_card_table = NULL;
65 bool PSScavenge::_survivor_overflow = false;
66 uint PSScavenge::_tenuring_threshold = 0;
67 HeapWord* PSScavenge::_young_generation_boundary = NULL;
68 elapsedTimer PSScavenge::_accumulated_time;
69 STWGCTimer PSScavenge::_gc_timer;
70 ParallelScavengeTracer PSScavenge::_gc_tracer;
71 Stack<markOop, mtGC> PSScavenge::_preserved_mark_stack;
72 Stack<oop, mtGC> PSScavenge::_preserved_oop_stack;
73 CollectorCounters* PSScavenge::_counters = NULL;
74
75 // Define before use
76 class PSIsAliveClosure: public BoolObjectClosure {
77 public:
78 bool do_object_b(oop p) {
79 return (!PSScavenge::is_obj_in_young((HeapWord*) p)) || p->is_forwarded();
80 }
81 };
82
83 PSIsAliveClosure PSScavenge::_is_alive_closure;
84
85 class PSKeepAliveClosure: public OopClosure {
86 protected:
87 MutableSpace* _to_space;
88 PSPromotionManager* _promotion_manager;
89
90 public:
91 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
92 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
93 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
246
247 if (UseParallelOldGC) {
248 full_gc_done = PSParallelCompact::invoke_no_policy(clear_all_softrefs);
249 } else {
250 full_gc_done = PSMarkSweep::invoke_no_policy(clear_all_softrefs);
251 }
252 }
253
254 return full_gc_done;
255 }
256
257 // This method contains no policy. You should probably
258 // be calling invoke() instead.
259 bool PSScavenge::invoke_no_policy() {
260 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
261 assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
262
263 assert(_preserved_mark_stack.is_empty(), "should be empty");
264 assert(_preserved_oop_stack.is_empty(), "should be empty");
265
266 _gc_timer.register_gc_start(os::elapsed_counter());
267
268 TimeStamp scavenge_entry;
269 TimeStamp scavenge_midpoint;
270 TimeStamp scavenge_exit;
271
272 scavenge_entry.update();
273
274 if (GC_locker::check_active_before_gc()) {
275 return false;
276 }
277
278 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
279 GCCause::Cause gc_cause = heap->gc_cause();
280 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
281
282 // Check for potential problems.
283 if (!should_attempt_scavenge()) {
284 return false;
285 }
286
287 _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start());
288
289 bool promotion_failure_occurred = false;
290
291 PSYoungGen* young_gen = heap->young_gen();
292 PSOldGen* old_gen = heap->old_gen();
293 PSAdaptiveSizePolicy* size_policy = heap->size_policy();
294
295 heap->increment_total_collections();
296
297 AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
298
299 if ((gc_cause != GCCause::_java_lang_system_gc) ||
300 UseAdaptiveSizePolicyWithSystemGC) {
301 // Gather the feedback data for eden occupancy.
302 young_gen->eden_space()->accumulate_statistics();
303 }
304
305 if (ZapUnusedHeapArea) {
306 // Save information needed to minimize mangling
307 heap->record_gen_tops_before_GC();
308 }
309
310 heap->print_heap_before_gc();
311 heap->trace_heap_before_gc(&_gc_tracer);
312
313 assert(!NeverTenure || _tenuring_threshold == markOopDesc::max_age + 1, "Sanity");
314 assert(!AlwaysTenure || _tenuring_threshold == 0, "Sanity");
315
316 size_t prev_used = heap->used();
317
318 // Fill in TLABs
319 heap->accumulate_statistics_all_tlabs();
320 heap->ensure_parsability(true); // retire TLABs
321
322 if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
323 HandleMark hm; // Discard invalid handles created during verification
324 Universe::verify(" VerifyBeforeGC:");
325 }
326
327 {
328 ResourceMark rm;
329 HandleMark hm;
330
331 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
332 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
333 GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
334 TraceCollectorStats tcs(counters());
335 TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
336
337 if (TraceGen0Time) accumulated_time()->start();
338
339 // Let the size policy know we're starting
340 size_policy->minor_collection_begin();
341
342 // Verify the object start arrays.
343 if (VerifyObjectStartArray &&
344 VerifyBeforeGC) {
345 old_gen->verify_object_start_array();
346 }
347
348 // Verify no unmarked old->young roots
349 if (VerifyRememberedSets) {
350 CardTableExtension::verify_all_young_refs_imprecise();
351 }
352
353 if (!ScavengeWithObjectsInToSpace) {
379 // values to the card_table, to prevent it from
380 // straying into the promotion labs.
381 HeapWord* old_top = old_gen->object_space()->top();
382
383 // Release all previously held resources
384 gc_task_manager()->release_all_resources();
385
386 // Set the number of GC threads to be used in this collection
387 gc_task_manager()->set_active_gang();
388 gc_task_manager()->task_idle_workers();
389 // Get the active number of workers here and use that value
390 // throughout the methods.
391 uint active_workers = gc_task_manager()->active_workers();
392 heap->set_par_threads(active_workers);
393
394 PSPromotionManager::pre_scavenge();
395
396 // We'll use the promotion manager again later.
397 PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
398 {
399 GCTraceTime tm("Scavenge", false, false, &_gc_timer);
400 ParallelScavengeHeap::ParStrongRootsScope psrs;
401
402 GCTaskQueue* q = GCTaskQueue::create();
403
404 if (!old_gen->object_space()->is_empty()) {
405 // There are only old-to-young pointers if there are objects
406 // in the old gen.
407 uint stripe_total = active_workers;
408 for(uint i=0; i < stripe_total; i++) {
409 q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i, stripe_total));
410 }
411 }
412
413 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::universe));
414 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jni_handles));
415 // We scan the thread roots in parallel
416 Threads::create_thread_roots_tasks(q);
417 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::object_synchronizer));
418 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
419 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
421 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
422 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
423 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
424
425 ParallelTaskTerminator terminator(
426 active_workers,
427 (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
428 if (active_workers > 1) {
429 for (uint j = 0; j < active_workers; j++) {
430 q->enqueue(new StealTask(&terminator));
431 }
432 }
433
434 gc_task_manager()->execute_and_wait(q);
435 }
436
437 scavenge_midpoint.update();
438
439 // Process reference objects discovered during scavenge
440 {
441 GCTraceTime tm("References", false, false, &_gc_timer);
442
443 reference_processor()->setup_policy(false); // not always_clear
444 reference_processor()->set_active_mt_degree(active_workers);
445 PSKeepAliveClosure keep_alive(promotion_manager);
446 PSEvacuateFollowersClosure evac_followers(promotion_manager);
447 ReferenceProcessorStats stats;
448 if (reference_processor()->processing_is_mt()) {
449 PSRefProcTaskExecutor task_executor;
450 stats = reference_processor()->process_discovered_references(
451 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
452 &_gc_timer);
453 } else {
454 stats = reference_processor()->process_discovered_references(
455 &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer);
456 }
457
458 _gc_tracer.report_gc_reference_stats(stats);
459
460 // Enqueue reference objects discovered during scavenge.
461 if (reference_processor()->processing_is_mt()) {
462 PSRefProcTaskExecutor task_executor;
463 reference_processor()->enqueue_discovered_references(&task_executor);
464 } else {
465 reference_processor()->enqueue_discovered_references(NULL);
466 }
467 }
468
469 GCTraceTime tm("StringTable", false, false, &_gc_timer);
470 // Unlink any dead interned Strings and process the remaining live ones.
471 PSScavengeRootsClosure root_closure(promotion_manager);
472 StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
473
474 // Finally, flush the promotion_manager's labs, and deallocate its stacks.
475 promotion_failure_occurred = PSPromotionManager::post_scavenge(_gc_tracer);
476 if (promotion_failure_occurred) {
477 clean_up_failed_promotion();
478 if (PrintGC) {
479 gclog_or_tty->print("--");
480 }
481 }
482
483 // Let the size policy know we're done. Note that we count promotion
484 // failure cleanup time as part of the collection (otherwise, we're
485 // implicitly saying it's mutator time).
486 size_policy->minor_collection_end(gc_cause);
487
488 if (!promotion_failure_occurred) {
489 // Swap the survivor spaces.
490 young_gen->eden_space()->clear(SpaceDecorator::Mangle);
491 young_gen->from_space()->clear(SpaceDecorator::Mangle);
492 young_gen->swap_spaces();
493
494 size_t survived = young_gen->from_space()->used_in_bytes();
495 size_t promoted = old_gen->used_in_bytes() - old_gen_used_before;
496 size_policy->update_averages(_survivor_overflow, survived, promoted);
497
498 // A successful scavenge should restart the GC time limit count which is
499 // for full GC's.
500 size_policy->reset_gc_overhead_limit_count();
501 if (UseAdaptiveSizePolicy) {
502 // Calculate the new survivor size and tenuring threshold
503
504 if (PrintAdaptiveSizePolicy) {
505 gclog_or_tty->print("AdaptiveSizeStart: ");
506 gclog_or_tty->stamp();
507 gclog_or_tty->print_cr(" collection: %d ",
508 heap->total_collections());
509
607 }
608 }
609
610 // Update the structure of the eden. With NUMA-eden CPU hotplugging or offlining can
611 // cause the change of the heap layout. Make sure eden is reshaped if that's the case.
612 // Also update() will case adaptive NUMA chunk resizing.
613 assert(young_gen->eden_space()->is_empty(), "eden space should be empty now");
614 young_gen->eden_space()->update();
615
616 heap->gc_policy_counters()->update_counters();
617
618 heap->resize_all_tlabs();
619
620 assert(young_gen->to_space()->is_empty(), "to space should be empty now");
621 }
622
623 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
624
625 NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
626
627 {
628 GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer);
629
630 CodeCache::prune_scavenge_root_nmethods();
631 }
632
633 // Re-verify object start arrays
634 if (VerifyObjectStartArray &&
635 VerifyAfterGC) {
636 old_gen->verify_object_start_array();
637 }
638
639 // Verify all old -> young cards are now precise
640 if (VerifyRememberedSets) {
641 // Precise verification will give false positives. Until this is fixed,
642 // use imprecise verification.
643 // CardTableExtension::verify_all_young_refs_precise();
644 CardTableExtension::verify_all_young_refs_imprecise();
645 }
646
647 if (TraceGen0Time) accumulated_time()->stop();
648
649 if (PrintGC) {
650 if (PrintGCDetails) {
651 // Don't print a GC timestamp here. This is after the GC so
652 // would be confusing.
653 young_gen->print_used_change(young_gen_used_before);
654 }
655 heap->print_heap_change(prev_used);
656 }
657
658 // Track memory usage and detect low memory
659 MemoryService::track_memory_usage();
660 heap->update_counters();
661
662 gc_task_manager()->release_idle_workers();
663 }
664
665 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
666 HandleMark hm; // Discard invalid handles created during verification
667 Universe::verify(" VerifyAfterGC:");
668 }
669
670 heap->print_heap_after_gc();
671 heap->trace_heap_after_gc(&_gc_tracer);
672 _gc_tracer.report_tenuring_threshold(tenuring_threshold());
673
674 if (ZapUnusedHeapArea) {
675 young_gen->eden_space()->check_mangled_unused_area_complete();
676 young_gen->from_space()->check_mangled_unused_area_complete();
677 young_gen->to_space()->check_mangled_unused_area_complete();
678 }
679
680 scavenge_exit.update();
681
682 if (PrintGCTaskTimeStamps) {
683 tty->print_cr("VM-Thread " INT64_FORMAT " " INT64_FORMAT " " INT64_FORMAT,
684 scavenge_entry.ticks(), scavenge_midpoint.ticks(),
685 scavenge_exit.ticks());
686 gc_task_manager()->print_task_time_stamps();
687 }
688
689 #ifdef TRACESPINNING
690 ParallelTaskTerminator::print_termination_counts();
691 #endif
692
693
694 _gc_timer.register_gc_end(os::elapsed_counter());
695
696 _gc_tracer.report_gc_end(_gc_timer.gc_end(), _gc_timer.time_partitions());
697
698 return !promotion_failure_occurred;
699 }
700
701 // This method iterates over all objects in the young generation,
702 // unforwarding markOops. It then restores any preserved mark oops,
703 // and clears the _preserved_mark_stack.
704 void PSScavenge::clean_up_failed_promotion() {
705 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
706 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
707
708 PSYoungGen* young_gen = heap->young_gen();
709
710 {
711 ResourceMark rm;
712
713 // Unforward all pointers in the young gen.
714 PSPromotionFailedClosure unforward_closure;
715 young_gen->object_iterate(&unforward_closure);
716
717 if (PrintGC && Verbose) {
718 gclog_or_tty->print_cr("Restoring %d marks", _preserved_oop_stack.size());
719 }
720
721 // Restore any saved marks.
722 while (!_preserved_oop_stack.is_empty()) {
723 oop obj = _preserved_oop_stack.pop();
724 markOop mark = _preserved_mark_stack.pop();
725 obj->set_mark(mark);
726 }
727
728 // Clear the preserved mark and oop stack caches.
729 _preserved_mark_stack.clear(true);
730 _preserved_oop_stack.clear(true);
731 }
732
733 // Reset the PromotionFailureALot counters.
734 NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
735 }
736
737 // This method is called whenever an attempt to promote an object
738 // fails. Some markOops will need preservation, some will not. Note
739 // that the entire eden is traversed after a failed promotion, with
740 // all forwarded headers replaced by the default markOop. This means
741 // it is not necessary to preserve most markOops.
742 void PSScavenge::oop_promotion_failed(oop obj, markOop obj_mark) {
743 if (obj_mark->must_be_preserved_for_promotion_failure(obj)) {
744 // Should use per-worker private stacks here rather than
745 // locking a common pair of stacks.
746 ThreadCritical tc;
747 _preserved_oop_stack.push(obj);
748 _preserved_mark_stack.push(obj_mark);
749 }
750 }
751
752 bool PSScavenge::should_attempt_scavenge() {
753 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
754 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
755 PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
756
757 if (UsePerfData) {
758 counters->update_scavenge_skipped(not_skipped);
759 }
760
761 PSYoungGen* young_gen = heap->young_gen();
762 PSOldGen* old_gen = heap->old_gen();
763
764 if (!ScavengeWithObjectsInToSpace) {
|