555 SATBMarkQueueSet& satb_qs = JavaThread::satb_mark_queue_set();
556 satb_qs.set_buffer_size(G1SATBBufferSize);
557
558 _root_regions.init(_g1h, this);
559
560 if (ConcGCThreads > ParallelGCThreads) {
561 warning("Can't have more ConcGCThreads (" UINT32_FORMAT ") "
562 "than ParallelGCThreads (" UINT32_FORMAT ").",
563 ConcGCThreads, ParallelGCThreads);
564 return;
565 }
566 if (ParallelGCThreads == 0) {
567 // if we are not running with any parallel GC threads we will not
568 // spawn any marking threads either
569 _parallel_marking_threads = 0;
570 _max_parallel_marking_threads = 0;
571 _sleep_factor = 0.0;
572 _marking_task_overhead = 1.0;
573 } else {
574 if (ConcGCThreads > 0) {
575 // notice that ConcGCThreads overwrites G1MarkingOverheadPercent
576 // if both are set
577
578 _parallel_marking_threads = (uint) ConcGCThreads;
579 _max_parallel_marking_threads = _parallel_marking_threads;
580 _sleep_factor = 0.0;
581 _marking_task_overhead = 1.0;
582 } else if (G1MarkingOverheadPercent > 0) {
583 // we will calculate the number of parallel marking threads
584 // based on a target overhead with respect to the soft real-time
585 // goal
586
587 double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
588 double overall_cm_overhead =
589 (double) MaxGCPauseMillis * marking_overhead /
590 (double) GCPauseIntervalMillis;
591 double cpu_ratio = 1.0 / (double) os::processor_count();
592 double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
593 double marking_task_overhead =
594 overall_cm_overhead / marking_thread_num *
595 (double) os::processor_count();
596 double sleep_factor =
597 (1.0 - marking_task_overhead) / marking_task_overhead;
598
599 _parallel_marking_threads = (uint) marking_thread_num;
600 _max_parallel_marking_threads = _parallel_marking_threads;
601 _sleep_factor = sleep_factor;
602 _marking_task_overhead = marking_task_overhead;
603 } else {
604 _parallel_marking_threads = scale_parallel_threads((uint)ParallelGCThreads);
605 _max_parallel_marking_threads = _parallel_marking_threads;
606 _sleep_factor = 0.0;
607 _marking_task_overhead = 1.0;
608 }
609
610 if (parallel_marking_threads() > 1) {
611 _cleanup_task_overhead = 1.0;
612 } else {
613 _cleanup_task_overhead = marking_task_overhead();
614 }
615 _cleanup_sleep_factor =
616 (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
617
618 #if 0
619 gclog_or_tty->print_cr("Marking Threads %d", parallel_marking_threads());
620 gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
621 gclog_or_tty->print_cr("CM Sleep Factor %1.4lf", sleep_factor());
622 gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
623 gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor());
624 #endif
625
626 guarantee(parallel_marking_threads() > 0, "peace of mind");
627 _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads",
628 _max_parallel_marking_threads, false, true);
629 if (_parallel_workers == NULL) {
|
555 SATBMarkQueueSet& satb_qs = JavaThread::satb_mark_queue_set();
556 satb_qs.set_buffer_size(G1SATBBufferSize);
557
558 _root_regions.init(_g1h, this);
559
560 if (ConcGCThreads > ParallelGCThreads) {
561 warning("Can't have more ConcGCThreads (" UINT32_FORMAT ") "
562 "than ParallelGCThreads (" UINT32_FORMAT ").",
563 ConcGCThreads, ParallelGCThreads);
564 return;
565 }
566 if (ParallelGCThreads == 0) {
567 // if we are not running with any parallel GC threads we will not
568 // spawn any marking threads either
569 _parallel_marking_threads = 0;
570 _max_parallel_marking_threads = 0;
571 _sleep_factor = 0.0;
572 _marking_task_overhead = 1.0;
573 } else {
574 if (ConcGCThreads > 0) {
575 // Note: ConcGCThreads has precedence over G1MarkingOverheadPercent
576 // if both are set
577 _sleep_factor = 0.0;
578 _marking_task_overhead = 1.0;
579 } else if (G1MarkingOverheadPercent > 0) {
580 // We will calculate the number of parallel marking threads based
581 // on a target overhead with respect to the soft real-time goal
582 double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
583 double overall_cm_overhead =
584 (double) MaxGCPauseMillis * marking_overhead /
585 (double) GCPauseIntervalMillis;
586 double cpu_ratio = 1.0 / (double) os::processor_count();
587 double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
588 double marking_task_overhead =
589 overall_cm_overhead / marking_thread_num *
590 (double) os::processor_count();
591 double sleep_factor =
592 (1.0 - marking_task_overhead) / marking_task_overhead;
593
594 FLAG_SET_ERGO(uintx, ConcGCThreads, (uint) marking_thread_num);
595 _sleep_factor = sleep_factor;
596 _marking_task_overhead = marking_task_overhead;
597 } else {
598 // Calculate the number of parallel marking threads by scaling
599 // the number of parallel GC threads.
600 uint marking_thread_num = scale_parallel_threads((uint) ParallelGCThreads);
601 FLAG_SET_ERGO(uintx, ConcGCThreads, marking_thread_num);
602 _sleep_factor = 0.0;
603 _marking_task_overhead = 1.0;
604 }
605
606 assert(ConcGCThreads > 0, "Should have been set");
607 _parallel_marking_threads = (uint) ConcGCThreads;
608 _max_parallel_marking_threads = _parallel_marking_threads;
609
610 if (parallel_marking_threads() > 1) {
611 _cleanup_task_overhead = 1.0;
612 } else {
613 _cleanup_task_overhead = marking_task_overhead();
614 }
615 _cleanup_sleep_factor =
616 (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
617
618 #if 0
619 gclog_or_tty->print_cr("Marking Threads %d", parallel_marking_threads());
620 gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
621 gclog_or_tty->print_cr("CM Sleep Factor %1.4lf", sleep_factor());
622 gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
623 gclog_or_tty->print_cr("CL Sleep Factor %1.4lf", cleanup_sleep_factor());
624 #endif
625
626 guarantee(parallel_marking_threads() > 0, "peace of mind");
627 _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads",
628 _max_parallel_marking_threads, false, true);
629 if (_parallel_workers == NULL) {
|