Mon, 02 Aug 2010 12:51:43 -0700
6814437: G1: remove the _new_refs array
Summary: The per-worker _new_refs array is used to hold references that point into the collection set. It is populated during RSet updating and subsequently processed. In the event of an evacuation failure it processed again to recreate the RSets of regions in the collection set. Remove the per-worker _new_refs array by processing the references directly. Use a DirtyCardQueue to hold the cards containing the references so that the RSets of regions in the collection set can be recreated when handling an evacuation failure.
Reviewed-by: iveresov, jmasa, tonyp
1 /*
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * 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, G1ConfidencePercent, 50, \
32 "Confidence level for MMU/pause predictions") \
33 \
34 develop(intx, G1MarkingOverheadPercent, 0, \
35 "Overhead of concurrent marking") \
36 \
37 develop(bool, G1Gen, true, \
38 "If true, it will enable the generational G1") \
39 \
40 develop(intx, G1PolicyVerbose, 0, \
41 "The verbosity level on G1 policy decisions") \
42 \
43 develop(bool, G1UseHRIntoRS, true, \
44 "Determines whether the 'advanced' HR Into rem set is used.") \
45 \
46 develop(intx, G1MarkingVerboseLevel, 0, \
47 "Level (0-4) of verboseness of the marking code") \
48 \
49 develop(bool, G1PrintReachableAtInitialMark, false, \
50 "Reachable object dump at the initial mark pause") \
51 \
52 develop(bool, G1VerifyDuringGCPrintReachable, false, \
53 "If conc mark verification fails, dump reachable objects") \
54 \
55 develop(ccstr, G1PrintReachableBaseFile, NULL, \
56 "The base file name for the reachable object dumps") \
57 \
58 develop(bool, G1TraceMarkStackOverflow, false, \
59 "If true, extra debugging code for CM restart for ovflw.") \
60 \
61 develop(intx, G1PausesBtwnConcMark, -1, \
62 "If positive, fixed number of pauses between conc markings") \
63 \
64 diagnostic(bool, G1SummarizeConcMark, false, \
65 "Summarize concurrent mark info") \
66 \
67 diagnostic(bool, G1SummarizeRSetStats, false, \
68 "Summarize remembered set processing info") \
69 \
70 diagnostic(intx, G1SummarizeRSetStatsPeriod, 0, \
71 "The period (in number of GCs) at which we will generate " \
72 "update buffer processing info " \
73 "(0 means do not periodically generate this info); " \
74 "it also requires -XX:+G1SummarizeRSetStats") \
75 \
76 diagnostic(bool, G1SummarizeZFStats, false, \
77 "Summarize zero-filling info") \
78 \
79 diagnostic(bool, G1TraceConcRefinement, false, \
80 "Trace G1 concurrent refinement") \
81 \
82 product(intx, G1MarkRegionStackSize, 1024 * 1024, \
83 "Size of the region stack for concurrent marking.") \
84 \
85 develop(bool, G1ConcZeroFill, true, \
86 "If true, run concurrent zero-filling thread") \
87 \
88 develop(intx, G1ConcZFMaxRegions, 1, \
89 "Stop zero-filling when # of zf'd regions reaches") \
90 \
91 develop(bool, G1SATBBarrierPrintNullPreVals, false, \
92 "If true, count frac of ptr writes with null pre-vals.") \
93 \
94 product(intx, G1SATBBufferSize, 1*K, \
95 "Number of entries in an SATB log buffer.") \
96 \
97 develop(intx, G1SATBProcessCompletedThreshold, 20, \
98 "Number of completed buffers that triggers log processing.") \
99 \
100 develop(intx, G1ExtraRegionSurvRate, 33, \
101 "If the young survival rate is S, and there's room left in " \
102 "to-space, we will allow regions whose survival rate is up to " \
103 "S + (1 - S)*X, where X is this parameter (as a fraction.)") \
104 \
105 develop(intx, G1InitYoungSurvRatio, 50, \
106 "Expected Survival Rate for newly allocated bytes") \
107 \
108 develop(bool, G1SATBPrintStubs, false, \
109 "If true, print generated stubs for the SATB barrier") \
110 \
111 experimental(intx, G1ExpandByPercentOfAvailable, 20, \
112 "When expanding, % of uncommitted space to claim.") \
113 \
114 develop(bool, G1RSBarrierRegionFilter, true, \
115 "If true, generate region filtering code in RS barrier") \
116 \
117 develop(bool, G1RSBarrierNullFilter, true, \
118 "If true, generate null-pointer filtering code in RS barrier") \
119 \
120 develop(bool, G1PrintCTFilterStats, false, \
121 "If true, print stats on RS filtering effectiveness") \
122 \
123 develop(bool, G1DeferredRSUpdate, true, \
124 "If true, use deferred RS updates") \
125 \
126 develop(bool, G1RSLogCheckCardTable, false, \
127 "If true, verify that no dirty cards remain after RS log " \
128 "processing.") \
129 \
130 develop(bool, G1RSCountHisto, false, \
131 "If true, print a histogram of RS occupancies after each pause") \
132 \
133 develop(intx, G1PrintRegionLivenessInfo, 0, \
134 "When > 0, print the occupancies of the <n> best and worst" \
135 "regions.") \
136 \
137 develop(bool, G1PrintParCleanupStats, false, \
138 "When true, print extra stats about parallel cleanup.") \
139 \
140 develop(bool, G1DisablePreBarrier, false, \
141 "Disable generation of pre-barrier (i.e., marking barrier) ") \
142 \
143 develop(bool, G1DisablePostBarrier, false, \
144 "Disable generation of post-barrier (i.e., RS barrier) ") \
145 \
146 product(intx, G1UpdateBufferSize, 256, \
147 "Size of an update buffer") \
148 \
149 product(intx, G1ConcRefinementYellowZone, 0, \
150 "Number of enqueued update buffers that will " \
151 "trigger concurrent processing. Will be selected ergonomically " \
152 "by default.") \
153 \
154 product(intx, G1ConcRefinementRedZone, 0, \
155 "Maximum number of enqueued update buffers before mutator " \
156 "threads start processing new ones instead of enqueueing them. " \
157 "Will be selected ergonomically by default. Zero will disable " \
158 "concurrent processing.") \
159 \
160 product(intx, G1ConcRefinementGreenZone, 0, \
161 "The number of update buffers that are left in the queue by the " \
162 "concurrent processing threads. Will be selected ergonomically " \
163 "by default.") \
164 \
165 product(intx, G1ConcRefinementServiceIntervalMillis, 300, \
166 "The last concurrent refinement thread wakes up every " \
167 "specified number of milliseconds to do miscellaneous work.") \
168 \
169 product(intx, G1ConcRefinementThresholdStep, 0, \
170 "Each time the rset update queue increases by this amount " \
171 "activate the next refinement thread if available. " \
172 "Will be selected ergonomically by default.") \
173 \
174 product(intx, G1RSetUpdatingPauseTimePercent, 10, \
175 "A target percentage of time that is allowed to be spend on " \
176 "process RS update buffers during the collection pause.") \
177 \
178 product(bool, G1UseAdaptiveConcRefinement, true, \
179 "Select green, yellow and red zones adaptively to meet the " \
180 "the pause requirements.") \
181 \
182 develop(intx, G1ConcRSLogCacheSize, 10, \
183 "Log base 2 of the length of conc RS hot-card cache.") \
184 \
185 develop(intx, G1ConcRSHotCardLimit, 4, \
186 "The threshold that defines (>=) a hot card.") \
187 \
188 develop(bool, G1PrintOopAppls, false, \
189 "When true, print applications of closures to external locs.") \
190 \
191 develop(intx, G1RSetRegionEntriesBase, 256, \
192 "Max number of regions in a fine-grain table per MB.") \
193 \
194 product(intx, G1RSetRegionEntries, 0, \
195 "Max number of regions for which we keep bitmaps." \
196 "Will be set ergonomically by default") \
197 \
198 develop(intx, G1RSetSparseRegionEntriesBase, 4, \
199 "Max number of entries per region in a sparse table " \
200 "per MB.") \
201 \
202 product(intx, G1RSetSparseRegionEntries, 0, \
203 "Max number of entries per region in a sparse table." \
204 "Will be set ergonomically by default.") \
205 \
206 develop(bool, G1RecordHRRSOops, false, \
207 "When true, record recent calls to rem set operations.") \
208 \
209 develop(bool, G1RecordHRRSEvents, false, \
210 "When true, record recent calls to rem set operations.") \
211 \
212 develop(intx, G1MaxVerifyFailures, -1, \
213 "The maximum number of verification failrues to print. " \
214 "-1 means print all.") \
215 \
216 develop(bool, G1ScrubRemSets, true, \
217 "When true, do RS scrubbing after cleanup.") \
218 \
219 develop(bool, G1RSScrubVerbose, false, \
220 "When true, do RS scrubbing with verbose output.") \
221 \
222 develop(bool, G1YoungSurvRateVerbose, false, \
223 "print out the survival rate of young regions according to age.") \
224 \
225 develop(intx, G1YoungSurvRateNumRegionsSummary, 0, \
226 "the number of regions for which we'll print a surv rate " \
227 "summary.") \
228 \
229 product(intx, G1ReservePercent, 10, \
230 "It determines the minimum reserve we should have in the heap " \
231 "to minimize the probability of promotion failure.") \
232 \
233 diagnostic(bool, G1PrintHeapRegions, false, \
234 "If set G1 will print information on which regions are being " \
235 "allocated and which are reclaimed.") \
236 \
237 develop(bool, G1HRRSUseSparseTable, true, \
238 "When true, use sparse table to save space.") \
239 \
240 develop(bool, G1HRRSFlushLogBuffersOnVerify, false, \
241 "Forces flushing of log buffers before verification.") \
242 \
243 develop(bool, G1FailOnFPError, false, \
244 "When set, G1 will fail when it encounters an FP 'error', " \
245 "so as to allow debugging") \
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 product(uintx, G1HeapRegionSize, 0, \
258 "Size of the G1 regions.") \
259 \
260 experimental(bool, G1UseParallelRSetUpdating, true, \
261 "Enables the parallelization of remembered set updating " \
262 "during evacuation pauses") \
263 \
264 experimental(bool, G1UseParallelRSetScanning, true, \
265 "Enables the parallelization of remembered set scanning " \
266 "during evacuation pauses") \
267 \
268 product(uintx, G1ConcRefinementThreads, 0, \
269 "If non-0 is the number of parallel rem set update threads, " \
270 "otherwise the value is determined ergonomically.") \
271 \
272 develop(intx, G1CardCountCacheExpandThreshold, 16, \
273 "Expand the card count cache if the number of collisions for " \
274 "a particular entry exceeds this value.") \
275 \
276 develop(bool, G1VerifyCTCleanup, false, \
277 "Verify card table cleanup.") \
278 \
279 product(uintx, G1RSetScanBlockSize, 64, \
280 "Size of a work unit of cards claimed by a worker thread" \
281 "during RSet scanning.") \
282 \
283 develop(bool, ReduceInitialCardMarksForG1, false, \
284 "When ReduceInitialCardMarks is true, this flag setting " \
285 " controls whether G1 allows the RICM optimization")
287 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)