Mercurial > hg > graal-jvmci-8
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); |