< prev index next >

src/share/vm/gc/parallel/psScavenge.cpp

Print this page




 387       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
 388       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
 389       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
 390 
 391       ParallelTaskTerminator terminator(
 392         active_workers,
 393                   (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
 394       if (active_workers > 1) {
 395         for (uint j = 0; j < active_workers; j++) {
 396           q->enqueue(new StealTask(&terminator));
 397         }
 398       }
 399 
 400       gc_task_manager()->execute_and_wait(q);
 401     }
 402 
 403     scavenge_midpoint.update();
 404 
 405     // Process reference objects discovered during scavenge
 406     {
 407       GCTraceTime(Debug, gc, phases) tm("References", &_gc_timer);
 408 
 409       reference_processor()->setup_policy(false); // not always_clear
 410       reference_processor()->set_active_mt_degree(active_workers);
 411       PSKeepAliveClosure keep_alive(promotion_manager);
 412       PSEvacuateFollowersClosure evac_followers(promotion_manager);
 413       ReferenceProcessorStats stats;
 414       if (reference_processor()->processing_is_mt()) {
 415         PSRefProcTaskExecutor task_executor;
 416         stats = reference_processor()->process_discovered_references(
 417           &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
 418           &_gc_timer);
 419       } else {
 420         stats = reference_processor()->process_discovered_references(
 421           &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer);
 422       }
 423 
 424       _gc_tracer.report_gc_reference_stats(stats);
 425 
 426       // Enqueue reference objects discovered during scavenge.
 427       if (reference_processor()->processing_is_mt()) {
 428         PSRefProcTaskExecutor task_executor;
 429         reference_processor()->enqueue_discovered_references(&task_executor);
 430       } else {
 431         reference_processor()->enqueue_discovered_references(NULL);
 432       }
 433     }
 434 
 435     {
 436       GCTraceTime(Debug, gc, phases) tm("StringTable", &_gc_timer);
 437       // Unlink any dead interned Strings and process the remaining live ones.
 438       PSScavengeRootsClosure root_closure(promotion_manager);
 439       StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
 440     }
 441 
 442     // Finally, flush the promotion_manager's labs, and deallocate its stacks.
 443     promotion_failure_occurred = PSPromotionManager::post_scavenge(_gc_tracer);
 444     if (promotion_failure_occurred) {
 445       clean_up_failed_promotion();
 446       log_info(gc)("Promotion failed");
 447     }
 448 
 449     _gc_tracer.report_tenuring_threshold(tenuring_threshold());
 450 
 451     // Let the size policy know we're done.  Note that we count promotion
 452     // failure cleanup time as part of the collection (otherwise, we're
 453     // implicitly saying it's mutator time).
 454     size_policy->minor_collection_end(gc_cause);
 455 
 456     if (!promotion_failure_occurred) {




 387       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
 388       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
 389       q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
 390 
 391       ParallelTaskTerminator terminator(
 392         active_workers,
 393                   (TaskQueueSetSuper*) promotion_manager->stack_array_depth());
 394       if (active_workers > 1) {
 395         for (uint j = 0; j < active_workers; j++) {
 396           q->enqueue(new StealTask(&terminator));
 397         }
 398       }
 399 
 400       gc_task_manager()->execute_and_wait(q);
 401     }
 402 
 403     scavenge_midpoint.update();
 404 
 405     // Process reference objects discovered during scavenge
 406     {
 407       GCTraceTime(Debug, gc, phases) tm("Reference Processing", &_gc_timer);
 408 
 409       reference_processor()->setup_policy(false); // not always_clear
 410       reference_processor()->set_active_mt_degree(active_workers);
 411       PSKeepAliveClosure keep_alive(promotion_manager);
 412       PSEvacuateFollowersClosure evac_followers(promotion_manager);
 413       ReferenceProcessorStats stats;
 414       if (reference_processor()->processing_is_mt()) {
 415         PSRefProcTaskExecutor task_executor;
 416         stats = reference_processor()->process_discovered_references(
 417           &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
 418           &_gc_timer);
 419       } else {
 420         stats = reference_processor()->process_discovered_references(
 421           &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer);
 422       }
 423 
 424       _gc_tracer.report_gc_reference_stats(stats);
 425 
 426       // Enqueue reference objects discovered during scavenge.
 427       if (reference_processor()->processing_is_mt()) {
 428         PSRefProcTaskExecutor task_executor;
 429         reference_processor()->enqueue_discovered_references(&task_executor);
 430       } else {
 431         reference_processor()->enqueue_discovered_references(NULL);
 432       }
 433     }
 434 
 435     {
 436       GCTraceTime(Debug, gc, phases) tm("Scrub String Table", &_gc_timer);
 437       // Unlink any dead interned Strings and process the remaining live ones.
 438       PSScavengeRootsClosure root_closure(promotion_manager);
 439       StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
 440     }
 441 
 442     // Finally, flush the promotion_manager's labs, and deallocate its stacks.
 443     promotion_failure_occurred = PSPromotionManager::post_scavenge(_gc_tracer);
 444     if (promotion_failure_occurred) {
 445       clean_up_failed_promotion();
 446       log_info(gc)("Promotion failed");
 447     }
 448 
 449     _gc_tracer.report_tenuring_threshold(tenuring_threshold());
 450 
 451     // Let the size policy know we're done.  Note that we count promotion
 452     // failure cleanup time as part of the collection (otherwise, we're
 453     // implicitly saying it's mutator time).
 454     size_policy->minor_collection_end(gc_cause);
 455 
 456     if (!promotion_failure_occurred) {


< prev index next >