comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 4095:bca17e38de00

6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads Summary: Select number of GC threads dynamically based on heap usage and number of Java threads Reviewed-by: johnc, ysr, jcoomes
author jmasa
date Tue, 09 Aug 2011 10:16:01 -0700
parents 4dfb2df418f2
children ea640b5e949a
comparison
equal deleted inserted replaced
4094:3a298e04d914 4095:bca17e38de00
4242 _collector->startTimer(); 4242 _collector->startTimer();
4243 } 4243 }
4244 4244
4245 bool CMSCollector::do_marking_mt(bool asynch) { 4245 bool CMSCollector::do_marking_mt(bool asynch) {
4246 assert(ConcGCThreads > 0 && conc_workers() != NULL, "precondition"); 4246 assert(ConcGCThreads > 0 && conc_workers() != NULL, "precondition");
4247 // In the future this would be determined ergonomically, based 4247 int num_workers = AdaptiveSizePolicy::calc_active_conc_workers(
4248 // on #cpu's, # active mutator threads (and load), and mutation rate. 4248 conc_workers()->total_workers(),
4249 int num_workers = ConcGCThreads; 4249 conc_workers()->active_workers(),
4250 Threads::number_of_non_daemon_threads());
4251 conc_workers()->set_active_workers(num_workers);
4250 4252
4251 CompactibleFreeListSpace* cms_space = _cmsGen->cmsSpace(); 4253 CompactibleFreeListSpace* cms_space = _cmsGen->cmsSpace();
4252 CompactibleFreeListSpace* perm_space = _permGen->cmsSpace(); 4254 CompactibleFreeListSpace* perm_space = _permGen->cmsSpace();
4253 4255
4254 CMSConcMarkingTask tsk(this, 4256 CMSConcMarkingTask tsk(this,
5060 // The per-thread work queues, available here for stealing. 5062 // The per-thread work queues, available here for stealing.
5061 OopTaskQueueSet* _task_queues; 5063 OopTaskQueueSet* _task_queues;
5062 ParallelTaskTerminator _term; 5064 ParallelTaskTerminator _term;
5063 5065
5064 public: 5066 public:
5067 // A value of 0 passed to n_workers will cause the number of
5068 // workers to be taken from the active workers in the work gang.
5065 CMSParRemarkTask(CMSCollector* collector, 5069 CMSParRemarkTask(CMSCollector* collector,
5066 CompactibleFreeListSpace* cms_space, 5070 CompactibleFreeListSpace* cms_space,
5067 CompactibleFreeListSpace* perm_space, 5071 CompactibleFreeListSpace* perm_space,
5068 int n_workers, FlexibleWorkGang* workers, 5072 int n_workers, FlexibleWorkGang* workers,
5069 OopTaskQueueSet* task_queues): 5073 OopTaskQueueSet* task_queues):
5542 // Parallel version of remark 5546 // Parallel version of remark
5543 void CMSCollector::do_remark_parallel() { 5547 void CMSCollector::do_remark_parallel() {
5544 GenCollectedHeap* gch = GenCollectedHeap::heap(); 5548 GenCollectedHeap* gch = GenCollectedHeap::heap();
5545 FlexibleWorkGang* workers = gch->workers(); 5549 FlexibleWorkGang* workers = gch->workers();
5546 assert(workers != NULL, "Need parallel worker threads."); 5550 assert(workers != NULL, "Need parallel worker threads.");
5547 int n_workers = workers->total_workers(); 5551 // Choose to use the number of GC workers most recently set
5552 // into "active_workers". If active_workers is not set, set it
5553 // to ParallelGCThreads.
5554 int n_workers = workers->active_workers();
5555 if (n_workers == 0) {
5556 assert(n_workers > 0, "Should have been set during scavenge");
5557 n_workers = ParallelGCThreads;
5558 workers->set_active_workers(n_workers);
5559 }
5548 CompactibleFreeListSpace* cms_space = _cmsGen->cmsSpace(); 5560 CompactibleFreeListSpace* cms_space = _cmsGen->cmsSpace();
5549 CompactibleFreeListSpace* perm_space = _permGen->cmsSpace(); 5561 CompactibleFreeListSpace* perm_space = _permGen->cmsSpace();
5550 5562
5551 CMSParRemarkTask tsk(this, 5563 CMSParRemarkTask tsk(this,
5552 cms_space, perm_space, 5564 cms_space, perm_space,
5882 // Set the degree of MT here. If the discovery is done MT, there 5894 // Set the degree of MT here. If the discovery is done MT, there
5883 // may have been a different number of threads doing the discovery 5895 // may have been a different number of threads doing the discovery
5884 // and a different number of discovered lists may have Ref objects. 5896 // and a different number of discovered lists may have Ref objects.
5885 // That is OK as long as the Reference lists are balanced (see 5897 // That is OK as long as the Reference lists are balanced (see
5886 // balance_all_queues() and balance_queues()). 5898 // balance_all_queues() and balance_queues()).
5887 5899 GenCollectedHeap* gch = GenCollectedHeap::heap();
5888 rp->set_active_mt_degree(ParallelGCThreads); 5900 int active_workers = ParallelGCThreads;
5901 FlexibleWorkGang* workers = gch->workers();
5902 if (workers != NULL) {
5903 active_workers = workers->active_workers();
5904 // The expectation is that active_workers will have already
5905 // been set to a reasonable value. If it has not been set,
5906 // investigate.
5907 assert(active_workers > 0, "Should have been set during scavenge");
5908 }
5909 rp->set_active_mt_degree(active_workers);
5889 CMSRefProcTaskExecutor task_executor(*this); 5910 CMSRefProcTaskExecutor task_executor(*this);
5890 rp->process_discovered_references(&_is_alive_closure, 5911 rp->process_discovered_references(&_is_alive_closure,
5891 &cmsKeepAliveClosure, 5912 &cmsKeepAliveClosure,
5892 &cmsDrainMarkingStackClosure, 5913 &cmsDrainMarkingStackClosure,
5893 &task_executor); 5914 &task_executor);