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) { |