670 assert(ConcGCThreads > 0, "Should have been set");
671 _parallel_marking_threads = (uint) ConcGCThreads;
672 _max_parallel_marking_threads = _parallel_marking_threads;
673
674 if (parallel_marking_threads() > 1) {
675 _cleanup_task_overhead = 1.0;
676 } else {
677 _cleanup_task_overhead = marking_task_overhead();
678 }
679 _cleanup_sleep_factor =
680 (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
681
682 #if 0
683 gclog_or_tty->print_cr("Marking Threads %d", parallel_marking_threads());
684 gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
685 gclog_or_tty->print_cr("CM Sleep Factor %1.4lf", sleep_factor());
686 gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
687 gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor());
688 #endif
689
690 _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads",
691 _max_parallel_marking_threads, false, true);
692 if (_parallel_workers == NULL) {
693 vm_exit_during_initialization("Failed necessary allocation.");
694 } else {
695 _parallel_workers->initialize_workers();
696 }
697
698 if (FLAG_IS_DEFAULT(MarkStackSize)) {
699 uintx mark_stack_size =
700 MIN2(MarkStackSizeMax,
701 MAX2(MarkStackSize, (uintx) (parallel_marking_threads() * TASKQUEUE_SIZE)));
702 // Verify that the calculated value for MarkStackSize is in range.
703 // It would be nice to use the private utility routine from Arguments.
704 if (!(mark_stack_size >= 1 && mark_stack_size <= MarkStackSizeMax)) {
705 warning("Invalid value calculated for MarkStackSize (" UINTX_FORMAT "): "
706 "must be between " UINTX_FORMAT " and " UINTX_FORMAT,
707 mark_stack_size, (uintx) 1, MarkStackSizeMax);
708 return;
709 }
710 FLAG_SET_ERGO(uintx, MarkStackSize, mark_stack_size);
|
670 assert(ConcGCThreads > 0, "Should have been set");
671 _parallel_marking_threads = (uint) ConcGCThreads;
672 _max_parallel_marking_threads = _parallel_marking_threads;
673
674 if (parallel_marking_threads() > 1) {
675 _cleanup_task_overhead = 1.0;
676 } else {
677 _cleanup_task_overhead = marking_task_overhead();
678 }
679 _cleanup_sleep_factor =
680 (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
681
682 #if 0
683 gclog_or_tty->print_cr("Marking Threads %d", parallel_marking_threads());
684 gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
685 gclog_or_tty->print_cr("CM Sleep Factor %1.4lf", sleep_factor());
686 gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
687 gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor());
688 #endif
689
690 _parallel_workers = new FlexibleWorkGang("G1 Markers",
691 _max_parallel_marking_threads, false, true);
692 if (_parallel_workers == NULL) {
693 vm_exit_during_initialization("Failed necessary allocation.");
694 } else {
695 _parallel_workers->initialize_workers();
696 }
697
698 if (FLAG_IS_DEFAULT(MarkStackSize)) {
699 uintx mark_stack_size =
700 MIN2(MarkStackSizeMax,
701 MAX2(MarkStackSize, (uintx) (parallel_marking_threads() * TASKQUEUE_SIZE)));
702 // Verify that the calculated value for MarkStackSize is in range.
703 // It would be nice to use the private utility routine from Arguments.
704 if (!(mark_stack_size >= 1 && mark_stack_size <= MarkStackSizeMax)) {
705 warning("Invalid value calculated for MarkStackSize (" UINTX_FORMAT "): "
706 "must be between " UINTX_FORMAT " and " UINTX_FORMAT,
707 mark_stack_size, (uintx) 1, MarkStackSizeMax);
708 return;
709 }
710 FLAG_SET_ERGO(uintx, MarkStackSize, mark_stack_size);
|