Mon, 03 Aug 2009 12:59:30 -0700
6865703: G1: Parallelize hot card cache cleanup
Summary: Have the GC worker threads clear the hot card cache in parallel by having each worker thread claim a chunk of the card cache and process the cards in that chunk. The size of the chunks that each thread will claim is determined at VM initialization from the size of the card cache and the number of worker threads.
Reviewed-by: jmasa, tonyp
1 /*
2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
25 //
26 // Defines all globals flags used by the garbage-first compiler.
27 //
29 #define G1_FLAGS(develop, develop_pd, product, product_pd, diagnostic, experimental, notproduct, manageable, product_rw) \
30 \
31 product(intx, G1ParallelGCAllocBufferSize, 8*K, \
32 "Size of parallel G1 allocation buffers in to-space.") \
33 \
34 product(intx, G1ConfidencePercent, 50, \
35 "Confidence level for MMU/pause predictions") \
36 \
37 develop(intx, G1MarkingOverheadPercent, 0, \
38 "Overhead of concurrent marking") \
39 \
40 develop(bool, G1AccountConcurrentOverhead, false, \
41 "Whether soft real-time compliance in G1 will take into account" \
42 "concurrent overhead") \
43 \
44 product(intx, G1YoungGenSize, 0, \
45 "Size of the G1 young generation, 0 is the adaptive policy") \
46 \
47 develop(bool, G1Gen, true, \
48 "If true, it will enable the generational G1") \
49 \
50 develop(intx, G1GCPercent, 10, \
51 "The desired percent time spent on GC") \
52 \
53 develop(intx, G1PolicyVerbose, 0, \
54 "The verbosity level on G1 policy decisions") \
55 \
56 develop(bool, G1UseHRIntoRS, true, \
57 "Determines whether the 'advanced' HR Into rem set is used.") \
58 \
59 develop(intx, G1MarkingVerboseLevel, 0, \
60 "Level (0-4) of verboseness of the marking code") \
61 \
62 develop(bool, G1VerifyConcMarkPrintReachable, false, \
63 "If conc mark verification fails, print reachable objects") \
64 \
65 develop(bool, G1TraceMarkStackOverflow, false, \
66 "If true, extra debugging code for CM restart for ovflw.") \
67 \
68 develop(intx, G1PausesBtwnConcMark, -1, \
69 "If positive, fixed number of pauses between conc markings") \
70 \
71 diagnostic(bool, G1SummarizeConcurrentMark, false, \
72 "Summarize concurrent mark info") \
73 \
74 diagnostic(bool, G1SummarizeRSetStats, false, \
75 "Summarize remembered set processing info") \
76 \
77 diagnostic(intx, G1SummarizeRSetStatsPeriod, 0, \
78 "The period (in number of GCs) at which we will generate " \
79 "update buffer processing info " \
80 "(0 means do not periodically generate this info); " \
81 "it also requires -XX:+G1SummarizeRSetStats") \
82 \
83 diagnostic(bool, G1SummarizeZFStats, false, \
84 "Summarize zero-filling info") \
85 \
86 develop(bool, G1TraceConcurrentRefinement, false, \
87 "Trace G1 concurrent refinement") \
88 \
89 product(intx, G1MarkStackSize, 2 * 1024 * 1024, \
90 "Size of the mark stack for concurrent marking.") \
91 \
92 product(intx, G1MarkRegionStackSize, 1024 * 1024, \
93 "Size of the region stack for concurrent marking.") \
94 \
95 develop(bool, G1ConcRefine, true, \
96 "If true, run concurrent rem set refinement for G1") \
97 \
98 develop(intx, G1ConcRefineTargTraversals, 4, \
99 "Number of concurrent refinement we try to achieve") \
100 \
101 develop(intx, G1ConcRefineInitialDelta, 4, \
102 "Number of heap regions of alloc ahead of starting collection " \
103 "pause to start concurrent refinement (initially)") \
104 \
105 develop(bool, G1SmoothConcRefine, true, \
106 "Attempts to smooth out the overhead of concurrent refinement") \
107 \
108 develop(bool, G1ConcZeroFill, true, \
109 "If true, run concurrent zero-filling thread") \
110 \
111 develop(intx, G1ConcZFMaxRegions, 1, \
112 "Stop zero-filling when # of zf'd regions reaches") \
113 \
114 product(intx, G1SteadyStateUsed, 90, \
115 "If non-0, try to maintain 'used' at this pct (of max)") \
116 \
117 product(intx, G1SteadyStateUsedDelta, 30, \
118 "If G1SteadyStateUsed is non-0, then do pause this number of " \
119 "of percentage points earlier if no marking is in progress.") \
120 \
121 develop(bool, G1SATBBarrierPrintNullPreVals, false, \
122 "If true, count frac of ptr writes with null pre-vals.") \
123 \
124 product(intx, G1SATBLogBufferSize, 1*K, \
125 "Number of entries in an SATB log buffer.") \
126 \
127 product(intx, G1SATBProcessCompletedThreshold, 20, \
128 "Number of completed buffers that triggers log processing.") \
129 \
130 develop(intx, G1ExtraRegionSurvRate, 33, \
131 "If the young survival rate is S, and there's room left in " \
132 "to-space, we will allow regions whose survival rate is up to " \
133 "S + (1 - S)*X, where X is this parameter (as a fraction.)") \
134 \
135 develop(intx, G1InitYoungSurvRatio, 50, \
136 "Expected Survival Rate for newly allocated bytes") \
137 \
138 develop(bool, G1SATBPrintStubs, false, \
139 "If true, print generated stubs for the SATB barrier") \
140 \
141 product(intx, G1ExpandByPercentOfAvailable, 20, \
142 "When expanding, % of uncommitted space to claim.") \
143 \
144 develop(bool, G1RSBarrierRegionFilter, true, \
145 "If true, generate region filtering code in RS barrier") \
146 \
147 develop(bool, G1RSBarrierNullFilter, true, \
148 "If true, generate null-pointer filtering code in RS barrier") \
149 \
150 develop(bool, G1PrintCTFilterStats, false, \
151 "If true, print stats on RS filtering effectiveness") \
152 \
153 develop(bool, G1DeferredRSUpdate, true, \
154 "If true, use deferred RS updates") \
155 \
156 develop(bool, G1RSLogCheckCardTable, false, \
157 "If true, verify that no dirty cards remain after RS log " \
158 "processing.") \
159 \
160 develop(bool, G1RSCountHisto, false, \
161 "If true, print a histogram of RS occupancies after each pause") \
162 \
163 develop(intx, G1PrintRegionLivenessInfo, 0, \
164 "When > 0, print the occupancies of the <n> best and worst" \
165 "regions.") \
166 \
167 develop(bool, G1PrintParCleanupStats, false, \
168 "When true, print extra stats about parallel cleanup.") \
169 \
170 develop(bool, G1DisablePreBarrier, false, \
171 "Disable generation of pre-barrier (i.e., marking barrier) ") \
172 \
173 develop(bool, G1DisablePostBarrier, false, \
174 "Disable generation of post-barrier (i.e., RS barrier) ") \
175 \
176 product(intx, G1UpdateBufferSize, 256, \
177 "Size of an update buffer") \
178 \
179 product(intx, G1UpdateBufferQueueProcessingThreshold, 5, \
180 "Number of enqueued update buffers that will " \
181 "trigger concurrent processing") \
182 \
183 product(intx, G1UpdateBufferQueueMaxLength, 30, \
184 "Maximum number of enqueued update buffers before mutator " \
185 "threads start processing new ones instead of enqueueing them") \
186 \
187 develop(intx, G1ConcRSLogCacheSize, 10, \
188 "Log base 2 of the length of conc RS hot-card cache.") \
189 \
190 develop(bool, G1ConcRSCountTraversals, false, \
191 "If true, gather data about the number of times CR traverses " \
192 "cards ") \
193 \
194 develop(intx, G1ConcRSHotCardLimit, 4, \
195 "The threshold that defines (>=) a hot card.") \
196 \
197 develop(bool, G1PrintOopAppls, false, \
198 "When true, print applications of closures to external locs.") \
199 \
200 develop(intx, G1LogRSRegionEntries, 7, \
201 "Log_2 of max number of regions for which we keep bitmaps.") \
202 \
203 develop(bool, G1RecordHRRSOops, false, \
204 "When true, record recent calls to rem set operations.") \
205 \
206 develop(bool, G1RecordHRRSEvents, false, \
207 "When true, record recent calls to rem set operations.") \
208 \
209 develop(intx, G1MaxVerifyFailures, -1, \
210 "The maximum number of verification failrues to print. " \
211 "-1 means print all.") \
212 \
213 develop(bool, G1ScrubRemSets, true, \
214 "When true, do RS scrubbing after cleanup.") \
215 \
216 develop(bool, G1RSScrubVerbose, false, \
217 "When true, do RS scrubbing with verbose output.") \
218 \
219 develop(bool, G1YoungSurvRateVerbose, false, \
220 "print out the survival rate of young regions according to age.") \
221 \
222 develop(intx, G1YoungSurvRateNumRegionsSummary, 0, \
223 "the number of regions for which we'll print a surv rate " \
224 "summary.") \
225 \
226 product(bool, G1UseScanOnlyPrefix, false, \
227 "It determines whether the system will calculate an optimum " \
228 "scan-only set.") \
229 \
230 product(intx, G1MinReservePercent, 10, \
231 "It determines the minimum reserve we should have in the heap " \
232 "to minimize the probability of promotion failure.") \
233 \
234 diagnostic(bool, G1PrintRegions, false, \
235 "If set G1 will print information on which regions are being " \
236 "allocated and which are reclaimed.") \
237 \
238 develop(bool, G1HRRSUseSparseTable, true, \
239 "When true, use sparse table to save space.") \
240 \
241 develop(bool, G1HRRSFlushLogBuffersOnVerify, false, \
242 "Forces flushing of log buffers before verification.") \
243 \
244 product(bool, G1UseSurvivorSpaces, true, \
245 "When true, use survivor space.") \
246 \
247 develop(bool, G1FixedTenuringThreshold, false, \
248 "When set, G1 will not adjust the tenuring threshold") \
249 \
250 develop(bool, G1FixedEdenSize, false, \
251 "When set, G1 will not allocate unused survivor space regions") \
252 \
253 develop(uintx, G1FixedSurvivorSpaceSize, 0, \
254 "If non-0 is the size of the G1 survivor space, " \
255 "otherwise SurvivorRatio is used to determine the size") \
256 \
257 experimental(bool, G1ParallelRSetUpdatingEnabled, false, \
258 "Enables the parallelization of remembered set updating " \
259 "during evacuation pauses") \
260 \
261 experimental(bool, G1ParallelRSetScanningEnabled, false, \
262 "Enables the parallelization of remembered set scanning " \
263 "during evacuation pauses") \
264 \
265 product(uintx, G1ParallelRSetThreads, 0, \
266 "If non-0 is the number of parallel rem set update threads, " \
267 "otherwise the value is determined ergonomically.")
269 G1_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG, DECLARE_MANAGEABLE_FLAG, DECLARE_PRODUCT_RW_FLAG)