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 ReferenceProcessorPhaseTimes pt(&_gc_timer,
419 reference_processor()->num_q(),
420 reference_processor()->processing_is_mt());
421 if (reference_processor()->processing_is_mt()) {
422 PSRefProcTaskExecutor task_executor;
423 stats = reference_processor()->process_discovered_references(
424 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
425 &pt);
426 } else {
427 stats = reference_processor()->process_discovered_references(
428 &_is_alive_closure, &keep_alive, &evac_followers, NULL, &pt);
429 }
430
431 _gc_tracer.report_gc_reference_stats(stats);
432 pt.print_all_references();
433
434 // Enqueue reference objects discovered during scavenge.
435 if (reference_processor()->processing_is_mt()) {
436 PSRefProcTaskExecutor task_executor;
437 reference_processor()->enqueue_discovered_references(&task_executor, &pt);
438 } else {
439 reference_processor()->enqueue_discovered_references(NULL, &pt);
440 }
|
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 ReferenceProcessorPhaseTimes pt(&_gc_timer, reference_processor()->num_q());
419 if (reference_processor()->processing_is_mt()) {
420 PSRefProcTaskExecutor task_executor;
421 stats = reference_processor()->process_discovered_references(
422 &_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
423 &pt);
424 } else {
425 stats = reference_processor()->process_discovered_references(
426 &_is_alive_closure, &keep_alive, &evac_followers, NULL, &pt);
427 }
428
429 _gc_tracer.report_gc_reference_stats(stats);
430 pt.print_all_references();
431
432 // Enqueue reference objects discovered during scavenge.
433 if (reference_processor()->processing_is_mt()) {
434 PSRefProcTaskExecutor task_executor;
435 reference_processor()->enqueue_discovered_references(&task_executor, &pt);
436 } else {
437 reference_processor()->enqueue_discovered_references(NULL, &pt);
438 }
|