Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp @ 3285:49a67202bc67
7011855: G1: non-product flag to artificially grow the heap
Summary: It introduces non-product cmd line parameter G1DummyRegionsPerGC which indicates how many "dummy" regions to allocate at the end of each GC. This allows the G1 heap to grow artificially and makes concurrent marking cycles more frequent irrespective of what the application that is running is doing. The dummy regions will be found totally empty during cleanup so this parameter can also be used to stress the concurrent cleanup operation.
Reviewed-by: brutisso, johnc
author | tonyp |
---|---|
date | Tue, 19 Apr 2011 15:46:59 -0400 |
parents | 1d1603768966 |
children | c2bf0120ee5d |
rev | line source |
---|---|
0 | 1 /* |
2426
1d1603768966
7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents:
2379
diff
changeset
|
2 * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
989
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
989
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
989
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/systemDictionary.hpp" | |
27 #include "code/codeCache.hpp" | |
28 #include "gc_implementation/parallelScavenge/cardTableExtension.hpp" | |
29 #include "gc_implementation/parallelScavenge/gcTaskManager.hpp" | |
30 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp" | |
31 #include "gc_implementation/parallelScavenge/psPromotionManager.hpp" | |
32 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
2379
b099aaf51bf8
6962931: move interned strings out of the perm gen
jcoomes
parents:
1972
diff
changeset
|
33 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" |
1972 | 34 #include "gc_implementation/parallelScavenge/psTasks.hpp" |
35 #include "memory/iterator.hpp" | |
36 #include "memory/universe.hpp" | |
37 #include "oops/oop.inline.hpp" | |
38 #include "oops/oop.psgc.inline.hpp" | |
39 #include "runtime/fprofiler.hpp" | |
40 #include "runtime/thread.hpp" | |
41 #include "runtime/vmThread.hpp" | |
42 #include "services/management.hpp" | |
43 #include "utilities/taskqueue.hpp" | |
0 | 44 |
45 // | |
46 // ScavengeRootsTask | |
47 // | |
48 | |
49 void ScavengeRootsTask::do_it(GCTaskManager* manager, uint which) { | |
50 assert(Universe::heap()->is_gc_active(), "called outside gc"); | |
51 | |
52 PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which); | |
53 PSScavengeRootsClosure roots_closure(pm); | |
54 | |
55 switch (_root_type) { | |
56 case universe: | |
57 Universe::oops_do(&roots_closure); | |
58 ReferenceProcessor::oops_do(&roots_closure); | |
59 break; | |
60 | |
61 case jni_handles: | |
62 JNIHandles::oops_do(&roots_closure); | |
63 break; | |
64 | |
65 case threads: | |
66 { | |
67 ResourceMark rm; | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
68 Threads::oops_do(&roots_closure, NULL); |
0 | 69 } |
70 break; | |
71 | |
72 case object_synchronizer: | |
73 ObjectSynchronizer::oops_do(&roots_closure); | |
74 break; | |
75 | |
76 case flat_profiler: | |
77 FlatProfiler::oops_do(&roots_closure); | |
78 break; | |
79 | |
80 case system_dictionary: | |
81 SystemDictionary::oops_do(&roots_closure); | |
82 break; | |
83 | |
84 case management: | |
85 Management::oops_do(&roots_closure); | |
86 break; | |
87 | |
88 case jvmti: | |
89 JvmtiExport::oops_do(&roots_closure); | |
90 break; | |
91 | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
92 |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
93 case code_cache: |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
94 { |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
95 CodeBlobToOopClosure each_scavengable_code_blob(&roots_closure, /*do_marking=*/ true); |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
96 CodeCache::scavenge_root_nmethods_do(&each_scavengable_code_blob); |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
97 } |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
98 break; |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
99 |
0 | 100 default: |
101 fatal("Unknown root type"); | |
102 } | |
103 | |
104 // Do the real work | |
105 pm->drain_stacks(false); | |
106 } | |
107 | |
108 // | |
109 // ThreadRootsTask | |
110 // | |
111 | |
112 void ThreadRootsTask::do_it(GCTaskManager* manager, uint which) { | |
113 assert(Universe::heap()->is_gc_active(), "called outside gc"); | |
114 | |
115 PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which); | |
116 PSScavengeRootsClosure roots_closure(pm); | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
117 CodeBlobToOopClosure roots_in_blobs(&roots_closure, /*do_marking=*/ true); |
0 | 118 |
119 if (_java_thread != NULL) | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
120 _java_thread->oops_do(&roots_closure, &roots_in_blobs); |
0 | 121 |
122 if (_vm_thread != NULL) | |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
196
diff
changeset
|
123 _vm_thread->oops_do(&roots_closure, &roots_in_blobs); |
0 | 124 |
125 // Do the real work | |
126 pm->drain_stacks(false); | |
127 } | |
128 | |
129 // | |
130 // StealTask | |
131 // | |
132 | |
133 StealTask::StealTask(ParallelTaskTerminator* t) : | |
134 _terminator(t) {} | |
135 | |
136 void StealTask::do_it(GCTaskManager* manager, uint which) { | |
137 assert(Universe::heap()->is_gc_active(), "called outside gc"); | |
138 | |
139 PSPromotionManager* pm = | |
140 PSPromotionManager::gc_thread_promotion_manager(which); | |
141 pm->drain_stacks(true); | |
142 guarantee(pm->stacks_empty(), | |
143 "stacks should be empty at this point"); | |
144 | |
145 int random_seed = 17; | |
1706
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
146 while(true) { |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
147 StarTask p; |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
148 if (PSPromotionManager::steal_depth(which, &random_seed, p)) { |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
149 TASKQUEUE_STATS_ONLY(pm->record_steal(p)); |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
150 pm->process_popped_location_depth(p); |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
151 pm->drain_stacks_depth(true); |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
152 } else { |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
153 if (terminator()->offer_termination()) { |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1665
diff
changeset
|
154 break; |
0 | 155 } |
156 } | |
157 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
158 guarantee(pm->stacks_empty(), "stacks should be empty at this point"); |
0 | 159 } |
160 | |
161 // | |
162 // SerialOldToYoungRootsTask | |
163 // | |
164 | |
165 void SerialOldToYoungRootsTask::do_it(GCTaskManager* manager, uint which) { | |
166 assert(_gen != NULL, "Sanity"); | |
167 assert(_gen->object_space()->contains(_gen_top) || _gen_top == _gen->object_space()->top(), "Sanity"); | |
168 | |
169 { | |
170 PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which); | |
171 | |
172 assert(Universe::heap()->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | |
173 CardTableExtension* card_table = (CardTableExtension *)Universe::heap()->barrier_set(); | |
174 // FIX ME! Assert that card_table is the type we believe it to be. | |
175 | |
176 card_table->scavenge_contents(_gen->start_array(), | |
177 _gen->object_space(), | |
178 _gen_top, | |
179 pm); | |
180 | |
181 // Do the real work | |
182 pm->drain_stacks(false); | |
183 } | |
184 } | |
185 | |
186 // | |
187 // OldToYoungRootsTask | |
188 // | |
189 | |
190 void OldToYoungRootsTask::do_it(GCTaskManager* manager, uint which) { | |
191 assert(_gen != NULL, "Sanity"); | |
192 assert(_gen->object_space()->contains(_gen_top) || _gen_top == _gen->object_space()->top(), "Sanity"); | |
193 assert(_stripe_number < ParallelGCThreads, "Sanity"); | |
194 | |
195 { | |
196 PSPromotionManager* pm = PSPromotionManager::gc_thread_promotion_manager(which); | |
197 | |
198 assert(Universe::heap()->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity"); | |
199 CardTableExtension* card_table = (CardTableExtension *)Universe::heap()->barrier_set(); | |
200 // FIX ME! Assert that card_table is the type we believe it to be. | |
201 | |
202 card_table->scavenge_contents_parallel(_gen->start_array(), | |
203 _gen->object_space(), | |
204 _gen_top, | |
205 pm, | |
206 _stripe_number); | |
207 | |
208 // Do the real work | |
209 pm->drain_stacks(false); | |
210 } | |
211 } |