annotate src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp @ 2149:7e37af9d69ef

7011379: G1: overly long concurrent marking cycles Summary: This changeset introduces filtering of SATB buffers at the point when they are about to be enqueued. If this filtering clears enough entries on each buffer, the buffer can then be re-used and not enqueued. This cuts down the number of SATB buffers that need to be processed by the concurrent marking threads. Reviewed-by: johnc, ysr
author tonyp
date Wed, 19 Jan 2011 09:35:17 -0500
parents f95d63e2154a
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "gc_implementation/parallelScavenge/adjoiningGenerations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "gc_implementation/parallelScavenge/adjoiningVirtualSpaces.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "gc_implementation/parallelScavenge/psPermGen.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // If boundary moving is being used, create the young gen and old
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // gen with ASPSYoungGen and ASPSOldGen, respectively. Revert to
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // the old behavior otherwise (with PSYoungGen and PSOldGen).
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 size_t init_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 size_t min_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
38 size_t max_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 size_t init_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 size_t min_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 size_t max_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 size_t alignment) :
a61af66fc99e Initial load
duke
parents:
diff changeset
43 _virtual_spaces(old_young_rs, min_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
44 min_high_byte_size, alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 assert(min_low_byte_size <= init_low_byte_size &&
a61af66fc99e Initial load
duke
parents:
diff changeset
46 init_low_byte_size <= max_low_byte_size, "Parameter check");
a61af66fc99e Initial load
duke
parents:
diff changeset
47 assert(min_high_byte_size <= init_high_byte_size &&
a61af66fc99e Initial load
duke
parents:
diff changeset
48 init_high_byte_size <= max_high_byte_size, "Parameter check");
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Create the generations differently based on the option to
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // move the boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 if (UseAdaptiveGCBoundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // Initialize the adjoining virtual spaces. Then pass the
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // a virtual to each generation for initialization of the
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Does the actual creation of the virtual spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _virtual_spaces.initialize(max_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
58 init_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
59 init_high_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Place the young gen at the high end. Passes in the virtual space.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _young_gen = new ASPSYoungGen(_virtual_spaces.high(),
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _virtual_spaces.high()->committed_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
64 min_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _virtual_spaces.high_byte_size_limit());
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // Place the old gen at the low end. Passes in the virtual space.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _old_gen = new ASPSOldGen(_virtual_spaces.low(),
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _virtual_spaces.low()->committed_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
70 min_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _virtual_spaces.low_byte_size_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
72 "old", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 young_gen()->initialize_work();
a61af66fc99e Initial load
duke
parents:
diff changeset
75 assert(young_gen()->reserved().byte_size() <= young_gen()->gen_size_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
76 "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
77 assert(old_young_rs.size() >= young_gen()->gen_size_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
78 "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 old_gen()->initialize_work("old", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 assert(old_gen()->reserved().byte_size() <= old_gen()->gen_size_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
82 "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
83 assert(old_young_rs.size() >= old_gen()->gen_size_limit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
84 "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
85 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Layout the reserved space for the generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 ReservedSpace old_rs =
a61af66fc99e Initial load
duke
parents:
diff changeset
89 virtual_spaces()->reserved_space().first_part(max_low_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 ReservedSpace heap_rs =
a61af66fc99e Initial load
duke
parents:
diff changeset
91 virtual_spaces()->reserved_space().last_part(max_low_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 ReservedSpace young_rs = heap_rs.first_part(max_high_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 assert(young_rs.size() == heap_rs.size(), "Didn't reserve all of the heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Create the generations. Virtual spaces are not passed in.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 _young_gen = new PSYoungGen(init_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
97 min_high_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
98 max_high_byte_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _old_gen = new PSOldGen(init_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 min_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 max_low_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
102 "old", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // The virtual spaces are created by the initialization of the gens.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _young_gen->initialize(young_rs, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 assert(young_gen()->gen_size_limit() == young_rs.size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
107 "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _old_gen->initialize(old_rs, alignment, "old", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 assert(old_gen()->gen_size_limit() == old_rs.size(), "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 size_t AdjoiningGenerations::reserved_byte_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 return virtual_spaces()->reserved_space().size();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Make checks on the current sizes of the generations and
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // the contraints on the sizes of the generations. Push
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // up the boundary within the contraints. A partial
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // push can occur.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void AdjoiningGenerations::request_old_gen_expansion(size_t expand_in_bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 assert(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary, "runtime check");
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 assert_lock_strong(ExpandHeap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert_locked_or_safepoint(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // These sizes limit the amount the boundaries can move. Effectively,
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // the generation says how much it is willing to yield to the other
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 const size_t young_gen_available = young_gen()->available_for_contraction();
a61af66fc99e Initial load
duke
parents:
diff changeset
132 const size_t old_gen_available = old_gen()->available_for_expansion();
a61af66fc99e Initial load
duke
parents:
diff changeset
133 const size_t alignment = virtual_spaces()->alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
134 size_t change_in_bytes = MIN3(young_gen_available,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 old_gen_available,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 align_size_up_(expand_in_bytes, alignment));
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 if (change_in_bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (TraceAdaptiveGCBoundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 gclog_or_tty->print_cr("Before expansion of old gen with boundary move");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 gclog_or_tty->print_cr(" Requested change: 0x%x Attempted change: 0x%x",
a61af66fc99e Initial load
duke
parents:
diff changeset
145 expand_in_bytes, change_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 if (!PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 Universe::print_on(gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 gclog_or_tty->print_cr(" PSOldGen max size: " SIZE_FORMAT "K",
a61af66fc99e Initial load
duke
parents:
diff changeset
150 old_gen()->max_gen_size()/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Move the boundary between the generations up (smaller young gen).
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (virtual_spaces()->adjust_boundary_up(change_in_bytes)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 young_gen()->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
156 old_gen()->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // The total reserved for the generations should match the sum
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // of the two even if the boundary is moving.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 assert(reserved_byte_size() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
162 old_gen()->max_gen_size() + young_gen()->max_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
163 "Space is missing");
a61af66fc99e Initial load
duke
parents:
diff changeset
164 young_gen()->space_invariants();
a61af66fc99e Initial load
duke
parents:
diff changeset
165 old_gen()->space_invariants();
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 if (TraceAdaptiveGCBoundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 gclog_or_tty->print_cr("After expansion of old gen with boundary move");
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if (!PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 Universe::print_on(gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 gclog_or_tty->print_cr(" PSOldGen max size: " SIZE_FORMAT "K",
a61af66fc99e Initial load
duke
parents:
diff changeset
173 old_gen()->max_gen_size()/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // See comments on request_old_gen_expansion()
a61af66fc99e Initial load
duke
parents:
diff changeset
178 bool AdjoiningGenerations::request_young_gen_expansion(size_t expand_in_bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 assert(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary, "runtime check");
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // If eden is not empty, the boundary can be moved but no advantage
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // can be made of the move since eden cannot be moved.
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (!young_gen()->eden_space()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 bool result = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 const size_t young_gen_available = young_gen()->available_for_expansion();
a61af66fc99e Initial load
duke
parents:
diff changeset
190 const size_t old_gen_available = old_gen()->available_for_contraction();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 const size_t alignment = virtual_spaces()->alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
192 size_t change_in_bytes = MIN3(young_gen_available,
a61af66fc99e Initial load
duke
parents:
diff changeset
193 old_gen_available,
a61af66fc99e Initial load
duke
parents:
diff changeset
194 align_size_up_(expand_in_bytes, alignment));
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (change_in_bytes == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 if (TraceAdaptiveGCBoundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 gclog_or_tty->print_cr("Before expansion of young gen with boundary move");
a61af66fc99e Initial load
duke
parents:
diff changeset
202 gclog_or_tty->print_cr(" Requested change: 0x%x Attempted change: 0x%x",
a61af66fc99e Initial load
duke
parents:
diff changeset
203 expand_in_bytes, change_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (!PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 Universe::print_on(gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 gclog_or_tty->print_cr(" PSYoungGen max size: " SIZE_FORMAT "K",
a61af66fc99e Initial load
duke
parents:
diff changeset
208 young_gen()->max_size()/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Move the boundary between the generations down (smaller old gen).
a61af66fc99e Initial load
duke
parents:
diff changeset
212 MutexLocker x(ExpandHeap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (virtual_spaces()->adjust_boundary_down(change_in_bytes)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 young_gen()->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 old_gen()->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
216 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // The total reserved for the generations should match the sum
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // of the two even if the boundary is moving.
a61af66fc99e Initial load
duke
parents:
diff changeset
221 assert(reserved_byte_size() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
222 old_gen()->max_gen_size() + young_gen()->max_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
223 "Space is missing");
a61af66fc99e Initial load
duke
parents:
diff changeset
224 young_gen()->space_invariants();
a61af66fc99e Initial load
duke
parents:
diff changeset
225 old_gen()->space_invariants();
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 if (TraceAdaptiveGCBoundary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 gclog_or_tty->print_cr("After expansion of young gen with boundary move");
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (!PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Universe::print_on(gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 gclog_or_tty->print_cr(" PSYoungGen max size: " SIZE_FORMAT "K",
a61af66fc99e Initial load
duke
parents:
diff changeset
233 young_gen()->max_size()/K);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Additional space is needed in the old generation. Try to move the boundary
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // up to meet the need. Moves boundary up only
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void AdjoiningGenerations::adjust_boundary_for_old_gen_needs(
a61af66fc99e Initial load
duke
parents:
diff changeset
242 size_t desired_free_space) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 assert(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary, "runtime check");
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Stress testing.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (PSAdaptiveSizePolicyResizeVirtualSpaceAlot == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 MutexLocker x(ExpandHeap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 request_old_gen_expansion(virtual_spaces()->alignment() * 3 / 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Expand only if the entire generation is already committed.
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (old_gen()->virtual_space()->uncommitted_size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (old_gen()->free_in_bytes() < desired_free_space) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 MutexLocker x(ExpandHeap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 request_old_gen_expansion(desired_free_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // See comment on adjust_boundary_for_old_gen_needss().
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // Adjust boundary down only.
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void AdjoiningGenerations::adjust_boundary_for_young_gen_needs(size_t eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
263 size_t survivor_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 assert(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary, "runtime check");
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Stress testing.
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (PSAdaptiveSizePolicyResizeVirtualSpaceAlot == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 request_young_gen_expansion(virtual_spaces()->alignment() * 3 / 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 eden_size = young_gen()->eden_space()->capacity_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Expand only if the entire generation is already committed.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 if (young_gen()->virtual_space()->uncommitted_size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 size_t desired_size = eden_size + 2 * survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 const size_t committed = young_gen()->virtual_space()->committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (desired_size > committed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 request_young_gen_expansion(desired_size - committed);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }