34 #include "gc/parallel/psScavenge.inline.hpp" |
34 #include "gc/parallel/psScavenge.inline.hpp" |
35 #include "gc/parallel/psTasks.hpp" |
35 #include "gc/parallel/psTasks.hpp" |
36 #include "gc/shared/collectorPolicy.hpp" |
36 #include "gc/shared/collectorPolicy.hpp" |
37 #include "gc/shared/gcCause.hpp" |
37 #include "gc/shared/gcCause.hpp" |
38 #include "gc/shared/gcHeapSummary.hpp" |
38 #include "gc/shared/gcHeapSummary.hpp" |
|
39 #include "gc/shared/gcId.hpp" |
39 #include "gc/shared/gcLocker.inline.hpp" |
40 #include "gc/shared/gcLocker.inline.hpp" |
40 #include "gc/shared/gcTimer.hpp" |
41 #include "gc/shared/gcTimer.hpp" |
41 #include "gc/shared/gcTrace.hpp" |
42 #include "gc/shared/gcTrace.hpp" |
42 #include "gc/shared/gcTraceTime.hpp" |
43 #include "gc/shared/gcTraceTime.hpp" |
43 #include "gc/shared/isGCActiveMark.hpp" |
44 #include "gc/shared/isGCActiveMark.hpp" |
276 // Check for potential problems. |
277 // Check for potential problems. |
277 if (!should_attempt_scavenge()) { |
278 if (!should_attempt_scavenge()) { |
278 return false; |
279 return false; |
279 } |
280 } |
280 |
281 |
|
282 GCIdMark gc_id_mark; |
281 _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start()); |
283 _gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start()); |
282 |
284 |
283 bool promotion_failure_occurred = false; |
285 bool promotion_failure_occurred = false; |
284 |
286 |
285 PSYoungGen* young_gen = heap->young_gen(); |
287 PSYoungGen* young_gen = heap->young_gen(); |
320 { |
322 { |
321 ResourceMark rm; |
323 ResourceMark rm; |
322 HandleMark hm; |
324 HandleMark hm; |
323 |
325 |
324 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); |
326 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty); |
325 GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer.gc_id()); |
327 GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL); |
326 TraceCollectorStats tcs(counters()); |
328 TraceCollectorStats tcs(counters()); |
327 TraceMemoryManagerStats tms(false /* not full GC */,gc_cause); |
329 TraceMemoryManagerStats tms(false /* not full GC */,gc_cause); |
328 |
330 |
329 if (TraceYoungGenTime) accumulated_time()->start(); |
331 if (TraceYoungGenTime) accumulated_time()->start(); |
330 |
332 |
385 PSPromotionManager::pre_scavenge(); |
387 PSPromotionManager::pre_scavenge(); |
386 |
388 |
387 // We'll use the promotion manager again later. |
389 // We'll use the promotion manager again later. |
388 PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager(); |
390 PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager(); |
389 { |
391 { |
390 GCTraceTime tm("Scavenge", false, false, &_gc_timer, _gc_tracer.gc_id()); |
392 GCTraceTime tm("Scavenge", false, false, &_gc_timer); |
391 ParallelScavengeHeap::ParStrongRootsScope psrs; |
393 ParallelScavengeHeap::ParStrongRootsScope psrs; |
392 |
394 |
393 GCTaskQueue* q = GCTaskQueue::create(); |
395 GCTaskQueue* q = GCTaskQueue::create(); |
394 |
396 |
395 if (!old_gen->object_space()->is_empty()) { |
397 if (!old_gen->object_space()->is_empty()) { |
427 |
429 |
428 scavenge_midpoint.update(); |
430 scavenge_midpoint.update(); |
429 |
431 |
430 // Process reference objects discovered during scavenge |
432 // Process reference objects discovered during scavenge |
431 { |
433 { |
432 GCTraceTime tm("References", false, false, &_gc_timer, _gc_tracer.gc_id()); |
434 GCTraceTime tm("References", false, false, &_gc_timer); |
433 |
435 |
434 reference_processor()->setup_policy(false); // not always_clear |
436 reference_processor()->setup_policy(false); // not always_clear |
435 reference_processor()->set_active_mt_degree(active_workers); |
437 reference_processor()->set_active_mt_degree(active_workers); |
436 PSKeepAliveClosure keep_alive(promotion_manager); |
438 PSKeepAliveClosure keep_alive(promotion_manager); |
437 PSEvacuateFollowersClosure evac_followers(promotion_manager); |
439 PSEvacuateFollowersClosure evac_followers(promotion_manager); |
438 ReferenceProcessorStats stats; |
440 ReferenceProcessorStats stats; |
439 if (reference_processor()->processing_is_mt()) { |
441 if (reference_processor()->processing_is_mt()) { |
440 PSRefProcTaskExecutor task_executor; |
442 PSRefProcTaskExecutor task_executor; |
441 stats = reference_processor()->process_discovered_references( |
443 stats = reference_processor()->process_discovered_references( |
442 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor, |
444 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor, |
443 &_gc_timer, _gc_tracer.gc_id()); |
445 &_gc_timer); |
444 } else { |
446 } else { |
445 stats = reference_processor()->process_discovered_references( |
447 stats = reference_processor()->process_discovered_references( |
446 &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer, _gc_tracer.gc_id()); |
448 &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer); |
447 } |
449 } |
448 |
450 |
449 _gc_tracer.report_gc_reference_stats(stats); |
451 _gc_tracer.report_gc_reference_stats(stats); |
450 |
452 |
451 // Enqueue reference objects discovered during scavenge. |
453 // Enqueue reference objects discovered during scavenge. |
456 reference_processor()->enqueue_discovered_references(NULL); |
458 reference_processor()->enqueue_discovered_references(NULL); |
457 } |
459 } |
458 } |
460 } |
459 |
461 |
460 { |
462 { |
461 GCTraceTime tm("StringTable", false, false, &_gc_timer, _gc_tracer.gc_id()); |
463 GCTraceTime tm("StringTable", false, false, &_gc_timer); |
462 // Unlink any dead interned Strings and process the remaining live ones. |
464 // Unlink any dead interned Strings and process the remaining live ones. |
463 PSScavengeRootsClosure root_closure(promotion_manager); |
465 PSScavengeRootsClosure root_closure(promotion_manager); |
464 StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure); |
466 StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure); |
465 } |
467 } |
466 |
468 |
626 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
628 COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); |
627 |
629 |
628 NOT_PRODUCT(reference_processor()->verify_no_references_recorded()); |
630 NOT_PRODUCT(reference_processor()->verify_no_references_recorded()); |
629 |
631 |
630 { |
632 { |
631 GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer, _gc_tracer.gc_id()); |
633 GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer); |
632 |
634 |
633 CodeCache::prune_scavenge_root_nmethods(); |
635 CodeCache::prune_scavenge_root_nmethods(); |
634 } |
636 } |
635 |
637 |
636 // Re-verify object start arrays |
638 // Re-verify object start arrays |