374 for(uint i=0; i < stripe_total; i++) {
375 q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i, stripe_total));
376 }
377 }
378
379 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::universe));
380 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jni_handles));
381 // We scan the thread roots in parallel
382 Threads::create_thread_roots_tasks(q);
383 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::object_synchronizer));
384 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
385 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
386 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary));
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()) {
|
374 for(uint i=0; i < stripe_total; i++) {
375 q->enqueue(new OldToYoungRootsTask(old_gen, old_top, i, stripe_total));
376 }
377 }
378
379 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::universe));
380 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jni_handles));
381 // We scan the thread roots in parallel
382 Threads::create_thread_roots_tasks(q);
383 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::object_synchronizer));
384 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::flat_profiler));
385 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::management));
386 q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::system_dictionary));
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 can exceed 1, add a StrealTask.
395 // PSPromotionManager::drain_stacks_depth() does not fully drain its
396 // stacks and expects a StealTask to complete the draining if
397 // ParallelGCThreads is > 1.
398 if (gc_task_manager()->workers() > 1) {
399 for (uint j = 0; j < active_workers; j++) {
400 q->enqueue(new StealTask(&terminator));
401 }
402 }
403
404 gc_task_manager()->execute_and_wait(q);
405 }
406
407 scavenge_midpoint.update();
408
409 // Process reference objects discovered during scavenge
410 {
411 GCTraceTime(Debug, gc, phases) tm("Reference Processing", &_gc_timer);
412
413 reference_processor()->setup_policy(false); // not always_clear
414 reference_processor()->set_active_mt_degree(active_workers);
415 PSKeepAliveClosure keep_alive(promotion_manager);
416 PSEvacuateFollowersClosure evac_followers(promotion_manager);
417 ReferenceProcessorStats stats;
418 if (reference_processor()->processing_is_mt()) {
|