annotate src/share/vm/memory/defNewGeneration.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c766bae6c14d
children 8d81b4a1d3e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
2 * Copyright (c) 2001, 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: 1387
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
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: 1387
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_defNewGeneration.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // DefNewGeneration functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // Methods of protected closure types.
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 DefNewGeneration::IsAliveClosure::IsAliveClosure(Generation* g) : _g(g) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 assert(g->level() == 0, "Optimized for youngest gen.");
a61af66fc99e Initial load
duke
parents:
diff changeset
35 }
a61af66fc99e Initial load
duke
parents:
diff changeset
36 void DefNewGeneration::IsAliveClosure::do_object(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 assert(false, "Do not call.");
a61af66fc99e Initial load
duke
parents:
diff changeset
38 }
a61af66fc99e Initial load
duke
parents:
diff changeset
39 bool DefNewGeneration::IsAliveClosure::do_object_b(oop p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 return (HeapWord*)p >= _g->reserved().end() || p->is_forwarded();
a61af66fc99e Initial load
duke
parents:
diff changeset
41 }
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 DefNewGeneration::KeepAliveClosure::
a61af66fc99e Initial load
duke
parents:
diff changeset
44 KeepAliveClosure(ScanWeakRefClosure* cl) : _cl(cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 GenRemSet* rs = GenCollectedHeap::heap()->rem_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
46 assert(rs->rs_kind() == GenRemSet::CardTable, "Wrong rem set kind.");
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _rs = (CardTableRS*)rs;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 }
a61af66fc99e Initial load
duke
parents:
diff changeset
49
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
50 void DefNewGeneration::KeepAliveClosure::do_oop(oop* p) { DefNewGeneration::KeepAliveClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
51 void DefNewGeneration::KeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::KeepAliveClosure::do_oop_work(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 DefNewGeneration::FastKeepAliveClosure::
a61af66fc99e Initial load
duke
parents:
diff changeset
55 FastKeepAliveClosure(DefNewGeneration* g, ScanWeakRefClosure* cl) :
a61af66fc99e Initial load
duke
parents:
diff changeset
56 DefNewGeneration::KeepAliveClosure(cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _boundary = g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
60 void DefNewGeneration::FastKeepAliveClosure::do_oop(oop* p) { DefNewGeneration::FastKeepAliveClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
61 void DefNewGeneration::FastKeepAliveClosure::do_oop(narrowOop* p) { DefNewGeneration::FastKeepAliveClosure::do_oop_work(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 DefNewGeneration::EvacuateFollowersClosure::
a61af66fc99e Initial load
duke
parents:
diff changeset
64 EvacuateFollowersClosure(GenCollectedHeap* gch, int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 ScanClosure* cur, ScanClosure* older) :
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _gch(gch), _level(level),
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _scan_cur_or_nonheap(cur), _scan_older(older)
a61af66fc99e Initial load
duke
parents:
diff changeset
68 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void DefNewGeneration::EvacuateFollowersClosure::do_void() {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap,
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _scan_older);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 } while (!_gch->no_allocs_since_save_marks(_level));
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 DefNewGeneration::FastEvacuateFollowersClosure::
a61af66fc99e Initial load
duke
parents:
diff changeset
78 FastEvacuateFollowersClosure(GenCollectedHeap* gch, int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 DefNewGeneration* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 FastScanClosure* cur, FastScanClosure* older) :
a61af66fc99e Initial load
duke
parents:
diff changeset
81 _gch(gch), _level(level), _gen(gen),
a61af66fc99e Initial load
duke
parents:
diff changeset
82 _scan_cur_or_nonheap(cur), _scan_older(older)
a61af66fc99e Initial load
duke
parents:
diff changeset
83 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 void DefNewGeneration::FastEvacuateFollowersClosure::do_void() {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap,
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _scan_older);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 } while (!_gch->no_allocs_since_save_marks(_level));
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
90 guarantee(_gen->promo_failure_scan_is_complete(), "Failed to finish scan");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) :
a61af66fc99e Initial load
duke
parents:
diff changeset
94 OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
a61af66fc99e Initial load
duke
parents:
diff changeset
95 {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
97 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
100 void ScanClosure::do_oop(oop* p) { ScanClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
101 void ScanClosure::do_oop(narrowOop* p) { ScanClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
102
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 FastScanClosure::FastScanClosure(DefNewGeneration* g, bool gc_barrier) :
a61af66fc99e Initial load
duke
parents:
diff changeset
104 OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
a61af66fc99e Initial load
duke
parents:
diff changeset
105 {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
110 void FastScanClosure::do_oop(oop* p) { FastScanClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
111 void FastScanClosure::do_oop(narrowOop* p) { FastScanClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
112
0
a61af66fc99e Initial load
duke
parents:
diff changeset
113 ScanWeakRefClosure::ScanWeakRefClosure(DefNewGeneration* g) :
a61af66fc99e Initial load
duke
parents:
diff changeset
114 OopClosure(g->ref_processor()), _g(g)
a61af66fc99e Initial load
duke
parents:
diff changeset
115 {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
120 void ScanWeakRefClosure::do_oop(oop* p) { ScanWeakRefClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
121 void ScanWeakRefClosure::do_oop(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
122
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
123 void FilteringClosure::do_oop(oop* p) { FilteringClosure::do_oop_work(p); }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
124 void FilteringClosure::do_oop(narrowOop* p) { FilteringClosure::do_oop_work(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 DefNewGeneration::DefNewGeneration(ReservedSpace rs,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 size_t initial_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
128 int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
129 const char* policy)
a61af66fc99e Initial load
duke
parents:
diff changeset
130 : Generation(rs, initial_size, level),
a61af66fc99e Initial load
duke
parents:
diff changeset
131 _promo_failure_drain_in_progress(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _should_allocate_from_space(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
133 {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 MemRegion cmr((HeapWord*)_virtual_space.low(),
a61af66fc99e Initial load
duke
parents:
diff changeset
135 (HeapWord*)_virtual_space.high());
a61af66fc99e Initial load
duke
parents:
diff changeset
136 Universe::heap()->barrier_set()->resize_covered_region(cmr);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 if (GenCollectedHeap::heap()->collector_policy()->has_soft_ended_eden()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _eden_space = new ConcEdenSpace(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 _eden_space = new EdenSpace(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _from_space = new ContiguousSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _to_space = new ContiguousSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 if (_eden_space == NULL || _from_space == NULL || _to_space == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
147 vm_exit_during_initialization("Could not allocate a new gen space");
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Compute the maximum eden and survivor space sizes. These sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // are computed assuming the entire reserved space is committed.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // These values are exported as performance counters.
a61af66fc99e Initial load
duke
parents:
diff changeset
152 uintx alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
153 uintx size = _virtual_space.reserved_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _max_survivor_size = compute_survivor_size(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _max_eden_size = size - (2*_max_survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // allocate the performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Generation counters -- generation 0, 3 subspaces
a61af66fc99e Initial load
duke
parents:
diff changeset
160 _gen_counters = new GenerationCounters("new", 0, 3, &_virtual_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 _gc_counters = new CollectorCounters(policy, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 _eden_counters = new CSpaceCounters("eden", 0, _max_eden_size, _eden_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 _from_counters = new CSpaceCounters("s0", 1, _max_survivor_size, _from_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
169
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
170 compute_space_boundaries(0, SpaceDecorator::Clear, SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171 update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
172 _next_gen = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 _tenuring_threshold = MaxTenuringThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 _pretenure_size_threshold_words = PretenureSizeThreshold >> LogHeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
177 void DefNewGeneration::compute_space_boundaries(uintx minimum_eden_size,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
178 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
179 bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
180 uintx alignment =
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
181 GenCollectedHeap::heap()->collector_policy()->min_alignment();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
182
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
183 // If the spaces are being cleared (only done at heap initialization
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
184 // currently), the survivor spaces need not be empty.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
185 // Otherwise, no care is taken for used areas in the survivor spaces
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
186 // so check.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
187 assert(clear_space || (to()->is_empty() && from()->is_empty()),
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
188 "Initialization of the survivor spaces assumes these are empty");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Compute sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
191 uintx size = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
192 uintx survivor_size = compute_survivor_size(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 uintx eden_size = size - (2*survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (eden_size < minimum_eden_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // May happen due to 64Kb rounding, if so adjust eden size back up
a61af66fc99e Initial load
duke
parents:
diff changeset
198 minimum_eden_size = align_size_up(minimum_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 uintx maximum_survivor_size = (size - minimum_eden_size) / 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 uintx unaligned_survivor_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
201 align_size_down(maximum_survivor_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 survivor_size = MAX2(unaligned_survivor_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
203 eden_size = size - (2*survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
205 assert(eden_size >= minimum_eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 char *eden_start = _virtual_space.low();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 char *from_start = eden_start + eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 char *to_start = from_start + survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 char *to_end = to_start + survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert(to_end == _virtual_space.high(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
214 assert(Space::is_aligned((HeapWord*)eden_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
215 assert(Space::is_aligned((HeapWord*)from_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
216 assert(Space::is_aligned((HeapWord*)to_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)from_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 MemRegion fromMR((HeapWord*)from_start, (HeapWord*)to_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 MemRegion toMR ((HeapWord*)to_start, (HeapWord*)to_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
221
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
222 // A minimum eden size implies that there is a part of eden that
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
223 // is being used and that affects the initialization of any
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
224 // newly formed eden.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
225 bool live_in_eden = minimum_eden_size > 0;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
226
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
227 // If not clearing the spaces, do some checking to verify that
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
228 // the space are already mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
229 if (!clear_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
230 // Must check mangling before the spaces are reshaped. Otherwise,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
231 // the bottom or end of one space may have moved into another
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
232 // a failure of the check may not correctly indicate which space
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
233 // is not properly mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
234 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
235 HeapWord* limit = (HeapWord*) _virtual_space.high();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
236 eden()->check_mangled_unused_area(limit);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
237 from()->check_mangled_unused_area(limit);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
238 to()->check_mangled_unused_area(limit);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
239 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
240 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
241
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
242 // Reset the spaces for their new regions.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
243 eden()->initialize(edenMR,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
244 clear_space && !live_in_eden,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
245 SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
246 // If clear_space and live_in_eden, we will not have cleared any
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // portion of eden above its top. This can cause newly
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // expanded space not to be mangled if using ZapUnusedHeapArea.
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // We explicitly do such mangling here.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
250 if (ZapUnusedHeapArea && clear_space && live_in_eden && mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
251 eden()->mangle_unused_area();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 }
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
253 from()->initialize(fromMR, clear_space, mangle_space);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
254 to()->initialize(toMR, clear_space, mangle_space);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
255
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
256 // Set next compaction spaces.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 eden()->set_next_compaction_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // The to-space is normally empty before a compaction so need
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // not be considered. The exception is during promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // failure handling when to-space can contain live objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void DefNewGeneration::swap_spaces() {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 ContiguousSpace* s = from();
a61af66fc99e Initial load
duke
parents:
diff changeset
266 _from_space = to();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 _to_space = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 eden()->set_next_compaction_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // The to-space is normally empty before a compaction so need
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // not be considered. The exception is during promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // failure handling when to-space can contain live objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 CSpaceCounters* c = _from_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 _from_counters = _to_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 _to_counters = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 bool DefNewGeneration::expand(size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 MutexLocker x(ExpandHeap_lock);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
283 HeapWord* prev_high = (HeapWord*) _virtual_space.high();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 bool success = _virtual_space.expand_by(bytes);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
285 if (success && ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
286 // Mangle newly committed space immediately because it
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
287 // can be done here more simply that after the new
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
288 // spaces have been computed.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
289 HeapWord* new_high = (HeapWord*) _virtual_space.high();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
290 MemRegion mangle_region(prev_high, new_high);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
291 SpaceMangler::mangle_region(mangle_region);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
292 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Do not attempt an expand-to-the reserve size. The
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // request should properly observe the maximum size of
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // the generation so an expand-to-reserve should be
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // unnecessary. Also a second call to expand-to-reserve
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // value potentially can cause an undue expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // For example if the first expand fail for unknown reasons,
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // but the second succeeds and expands the heap to its maximum
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // value.
a61af66fc99e Initial load
duke
parents:
diff changeset
302 if (GC_locker::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 if (PrintGC && Verbose) {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
304 gclog_or_tty->print_cr("Garbage collection disabled, "
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
305 "expanded heap instead");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 return success;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void DefNewGeneration::compute_new_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // This is called after a gc that includes the following generation
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // (which is required to exist.) So from-space will normally be empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Note that we check both spaces, since if scavenge failed they revert roles.
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // If not we bail out (otherwise we would have to relocate the objects)
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (!from()->is_empty() || !to()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 int next_level = level() + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 assert(next_level < gch->_n_gens,
a61af66fc99e Initial load
duke
parents:
diff changeset
325 "DefNewGeneration cannot be an oldest gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 Generation* next_gen = gch->_gens[next_level];
a61af66fc99e Initial load
duke
parents:
diff changeset
328 size_t old_size = next_gen->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
329 size_t new_size_before = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
330 size_t min_new_size = spec()->init_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
331 size_t max_new_size = reserved().byte_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
332 assert(min_new_size <= new_size_before &&
a61af66fc99e Initial load
duke
parents:
diff changeset
333 new_size_before <= max_new_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
334 "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // All space sizes must be multiples of Generation::GenGrain.
a61af66fc99e Initial load
duke
parents:
diff changeset
336 size_t alignment = Generation::GenGrain;
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Compute desired new generation size based on NewRatio and
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // NewSizeThreadIncrease
a61af66fc99e Initial load
duke
parents:
diff changeset
340 size_t desired_new_size = old_size/NewRatio;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 int threads_count = Threads::number_of_non_daemon_threads();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 size_t thread_increase_size = threads_count * NewSizeThreadIncrease;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 desired_new_size = align_size_up(desired_new_size + thread_increase_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // Adjust new generation size
a61af66fc99e Initial load
duke
parents:
diff changeset
346 desired_new_size = MAX2(MIN2(desired_new_size, max_new_size), min_new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 assert(desired_new_size <= max_new_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 bool changed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 if (desired_new_size > new_size_before) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 size_t change = desired_new_size - new_size_before;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 assert(change % alignment == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (expand(change)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 changed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // If the heap failed to expand to the desired size,
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // "changed" will be false. If the expansion failed
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // (and at this point it was expected to succeed),
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // ignore the failure (leaving "changed" as false).
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (desired_new_size < new_size_before && eden()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // bail out of shrinking if objects in eden
a61af66fc99e Initial load
duke
parents:
diff changeset
363 size_t change = new_size_before - desired_new_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 assert(change % alignment == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
365 _virtual_space.shrink_by(change);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 changed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 if (changed) {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
369 // The spaces have already been mangled at this point but
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
370 // may not have been cleared (set top = bottom) and should be.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
371 // Mangling was done when the heap was being expanded.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
372 compute_space_boundaries(eden()->used(),
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
373 SpaceDecorator::Clear,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
374 SpaceDecorator::DontMangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
375 MemRegion cmr((HeapWord*)_virtual_space.low(),
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
376 (HeapWord*)_virtual_space.high());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 Universe::heap()->barrier_set()->resize_covered_region(cmr);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 if (Verbose && PrintGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 size_t new_size_after = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 size_t eden_size_after = eden()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 size_t survivor_size_after = from()->capacity();
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
382 gclog_or_tty->print("New generation size " SIZE_FORMAT "K->"
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
383 SIZE_FORMAT "K [eden="
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 SIZE_FORMAT "K,survivor=" SIZE_FORMAT "K]",
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
385 new_size_before/K, new_size_after/K,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
386 eden_size_after/K, survivor_size_after/K);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 gclog_or_tty->print("[allowed " SIZE_FORMAT "K extra for %d threads]",
a61af66fc99e Initial load
duke
parents:
diff changeset
389 thread_increase_size/K, threads_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 gclog_or_tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 void DefNewGeneration::object_iterate_since_last_GC(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // $$$ This may be wrong in case of "scavenge failure"?
a61af66fc99e Initial load
duke
parents:
diff changeset
398 eden()->object_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 void DefNewGeneration::younger_refs_iterate(OopsInGenClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 assert(false, "NYI -- are you sure you want to call this?");
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 size_t DefNewGeneration::capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 return eden()->capacity()
a61af66fc99e Initial load
duke
parents:
diff changeset
408 + from()->capacity(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 size_t DefNewGeneration::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 return eden()->used()
a61af66fc99e Initial load
duke
parents:
diff changeset
414 + from()->used(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 size_t DefNewGeneration::free() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
419 return eden()->free()
a61af66fc99e Initial load
duke
parents:
diff changeset
420 + from()->free(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 size_t DefNewGeneration::max_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 const size_t alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 const size_t reserved_bytes = reserved().byte_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
426 return reserved_bytes - compute_survivor_size(reserved_bytes, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 size_t DefNewGeneration::unsafe_max_alloc_nogc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 return eden()->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 size_t DefNewGeneration::capacity_before_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return eden()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 size_t DefNewGeneration::contiguous_available() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 return eden()->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 HeapWord** DefNewGeneration::top_addr() const { return eden()->top_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 HeapWord** DefNewGeneration::end_addr() const { return eden()->end_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 void DefNewGeneration::object_iterate(ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
446 eden()->object_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 from()->object_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 void DefNewGeneration::space_iterate(SpaceClosure* blk,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 bool usedOnly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 blk->do_space(eden());
a61af66fc99e Initial load
duke
parents:
diff changeset
454 blk->do_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
455 blk->do_space(to());
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // The last collection bailed out, we are running out of heap space,
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // so we try to allocate the from-space, too.
a61af66fc99e Initial load
duke
parents:
diff changeset
460 HeapWord* DefNewGeneration::allocate_from_space(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 HeapWord* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
462 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 gclog_or_tty->print("DefNewGeneration::allocate_from_space(%u):"
a61af66fc99e Initial load
duke
parents:
diff changeset
464 " will_fail: %s"
a61af66fc99e Initial load
duke
parents:
diff changeset
465 " heap_lock: %s"
a61af66fc99e Initial load
duke
parents:
diff changeset
466 " free: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
467 size,
a61af66fc99e Initial load
duke
parents:
diff changeset
468 GenCollectedHeap::heap()->incremental_collection_will_fail() ? "true" : "false",
a61af66fc99e Initial load
duke
parents:
diff changeset
469 Heap_lock->is_locked() ? "locked" : "unlocked",
a61af66fc99e Initial load
duke
parents:
diff changeset
470 from()->free());
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 if (should_allocate_from_space() || GC_locker::is_active_and_needs_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (Heap_lock->owned_by_self() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
474 (SafepointSynchronize::is_at_safepoint() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
475 Thread::current()->is_VM_thread())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // If the Heap_lock is not locked by this thread, this will be called
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // again later with the Heap_lock held.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 result = from()->allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 } else if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 gclog_or_tty->print_cr(" Heap_lock is not owned by self");
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 } else if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 gclog_or_tty->print_cr(" should_allocate_from_space: NOT");
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 gclog_or_tty->print_cr(" returns %s", result == NULL ? "NULL" : "object");
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 HeapWord* DefNewGeneration::expand_and_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
492 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
493 bool parallel) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // We don't attempt to expand the young generation (but perhaps we should.)
a61af66fc99e Initial load
duke
parents:
diff changeset
495 return allocate(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 void DefNewGeneration::collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
500 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
501 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
502 bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 assert(full || size > 0, "otherwise we don't want to collect");
a61af66fc99e Initial load
duke
parents:
diff changeset
504 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
505 _next_gen = gch->next_gen(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 assert(_next_gen != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
507 "This must be the youngest gen, and not the only gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // If the next generation is too full to accomodate promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // from this generation, pass on collection; let the next generation
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
512 if (!collection_attempt_is_safe()) {
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
513 gch->set_incremental_collection_failed(); // Slight lie: we did not even attempt one
0
a61af66fc99e Initial load
duke
parents:
diff changeset
514 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516 assert(to()->is_empty(), "Else not collection_attempt_is_safe");
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 init_assuming_no_promotion_failure();
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Capture heap used before collection (for printing).
a61af66fc99e Initial load
duke
parents:
diff changeset
522 size_t gch_prev_used = gch->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 SpecializationStats::clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // These can be shared for all code paths
a61af66fc99e Initial load
duke
parents:
diff changeset
527 IsAliveClosure is_alive(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 ScanWeakRefClosure scan_weak_ref(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 age_table()->clear();
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
531 to()->clear(SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 gch->rem_set()->prepare_for_younger_refs_iterate(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 assert(gch->no_allocs_since_save_marks(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
536 "save marks have not been newly set.");
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Not very pretty.
a61af66fc99e Initial load
duke
parents:
diff changeset
539 CollectorPolicy* cp = gch->collector_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 FastScanClosure fsc_with_no_gc_barrier(this, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 FastScanClosure fsc_with_gc_barrier(this, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 set_promo_failure_scan_stack_closure(&fsc_with_no_gc_barrier);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 FastEvacuateFollowersClosure evacuate_followers(gch, _level, this,
a61af66fc99e Initial load
duke
parents:
diff changeset
546 &fsc_with_no_gc_barrier,
a61af66fc99e Initial load
duke
parents:
diff changeset
547 &fsc_with_gc_barrier);
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 assert(gch->no_allocs_since_save_marks(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
550 "save marks have not been newly set.");
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 gch->gen_process_strong_roots(_level,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
553 true, // Process younger gens, if any,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
554 // as strong roots.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
555 true, // activate StrongRootsScope
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
556 false, // not collecting perm generation.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 SharedHeap::SO_AllClasses,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
558 &fsc_with_no_gc_barrier,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
559 true, // walk *all* scavengable nmethods
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 457
diff changeset
560 &fsc_with_gc_barrier);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // "evacuate followers".
a61af66fc99e Initial load
duke
parents:
diff changeset
563 evacuate_followers.do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 FastKeepAliveClosure keep_alive(this, &scan_weak_ref);
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
566 ReferenceProcessor* rp = ref_processor();
457
27a80744a83b 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 453
diff changeset
567 rp->setup_policy(clear_all_soft_refs);
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
568 rp->process_discovered_references(&is_alive, &keep_alive, &evacuate_followers,
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
569 NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570 if (!promotion_failed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // Swap the survivor spaces.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
572 eden()->clear(SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
573 from()->clear(SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
574 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
575 // This is now done here because of the piece-meal mangling which
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
576 // can check for valid mangling at intermediate points in the
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
577 // collection(s). When a minor collection fails to collect
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
578 // sufficient space resizing of the young generation can occur
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
579 // an redistribute the spaces in the young generation. Mangle
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
580 // here so that unzapped regions don't get distributed to
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
581 // other spaces.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
582 to()->mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
583 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 swap_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 assert(to()->is_empty(), "to space should be empty now");
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // Set the desired survivor size to half the real survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _tenuring_threshold =
a61af66fc99e Initial load
duke
parents:
diff changeset
590 age_table()->compute_tenuring_threshold(to()->capacity()/HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
591
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1145
diff changeset
592 // A successful scavenge should restart the GC time limit count which is
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1145
diff changeset
593 // for full GC's.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1145
diff changeset
594 AdaptiveSizePolicy* size_policy = gch->gen_policy()->size_policy();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1145
diff changeset
595 size_policy->reset_gc_overhead_limit_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if (PrintGC && !PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 gch->print_heap_change(gch_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
599 assert(!gch->incremental_collection_failed(), "Should be clear");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600 } else {
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
601 assert(_promo_failure_scan_stack.is_empty(), "post condition");
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
602 _promo_failure_scan_stack.clear(true); // Clear cached segments.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 remove_forwarding_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
605 if (PrintGCDetails) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
606 gclog_or_tty->print(" (promotion failed) ");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // Add to-space to the list of space to compact
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // when a promotion failure has occurred. In that
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // case there can be live objects in to-space
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // as a result of a partial evacuation of eden
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // and from-space.
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
613 swap_spaces(); // For uniformity wrt ParNewGeneration.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 from()->set_next_compaction_space(to());
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
615 gch->set_incremental_collection_failed();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
616
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
617 // Inform the next generation that a promotion failure occurred.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
618 _next_gen->promotion_failure_occurred();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
619
0
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // Reset the PromotionFailureALot counters.
a61af66fc99e Initial load
duke
parents:
diff changeset
621 NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // set new iteration safe limit for the survivor spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
624 from()->set_concurrent_iteration_safe_limit(from()->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
625 to()->set_concurrent_iteration_safe_limit(to()->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
626 SpecializationStats::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
627 update_time_of_last_gc(os::javaTimeMillis());
a61af66fc99e Initial load
duke
parents:
diff changeset
628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 class RemoveForwardPointerClosure: public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
632 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 obj->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635 };
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 void DefNewGeneration::init_assuming_no_promotion_failure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 _promotion_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 void DefNewGeneration::remove_forwarding_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 RemoveForwardPointerClosure rspc;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 eden()->object_iterate(&rspc);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 from()->object_iterate(&rspc);
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
646
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // Now restore saved marks, if any.
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
648 assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(),
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
649 "should be the same");
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
650 while (!_objs_with_preserved_marks.is_empty()) {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
651 oop obj = _objs_with_preserved_marks.pop();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
652 markOop m = _preserved_marks_of_objs.pop();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
653 obj->set_mark(m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
655 _objs_with_preserved_marks.clear(true);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
656 _preserved_marks_of_objs.clear(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 if (m->must_be_preserved_for_promotion_failure(obj)) {
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
661 _objs_with_preserved_marks.push(obj);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
662 _preserved_marks_of_objs.push(m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 void DefNewGeneration::handle_promotion_failure(oop old) {
a61af66fc99e Initial load
duke
parents:
diff changeset
667 preserve_mark_if_necessary(old, old->mark());
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
668 if (!_promotion_failed && PrintPromotionFailure) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
669 gclog_or_tty->print(" (promotion failure size = " SIZE_FORMAT ") ",
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
670 old->size());
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
671 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 989
diff changeset
672
0
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // forward to self
a61af66fc99e Initial load
duke
parents:
diff changeset
674 old->forward_to(old);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 _promotion_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
676
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
677 _promo_failure_scan_stack.push(old);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 if (!_promo_failure_drain_in_progress) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // prevent recursion in copy_to_survivor_space()
a61af66fc99e Initial load
duke
parents:
diff changeset
681 _promo_failure_drain_in_progress = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
682 drain_promo_failure_scan_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
683 _promo_failure_drain_in_progress = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
687 oop DefNewGeneration::copy_to_survivor_space(oop old) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 assert(is_in_reserved(old) && !old->is_forwarded(),
a61af66fc99e Initial load
duke
parents:
diff changeset
689 "shouldn't be scavenging this oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
690 size_t s = old->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
691 oop obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // Try allocating obj in to-space (unless too old)
a61af66fc99e Initial load
duke
parents:
diff changeset
694 if (old->age() < tenuring_threshold()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 obj = (oop) to()->allocate(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // Otherwise try allocating obj tenured
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (obj == NULL) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
700 obj = _next_gen->promote(old, s);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
701 if (obj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 handle_promotion_failure(old);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 return old;
a61af66fc99e Initial load
duke
parents:
diff changeset
704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
705 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // Prefetch beyond obj
a61af66fc99e Initial load
duke
parents:
diff changeset
707 const intx interval = PrefetchCopyIntervalInBytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 Prefetch::write(obj, interval);
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // Copy obj
a61af66fc99e Initial load
duke
parents:
diff changeset
711 Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // Increment age if obj still in new generation
a61af66fc99e Initial load
duke
parents:
diff changeset
714 obj->incr_age();
a61af66fc99e Initial load
duke
parents:
diff changeset
715 age_table()->add(obj, s);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // Done, insert forward pointer to obj in this header
a61af66fc99e Initial load
duke
parents:
diff changeset
719 old->forward_to(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 void DefNewGeneration::drain_promo_failure_scan_stack() {
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
725 while (!_promo_failure_scan_stack.is_empty()) {
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
726 oop obj = _promo_failure_scan_stack.pop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 obj->oop_iterate(_promo_failure_scan_stack_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 void DefNewGeneration::save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
732 eden()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
733 to()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
734 from()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 void DefNewGeneration::reset_saved_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 eden()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
740 to()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
741 from()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 bool DefNewGeneration::no_allocs_since_save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
746 assert(eden()->saved_mark_at_top(), "Violated spec - alloc in eden");
a61af66fc99e Initial load
duke
parents:
diff changeset
747 assert(from()->saved_mark_at_top(), "Violated spec - alloc in from");
a61af66fc99e Initial load
duke
parents:
diff changeset
748 return to()->saved_mark_at_top();
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 #define DefNew_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
752 \
a61af66fc99e Initial load
duke
parents:
diff changeset
753 void DefNewGeneration:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
754 oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
755 cl->set_generation(this); \
a61af66fc99e Initial load
duke
parents:
diff changeset
756 eden()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
757 to()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
758 from()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
759 cl->reset_generation(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
760 save_marks(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 ALL_SINCE_SAVE_MARKS_CLOSURES(DefNew_SINCE_SAVE_MARKS_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 #undef DefNew_SINCE_SAVE_MARKS_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 void DefNewGeneration::contribute_scratch(ScratchBlock*& list, Generation* requestor,
a61af66fc99e Initial load
duke
parents:
diff changeset
768 size_t max_alloc_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 if (requestor == this || _promotion_failed) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 assert(requestor->level() > level(), "DefNewGeneration must be youngest");
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 /* $$$ Assert this? "trace" is a "MarkSweep" function so that's not appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
773 if (to_space->top() > to_space->bottom()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 trace("to_space not empty when contribute_scratch called");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 */
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 ContiguousSpace* to_space = to();
a61af66fc99e Initial load
duke
parents:
diff changeset
779 assert(to_space->end() >= to_space->top(), "pointers out of order");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 size_t free_words = pointer_delta(to_space->end(), to_space->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
781 if (free_words >= MinFreeScratchWords) {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 ScratchBlock* sb = (ScratchBlock*)to_space->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
783 sb->num_words = free_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 sb->next = list;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 list = sb;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
788
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
789 void DefNewGeneration::reset_scratch() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
790 // If contributing scratch in to_space, mangle all of
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
791 // to_space if ZapUnusedHeapArea. This is needed because
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
792 // top is not maintained while using to-space as scratch.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
793 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
794 to()->mangle_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
795 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
796 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
797
0
a61af66fc99e Initial load
duke
parents:
diff changeset
798 bool DefNewGeneration::collection_attempt_is_safe() {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 if (!to()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
800 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
802 if (_next_gen == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
803 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
804 _next_gen = gch->next_gen(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
805 assert(_next_gen != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
806 "This must be the youngest gen, and not the only gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
808 return _next_gen->promotion_attempt_is_safe(used());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 void DefNewGeneration::gc_epilogue(bool full) {
1889
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
812 DEBUG_ONLY(static bool seen_incremental_collection_failed = false;)
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
813
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
814 assert(!GC_locker::is_active(), "We should not be executing here");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // Check if the heap is approaching full after a collection has
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // been done. Generally the young generation is empty at
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // a minimum at the end of a collection. If it is not, then
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // the heap is approaching full.
a61af66fc99e Initial load
duke
parents:
diff changeset
819 GenCollectedHeap* gch = GenCollectedHeap::heap();
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
820 if (full) {
1889
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
821 DEBUG_ONLY(seen_incremental_collection_failed = false;)
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
822 if (!collection_attempt_is_safe()) {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
823 gch->set_incremental_collection_failed(); // Slight lie: a full gc left us in that state
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
824 set_should_allocate_from_space(); // we seem to be running out of space
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
825 } else {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
826 gch->clear_incremental_collection_failed(); // We just did a full collection
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
827 clear_should_allocate_from_space(); // if set
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1836
diff changeset
828 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 } else {
1889
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
830 #ifdef ASSERT
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
831 // It is possible that incremental_collection_failed() == true
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
832 // here, because an attempted scavenge did not succeed. The policy
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
833 // is normally expected to cause a full collection which should
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
834 // clear that condition, so we should not be here twice in a row
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
835 // with incremental_collection_failed() == true without having done
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
836 // a full collection in between.
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
837 if (!seen_incremental_collection_failed &&
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
838 gch->incremental_collection_failed()) {
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
839 seen_incremental_collection_failed = true;
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
840 } else if (seen_incremental_collection_failed) {
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
841 assert(!gch->incremental_collection_failed(), "Twice in a row");
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
842 seen_incremental_collection_failed = false;
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
843 }
c766bae6c14d 6995045: assert(!gch->incremental_collection_failed()) failed: Error, defNewGeneration.cpp:827
ysr
parents: 1888
diff changeset
844 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
847 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
848 eden()->check_mangled_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
849 from()->check_mangled_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
850 to()->check_mangled_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
851 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
852
0
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // update the generation and space performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
854 update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
855 gch->collector_policy()->counters()->update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
857
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
858 void DefNewGeneration::record_spaces_top() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
859 assert(ZapUnusedHeapArea, "Not mangling unused space");
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
860 eden()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
861 to()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
862 from()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
863 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
864
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
865
0
a61af66fc99e Initial load
duke
parents:
diff changeset
866 void DefNewGeneration::update_counters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
867 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
868 _eden_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
869 _from_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
870 _to_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
871 _gen_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 void DefNewGeneration::verify(bool allow_dirty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
876 eden()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 from()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
878 to()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
879 }
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 void DefNewGeneration::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 Generation::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 st->print(" eden");
a61af66fc99e Initial load
duke
parents:
diff changeset
884 eden()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 st->print(" from");
a61af66fc99e Initial load
duke
parents:
diff changeset
886 from()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 st->print(" to ");
a61af66fc99e Initial load
duke
parents:
diff changeset
888 to()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 const char* DefNewGeneration::name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 return "def new generation";
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
895
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
896 // Moved from inline file as they are not called inline
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
897 CompactibleSpace* DefNewGeneration::first_compaction_space() const {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
898 return eden();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
899 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
900
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
901 HeapWord* DefNewGeneration::allocate(size_t word_size,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
902 bool is_tlab) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
903 // This is the slow-path allocation for the DefNewGeneration.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
904 // Most allocations are fast-path in compiled code.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
905 // We try to allocate from the eden. If that works, we are happy.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
906 // Note that since DefNewGeneration supports lock-free allocation, we
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
907 // have to use it here, as well.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
908 HeapWord* result = eden()->par_allocate(word_size);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
909 if (result != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
910 return result;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
911 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
912 do {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
913 HeapWord* old_limit = eden()->soft_end();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
914 if (old_limit < eden()->end()) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
915 // Tell the next generation we reached a limit.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
916 HeapWord* new_limit =
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
917 next_gen()->allocation_limit_reached(eden(), eden()->top(), word_size);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
918 if (new_limit != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
919 Atomic::cmpxchg_ptr(new_limit, eden()->soft_end_addr(), old_limit);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
920 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
921 assert(eden()->soft_end() == eden()->end(),
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
922 "invalid state after allocation_limit_reached returned null");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
923 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
924 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
925 // The allocation failed and the soft limit is equal to the hard limit,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
926 // there are no reasons to do an attempt to allocate
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
927 assert(old_limit == eden()->end(), "sanity check");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
928 break;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
929 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
930 // Try to allocate until succeeded or the soft limit can't be adjusted
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
931 result = eden()->par_allocate(word_size);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
932 } while (result == NULL);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
933
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
934 // If the eden is full and the last collection bailed out, we are running
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
935 // out of heap space, and we try to allocate the from-space, too.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
936 // allocate_from_space can't be inlined because that would introduce a
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
937 // circular dependency at compile time.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
938 if (result == NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
939 result = allocate_from_space(word_size);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
940 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
941 return result;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
942 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
943
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
944 HeapWord* DefNewGeneration::par_allocate(size_t word_size,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
945 bool is_tlab) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
946 return eden()->par_allocate(word_size);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
947 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
948
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
949 void DefNewGeneration::gc_prologue(bool full) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
950 // Ensure that _end and _soft_end are the same in eden space.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
951 eden()->set_soft_end(eden()->end());
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
952 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
953
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
954 size_t DefNewGeneration::tlab_capacity() const {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
955 return eden()->capacity();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
956 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
957
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
958 size_t DefNewGeneration::unsafe_max_tlab_alloc() const {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
959 return unsafe_max_alloc_nogc();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
960 }