annotate src/share/vm/memory/defNewGeneration.cpp @ 453:c96030fff130

6684579: SoftReference processing can be made more efficient Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not. Reviewed-by: jmasa
author ysr
date Thu, 20 Nov 2008 16:56:09 -0800
parents 1ee8caae33af
children 27a80744a83b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 2001-2008 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
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));
a61af66fc99e Initial load
duke
parents:
diff changeset
90 guarantee(_gen->promo_failure_scan_stack() == NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
91 || _gen->promo_failure_scan_stack()->length() == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
92 "Failed to finish scan");
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) :
a61af66fc99e Initial load
duke
parents:
diff changeset
96 OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
a61af66fc99e Initial load
duke
parents:
diff changeset
97 {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
102 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
103 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
104
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 FastScanClosure::FastScanClosure(DefNewGeneration* g, bool gc_barrier) :
a61af66fc99e Initial load
duke
parents:
diff changeset
106 OopsInGenClosure(g), _g(g), _gc_barrier(gc_barrier)
a61af66fc99e Initial load
duke
parents:
diff changeset
107 {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
112 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
113 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
114
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 ScanWeakRefClosure::ScanWeakRefClosure(DefNewGeneration* g) :
a61af66fc99e Initial load
duke
parents:
diff changeset
116 OopClosure(g->ref_processor()), _g(g)
a61af66fc99e Initial load
duke
parents:
diff changeset
117 {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(_g->level() == 0, "Optimized for youngest generation");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _boundary = _g->reserved().end();
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
122 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
123 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
124
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
125 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
126 void FilteringClosure::do_oop(narrowOop* p) { FilteringClosure::do_oop_work(p); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 DefNewGeneration::DefNewGeneration(ReservedSpace rs,
a61af66fc99e Initial load
duke
parents:
diff changeset
129 size_t initial_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
130 int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
131 const char* policy)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 : Generation(rs, initial_size, level),
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _objs_with_preserved_marks(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _preserved_marks_of_objs(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _promo_failure_scan_stack(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _promo_failure_drain_in_progress(false),
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _should_allocate_from_space(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
138 {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 MemRegion cmr((HeapWord*)_virtual_space.low(),
a61af66fc99e Initial load
duke
parents:
diff changeset
140 (HeapWord*)_virtual_space.high());
a61af66fc99e Initial load
duke
parents:
diff changeset
141 Universe::heap()->barrier_set()->resize_covered_region(cmr);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 if (GenCollectedHeap::heap()->collector_policy()->has_soft_ended_eden()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _eden_space = new ConcEdenSpace(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 _eden_space = new EdenSpace(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 _from_space = new ContiguousSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 _to_space = new ContiguousSpace();
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 if (_eden_space == NULL || _from_space == NULL || _to_space == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
152 vm_exit_during_initialization("Could not allocate a new gen space");
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Compute the maximum eden and survivor space sizes. These sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // are computed assuming the entire reserved space is committed.
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // These values are exported as performance counters.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 uintx alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 uintx size = _virtual_space.reserved_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
159 _max_survivor_size = compute_survivor_size(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 _max_eden_size = size - (2*_max_survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // allocate the performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // Generation counters -- generation 0, 3 subspaces
a61af66fc99e Initial load
duke
parents:
diff changeset
165 _gen_counters = new GenerationCounters("new", 0, 3, &_virtual_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _gc_counters = new CollectorCounters(policy, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _eden_counters = new CSpaceCounters("eden", 0, _max_eden_size, _eden_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
169 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 _from_counters = new CSpaceCounters("s0", 1, _max_survivor_size, _from_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
171 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space,
a61af66fc99e Initial load
duke
parents:
diff changeset
173 _gen_counters);
a61af66fc99e Initial load
duke
parents:
diff changeset
174
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
175 compute_space_boundaries(0, SpaceDecorator::Clear, SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176 update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 _next_gen = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 _tenuring_threshold = MaxTenuringThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 _pretenure_size_threshold_words = PretenureSizeThreshold >> LogHeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
182 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
183 bool clear_space,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
184 bool mangle_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
185 uintx alignment =
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
186 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
187
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
188 // 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
189 // 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
190 // 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
191 // so check.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
192 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
193 "Initialization of the survivor spaces assumes these are empty");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Compute sizes
a61af66fc99e Initial load
duke
parents:
diff changeset
196 uintx size = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
197 uintx survivor_size = compute_survivor_size(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 uintx eden_size = size - (2*survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (eden_size < minimum_eden_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // May happen due to 64Kb rounding, if so adjust eden size back up
a61af66fc99e Initial load
duke
parents:
diff changeset
203 minimum_eden_size = align_size_up(minimum_eden_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 uintx maximum_survivor_size = (size - minimum_eden_size) / 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 uintx unaligned_survivor_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
206 align_size_down(maximum_survivor_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 survivor_size = MAX2(unaligned_survivor_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 eden_size = size - (2*survivor_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 assert(eden_size > 0 && survivor_size <= eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
210 assert(eden_size >= minimum_eden_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 char *eden_start = _virtual_space.low();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 char *from_start = eden_start + eden_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 char *to_start = from_start + survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
216 char *to_end = to_start + survivor_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(to_end == _virtual_space.high(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
219 assert(Space::is_aligned((HeapWord*)eden_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert(Space::is_aligned((HeapWord*)from_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
221 assert(Space::is_aligned((HeapWord*)to_start), "checking alignment");
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)from_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 MemRegion fromMR((HeapWord*)from_start, (HeapWord*)to_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 MemRegion toMR ((HeapWord*)to_start, (HeapWord*)to_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
226
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
227 // 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
228 // 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
229 // newly formed eden.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
230 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
231
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
232 // 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
233 // the space are already mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
234 if (!clear_space) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
235 // 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
236 // 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
237 // 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
238 // is not properly mangled.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
239 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
240 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
241 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
242 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
243 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
244 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
245 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
246
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
247 // 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
248 eden()->initialize(edenMR,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
249 clear_space && !live_in_eden,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
250 SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
251 // If clear_space and live_in_eden, we will not have cleared any
0
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // portion of eden above its top. This can cause newly
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // expanded space not to be mangled if using ZapUnusedHeapArea.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // 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
255 if (ZapUnusedHeapArea && clear_space && live_in_eden && mangle_space) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
256 eden()->mangle_unused_area();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
258 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
259 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
260
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
261 // Set next compaction spaces.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 eden()->set_next_compaction_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // The to-space is normally empty before a compaction so need
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // not be considered. The exception is during promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // failure handling when to-space can contain live objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void DefNewGeneration::swap_spaces() {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ContiguousSpace* s = from();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _from_space = to();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 _to_space = s;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 eden()->set_next_compaction_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // The to-space is normally empty before a compaction so need
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // not be considered. The exception is during promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // failure handling when to-space can contain live objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 CSpaceCounters* c = _from_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 _from_counters = _to_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 _to_counters = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 bool DefNewGeneration::expand(size_t bytes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 MutexLocker x(ExpandHeap_lock);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
288 HeapWord* prev_high = (HeapWord*) _virtual_space.high();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 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
290 if (success && ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
291 // 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
292 // 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
293 // spaces have been computed.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
294 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
295 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
296 SpaceMangler::mangle_region(mangle_region);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
297 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // Do not attempt an expand-to-the reserve size. The
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // request should properly observe the maximum size of
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // the generation so an expand-to-reserve should be
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // unnecessary. Also a second call to expand-to-reserve
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // value potentially can cause an undue expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // For example if the first expand fail for unknown reasons,
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // but the second succeeds and expands the heap to its maximum
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // value.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if (GC_locker::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (PrintGC && Verbose) {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
309 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
310 "expanded heap instead");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return success;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 void DefNewGeneration::compute_new_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // This is called after a gc that includes the following generation
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // (which is required to exist.) So from-space will normally be empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Note that we check both spaces, since if scavenge failed they revert roles.
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // If not we bail out (otherwise we would have to relocate the objects)
a61af66fc99e Initial load
duke
parents:
diff changeset
323 if (!from()->is_empty() || !to()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 int next_level = level() + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
329 assert(next_level < gch->_n_gens,
a61af66fc99e Initial load
duke
parents:
diff changeset
330 "DefNewGeneration cannot be an oldest gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 Generation* next_gen = gch->_gens[next_level];
a61af66fc99e Initial load
duke
parents:
diff changeset
333 size_t old_size = next_gen->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
334 size_t new_size_before = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
335 size_t min_new_size = spec()->init_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 size_t max_new_size = reserved().byte_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 assert(min_new_size <= new_size_before &&
a61af66fc99e Initial load
duke
parents:
diff changeset
338 new_size_before <= max_new_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
339 "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // All space sizes must be multiples of Generation::GenGrain.
a61af66fc99e Initial load
duke
parents:
diff changeset
341 size_t alignment = Generation::GenGrain;
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // Compute desired new generation size based on NewRatio and
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // NewSizeThreadIncrease
a61af66fc99e Initial load
duke
parents:
diff changeset
345 size_t desired_new_size = old_size/NewRatio;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 int threads_count = Threads::number_of_non_daemon_threads();
a61af66fc99e Initial load
duke
parents:
diff changeset
347 size_t thread_increase_size = threads_count * NewSizeThreadIncrease;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 desired_new_size = align_size_up(desired_new_size + thread_increase_size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Adjust new generation size
a61af66fc99e Initial load
duke
parents:
diff changeset
351 desired_new_size = MAX2(MIN2(desired_new_size, max_new_size), min_new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 assert(desired_new_size <= max_new_size, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 bool changed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 if (desired_new_size > new_size_before) {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 size_t change = desired_new_size - new_size_before;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 assert(change % alignment == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (expand(change)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 changed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // If the heap failed to expand to the desired size,
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // "changed" will be false. If the expansion failed
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // (and at this point it was expected to succeed),
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // ignore the failure (leaving "changed" as false).
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 if (desired_new_size < new_size_before && eden()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // bail out of shrinking if objects in eden
a61af66fc99e Initial load
duke
parents:
diff changeset
368 size_t change = new_size_before - desired_new_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 assert(change % alignment == 0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
370 _virtual_space.shrink_by(change);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 changed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 if (changed) {
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
374 // 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
375 // 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
376 // 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
377 compute_space_boundaries(eden()->used(),
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
378 SpaceDecorator::Clear,
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
379 SpaceDecorator::DontMangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
380 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
381 (HeapWord*)_virtual_space.high());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 Universe::heap()->barrier_set()->resize_covered_region(cmr);
a61af66fc99e Initial load
duke
parents:
diff changeset
383 if (Verbose && PrintGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 size_t new_size_after = _virtual_space.committed_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 size_t eden_size_after = eden()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
386 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
387 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
388 SIZE_FORMAT "K [eden="
0
a61af66fc99e Initial load
duke
parents:
diff changeset
389 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
390 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
391 eden_size_after/K, survivor_size_after/K);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 gclog_or_tty->print("[allowed " SIZE_FORMAT "K extra for %d threads]",
a61af66fc99e Initial load
duke
parents:
diff changeset
394 thread_increase_size/K, threads_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 gclog_or_tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
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::object_iterate_since_last_GC(ObjectClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // $$$ This may be wrong in case of "scavenge failure"?
a61af66fc99e Initial load
duke
parents:
diff changeset
403 eden()->object_iterate(cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void DefNewGeneration::younger_refs_iterate(OopsInGenClosure* cl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 assert(false, "NYI -- are you sure you want to call this?");
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 size_t DefNewGeneration::capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 return eden()->capacity()
a61af66fc99e Initial load
duke
parents:
diff changeset
413 + from()->capacity(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 size_t DefNewGeneration::used() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 return eden()->used()
a61af66fc99e Initial load
duke
parents:
diff changeset
419 + from()->used(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
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::free() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 return eden()->free()
a61af66fc99e Initial load
duke
parents:
diff changeset
425 + from()->free(); // to() is only used during scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 size_t DefNewGeneration::max_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 const size_t alignment = GenCollectedHeap::heap()->collector_policy()->min_alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 const size_t reserved_bytes = reserved().byte_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
431 return reserved_bytes - compute_survivor_size(reserved_bytes, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 size_t DefNewGeneration::unsafe_max_alloc_nogc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 return eden()->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 size_t DefNewGeneration::capacity_before_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return eden()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 size_t DefNewGeneration::contiguous_available() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 return eden()->free();
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 HeapWord** DefNewGeneration::top_addr() const { return eden()->top_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 HeapWord** DefNewGeneration::end_addr() const { return eden()->end_addr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void DefNewGeneration::object_iterate(ObjectClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 eden()->object_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 from()->object_iterate(blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 void DefNewGeneration::space_iterate(SpaceClosure* blk,
a61af66fc99e Initial load
duke
parents:
diff changeset
457 bool usedOnly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 blk->do_space(eden());
a61af66fc99e Initial load
duke
parents:
diff changeset
459 blk->do_space(from());
a61af66fc99e Initial load
duke
parents:
diff changeset
460 blk->do_space(to());
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // The last collection bailed out, we are running out of heap space,
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // so we try to allocate the from-space, too.
a61af66fc99e Initial load
duke
parents:
diff changeset
465 HeapWord* DefNewGeneration::allocate_from_space(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 HeapWord* result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 gclog_or_tty->print("DefNewGeneration::allocate_from_space(%u):"
a61af66fc99e Initial load
duke
parents:
diff changeset
469 " will_fail: %s"
a61af66fc99e Initial load
duke
parents:
diff changeset
470 " heap_lock: %s"
a61af66fc99e Initial load
duke
parents:
diff changeset
471 " free: " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
472 size,
a61af66fc99e Initial load
duke
parents:
diff changeset
473 GenCollectedHeap::heap()->incremental_collection_will_fail() ? "true" : "false",
a61af66fc99e Initial load
duke
parents:
diff changeset
474 Heap_lock->is_locked() ? "locked" : "unlocked",
a61af66fc99e Initial load
duke
parents:
diff changeset
475 from()->free());
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 if (should_allocate_from_space() || GC_locker::is_active_and_needs_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (Heap_lock->owned_by_self() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
479 (SafepointSynchronize::is_at_safepoint() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
480 Thread::current()->is_VM_thread())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // If the Heap_lock is not locked by this thread, this will be called
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // again later with the Heap_lock held.
a61af66fc99e Initial load
duke
parents:
diff changeset
483 result = from()->allocate(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
484 } else if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 gclog_or_tty->print_cr(" Heap_lock is not owned by self");
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487 } else if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 gclog_or_tty->print_cr(" should_allocate_from_space: NOT");
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 gclog_or_tty->print_cr(" returns %s", result == NULL ? "NULL" : "object");
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 HeapWord* DefNewGeneration::expand_and_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
497 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
498 bool parallel) {
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // We don't attempt to expand the young generation (but perhaps we should.)
a61af66fc99e Initial load
duke
parents:
diff changeset
500 return allocate(size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 void DefNewGeneration::collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
505 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
506 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
507 bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 assert(full || size > 0, "otherwise we don't want to collect");
a61af66fc99e Initial load
duke
parents:
diff changeset
509 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 _next_gen = gch->next_gen(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 assert(_next_gen != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
512 "This must be the youngest gen, and not the only gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // If the next generation is too full to accomodate promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // from this generation, pass on collection; let the next generation
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // do it.
a61af66fc99e Initial load
duke
parents:
diff changeset
517 if (!collection_attempt_is_safe()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 gch->set_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
519 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521 assert(to()->is_empty(), "Else not collection_attempt_is_safe");
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 init_assuming_no_promotion_failure();
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 TraceTime t1("GC", PrintGC && !PrintGCDetails, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // Capture heap used before collection (for printing).
a61af66fc99e Initial load
duke
parents:
diff changeset
527 size_t gch_prev_used = gch->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 SpecializationStats::clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // These can be shared for all code paths
a61af66fc99e Initial load
duke
parents:
diff changeset
532 IsAliveClosure is_alive(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 ScanWeakRefClosure scan_weak_ref(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 age_table()->clear();
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
536 to()->clear(SpaceDecorator::Mangle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 gch->rem_set()->prepare_for_younger_refs_iterate(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 assert(gch->no_allocs_since_save_marks(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
541 "save marks have not been newly set.");
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // Not very pretty.
a61af66fc99e Initial load
duke
parents:
diff changeset
544 CollectorPolicy* cp = gch->collector_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 FastScanClosure fsc_with_no_gc_barrier(this, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 FastScanClosure fsc_with_gc_barrier(this, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 set_promo_failure_scan_stack_closure(&fsc_with_no_gc_barrier);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 FastEvacuateFollowersClosure evacuate_followers(gch, _level, this,
a61af66fc99e Initial load
duke
parents:
diff changeset
551 &fsc_with_no_gc_barrier,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 &fsc_with_gc_barrier);
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 assert(gch->no_allocs_since_save_marks(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
555 "save marks have not been newly set.");
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 gch->gen_process_strong_roots(_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
558 true, // Process younger gens, if any, as
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // strong roots.
a61af66fc99e Initial load
duke
parents:
diff changeset
560 false,// not collecting permanent generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
561 SharedHeap::SO_AllClasses,
a61af66fc99e Initial load
duke
parents:
diff changeset
562 &fsc_with_gc_barrier,
a61af66fc99e Initial load
duke
parents:
diff changeset
563 &fsc_with_no_gc_barrier);
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // "evacuate followers".
a61af66fc99e Initial load
duke
parents:
diff changeset
566 evacuate_followers.do_void();
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 FastKeepAliveClosure keep_alive(this, &scan_weak_ref);
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
569 ReferenceProcessor* rp = ref_processor();
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
570 rp->snap_policy(clear_all_soft_refs);
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
571 rp->process_discovered_references(&is_alive, &keep_alive, &evacuate_followers,
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 356
diff changeset
572 NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 if (!promotion_failed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // Swap the survivor spaces.
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
575 eden()->clear(SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
576 from()->clear(SpaceDecorator::Mangle);
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
577 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
578 // 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
579 // 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
580 // 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
581 // 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
582 // 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
583 // 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
584 // other spaces.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
585 to()->mangle_unused_area();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
586 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 swap_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 assert(to()->is_empty(), "to space should be empty now");
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Set the desired survivor size to half the real survivor space
a61af66fc99e Initial load
duke
parents:
diff changeset
592 _tenuring_threshold =
a61af66fc99e Initial load
duke
parents:
diff changeset
593 age_table()->compute_tenuring_threshold(to()->capacity()/HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 if (PrintGC && !PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 gch->print_heap_change(gch_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 assert(HandlePromotionFailure,
a61af66fc99e Initial load
duke
parents:
diff changeset
600 "Should not be here unless promotion failure handling is on");
a61af66fc99e Initial load
duke
parents:
diff changeset
601 assert(_promo_failure_scan_stack != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
602 _promo_failure_scan_stack->length() == 0, "post condition");
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // deallocate stack and it's elements
a61af66fc99e Initial load
duke
parents:
diff changeset
605 delete _promo_failure_scan_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 _promo_failure_scan_stack = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 remove_forwarding_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
609 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
610 gclog_or_tty->print(" (promotion failed)");
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Add to-space to the list of space to compact
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // when a promotion failure has occurred. In that
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // case there can be live objects in to-space
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // as a result of a partial evacuation of eden
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // and from-space.
a61af66fc99e Initial load
duke
parents:
diff changeset
617 swap_spaces(); // For the sake of uniformity wrt ParNewGeneration::collect().
a61af66fc99e Initial load
duke
parents:
diff changeset
618 from()->set_next_compaction_space(to());
a61af66fc99e Initial load
duke
parents:
diff changeset
619 gch->set_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // Reset the PromotionFailureALot counters.
a61af66fc99e Initial load
duke
parents:
diff changeset
622 NOT_PRODUCT(Universe::heap()->reset_promotion_should_fail();)
a61af66fc99e Initial load
duke
parents:
diff changeset
623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // set new iteration safe limit for the survivor spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
625 from()->set_concurrent_iteration_safe_limit(from()->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
626 to()->set_concurrent_iteration_safe_limit(to()->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
627 SpecializationStats::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
628 update_time_of_last_gc(os::javaTimeMillis());
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 class RemoveForwardPointerClosure: public ObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
633 void do_object(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 obj->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
636 };
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 void DefNewGeneration::init_assuming_no_promotion_failure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 _promotion_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
640 from()->set_next_compaction_space(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 void DefNewGeneration::remove_forwarding_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 RemoveForwardPointerClosure rspc;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 eden()->object_iterate(&rspc);
a61af66fc99e Initial load
duke
parents:
diff changeset
646 from()->object_iterate(&rspc);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // Now restore saved marks, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
648 if (_objs_with_preserved_marks != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
649 assert(_preserved_marks_of_objs != NULL, "Both or none.");
a61af66fc99e Initial load
duke
parents:
diff changeset
650 assert(_objs_with_preserved_marks->length() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
651 _preserved_marks_of_objs->length(), "Both or none.");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 oop obj = _objs_with_preserved_marks->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
654 markOop m = _preserved_marks_of_objs->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
655 obj->set_mark(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
657 delete _objs_with_preserved_marks;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 delete _preserved_marks_of_objs;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 _objs_with_preserved_marks = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 _preserved_marks_of_objs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 if (m->must_be_preserved_for_promotion_failure(obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 if (_objs_with_preserved_marks == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
667 assert(_preserved_marks_of_objs == NULL, "Both or none.");
a61af66fc99e Initial load
duke
parents:
diff changeset
668 _objs_with_preserved_marks = new (ResourceObj::C_HEAP)
a61af66fc99e Initial load
duke
parents:
diff changeset
669 GrowableArray<oop>(PreserveMarkStackSize, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 _preserved_marks_of_objs = new (ResourceObj::C_HEAP)
a61af66fc99e Initial load
duke
parents:
diff changeset
671 GrowableArray<markOop>(PreserveMarkStackSize, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673 _objs_with_preserved_marks->push(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 _preserved_marks_of_objs->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 void DefNewGeneration::handle_promotion_failure(oop old) {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 preserve_mark_if_necessary(old, old->mark());
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // forward to self
a61af66fc99e Initial load
duke
parents:
diff changeset
681 old->forward_to(old);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 _promotion_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 push_on_promo_failure_scan_stack(old);
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 if (!_promo_failure_drain_in_progress) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // prevent recursion in copy_to_survivor_space()
a61af66fc99e Initial load
duke
parents:
diff changeset
688 _promo_failure_drain_in_progress = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 drain_promo_failure_scan_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
690 _promo_failure_drain_in_progress = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
693
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
694 oop DefNewGeneration::copy_to_survivor_space(oop old) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 assert(is_in_reserved(old) && !old->is_forwarded(),
a61af66fc99e Initial load
duke
parents:
diff changeset
696 "shouldn't be scavenging this oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
697 size_t s = old->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 oop obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // Try allocating obj in to-space (unless too old)
a61af66fc99e Initial load
duke
parents:
diff changeset
701 if (old->age() < tenuring_threshold()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 obj = (oop) to()->allocate(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // Otherwise try allocating obj tenured
a61af66fc99e Initial load
duke
parents:
diff changeset
706 if (obj == NULL) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
707 obj = _next_gen->promote(old, s);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
708 if (obj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (!HandlePromotionFailure) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // A failed promotion likely means the MaxLiveObjectEvacuationRatio flag
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // is incorrectly set. In any case, its seriously wrong to be here!
a61af66fc99e Initial load
duke
parents:
diff changeset
712 vm_exit_out_of_memory(s*wordSize, "promotion");
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714
a61af66fc99e Initial load
duke
parents:
diff changeset
715 handle_promotion_failure(old);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 return old;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // Prefetch beyond obj
a61af66fc99e Initial load
duke
parents:
diff changeset
720 const intx interval = PrefetchCopyIntervalInBytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
721 Prefetch::write(obj, interval);
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // Copy obj
a61af66fc99e Initial load
duke
parents:
diff changeset
724 Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // Increment age if obj still in new generation
a61af66fc99e Initial load
duke
parents:
diff changeset
727 obj->incr_age();
a61af66fc99e Initial load
duke
parents:
diff changeset
728 age_table()->add(obj, s);
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // Done, insert forward pointer to obj in this header
a61af66fc99e Initial load
duke
parents:
diff changeset
732 old->forward_to(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 void DefNewGeneration::push_on_promo_failure_scan_stack(oop obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 if (_promo_failure_scan_stack == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 _promo_failure_scan_stack = new (ResourceObj::C_HEAP)
a61af66fc99e Initial load
duke
parents:
diff changeset
740 GrowableArray<oop>(40, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 _promo_failure_scan_stack->push(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 void DefNewGeneration::drain_promo_failure_scan_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 assert(_promo_failure_scan_stack != NULL, "precondition");
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 while (_promo_failure_scan_stack->length() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 oop obj = _promo_failure_scan_stack->pop();
a61af66fc99e Initial load
duke
parents:
diff changeset
751 obj->oop_iterate(_promo_failure_scan_stack_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 void DefNewGeneration::save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 eden()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
757 to()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
758 from()->set_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 void DefNewGeneration::reset_saved_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 eden()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
764 to()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
765 from()->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 bool DefNewGeneration::no_allocs_since_save_marks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 assert(eden()->saved_mark_at_top(), "Violated spec - alloc in eden");
a61af66fc99e Initial load
duke
parents:
diff changeset
771 assert(from()->saved_mark_at_top(), "Violated spec - alloc in from");
a61af66fc99e Initial load
duke
parents:
diff changeset
772 return to()->saved_mark_at_top();
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 #define DefNew_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
776 \
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void DefNewGeneration:: \
a61af66fc99e Initial load
duke
parents:
diff changeset
778 oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
779 cl->set_generation(this); \
a61af66fc99e Initial load
duke
parents:
diff changeset
780 eden()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
781 to()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
782 from()->oop_since_save_marks_iterate##nv_suffix(cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
783 cl->reset_generation(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
784 save_marks(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 ALL_SINCE_SAVE_MARKS_CLOSURES(DefNew_SINCE_SAVE_MARKS_DEFN)
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 #undef DefNew_SINCE_SAVE_MARKS_DEFN
a61af66fc99e Initial load
duke
parents:
diff changeset
790
a61af66fc99e Initial load
duke
parents:
diff changeset
791 void DefNewGeneration::contribute_scratch(ScratchBlock*& list, Generation* requestor,
a61af66fc99e Initial load
duke
parents:
diff changeset
792 size_t max_alloc_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 if (requestor == this || _promotion_failed) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
794 assert(requestor->level() > level(), "DefNewGeneration must be youngest");
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 /* $$$ Assert this? "trace" is a "MarkSweep" function so that's not appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
797 if (to_space->top() > to_space->bottom()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 trace("to_space not empty when contribute_scratch called");
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800 */
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 ContiguousSpace* to_space = to();
a61af66fc99e Initial load
duke
parents:
diff changeset
803 assert(to_space->end() >= to_space->top(), "pointers out of order");
a61af66fc99e Initial load
duke
parents:
diff changeset
804 size_t free_words = pointer_delta(to_space->end(), to_space->top());
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if (free_words >= MinFreeScratchWords) {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 ScratchBlock* sb = (ScratchBlock*)to_space->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
807 sb->num_words = free_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 sb->next = list;
a61af66fc99e Initial load
duke
parents:
diff changeset
809 list = sb;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
813 void DefNewGeneration::reset_scratch() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
814 // 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
815 // 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
816 // 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
817 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
818 to()->mangle_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
819 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
820 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
821
0
a61af66fc99e Initial load
duke
parents:
diff changeset
822 bool DefNewGeneration::collection_attempt_is_safe() {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 if (!to()->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (_next_gen == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 _next_gen = gch->next_gen(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 assert(_next_gen != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
830 "This must be the youngest gen, and not the only gen");
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // Decide if there's enough room for a full promotion
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // When using extremely large edens, we effectively lose a
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // large amount of old space. Use the "MaxLiveObjectEvacuationRatio"
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // flag to reduce the minimum evacuation space requirements. If
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // there is not enough space to evacuate eden during a scavenge,
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // the VM will immediately exit with an out of memory error.
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // This flag has not been tested
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // with collectors other than simple mark & sweep.
a61af66fc99e Initial load
duke
parents:
diff changeset
841 //
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // Note that with the addition of promotion failure handling, the
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // VM will not immediately exit but will undo the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // collection. The parameter is left here for compatibility.
a61af66fc99e Initial load
duke
parents:
diff changeset
845 const double evacuation_ratio = MaxLiveObjectEvacuationRatio / 100.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // worst_case_evacuation is based on "used()". For the case where this
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // method is called after a collection, this is still appropriate because
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // the case that needs to be detected is one in which a full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // has been done and has overflowed into the young generation. In that
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // case a minor collection will fail (the overflow of the full collection
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // means there is no space in the old generation for any promotion).
a61af66fc99e Initial load
duke
parents:
diff changeset
853 size_t worst_case_evacuation = (size_t)(used() * evacuation_ratio);
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855 return _next_gen->promotion_attempt_is_safe(worst_case_evacuation,
a61af66fc99e Initial load
duke
parents:
diff changeset
856 HandlePromotionFailure);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 void DefNewGeneration::gc_epilogue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // Check if the heap is approaching full after a collection has
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // been done. Generally the young generation is empty at
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // a minimum at the end of a collection. If it is not, then
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // the heap is approaching full.
a61af66fc99e Initial load
duke
parents:
diff changeset
864 GenCollectedHeap* gch = GenCollectedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
865 clear_should_allocate_from_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
866 if (collection_attempt_is_safe()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
867 gch->clear_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
868 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 gch->set_incremental_collection_will_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
870 if (full) { // we seem to be running out of space
a61af66fc99e Initial load
duke
parents:
diff changeset
871 set_should_allocate_from_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
875 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
876 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
877 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
878 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
879 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
880
0
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // update the generation and space performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
882 update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
883 gch->collector_policy()->counters()->update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
886 void DefNewGeneration::record_spaces_top() {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
887 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
888 eden()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
889 to()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
890 from()->set_top_for_allocations();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
891 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
892
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
893
0
a61af66fc99e Initial load
duke
parents:
diff changeset
894 void DefNewGeneration::update_counters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
895 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
896 _eden_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
897 _from_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
898 _to_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
899 _gen_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 void DefNewGeneration::verify(bool allow_dirty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 eden()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 from()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 to()->verify(allow_dirty);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 void DefNewGeneration::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
910 Generation::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 st->print(" eden");
a61af66fc99e Initial load
duke
parents:
diff changeset
912 eden()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 st->print(" from");
a61af66fc99e Initial load
duke
parents:
diff changeset
914 from()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 st->print(" to ");
a61af66fc99e Initial load
duke
parents:
diff changeset
916 to()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 const char* DefNewGeneration::name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 return "def new generation";
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
113
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 // 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
925 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
926 return eden();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
927 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
928
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
929 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
930 bool is_tlab) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
931 // 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
932 // 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
933 // 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
934 // 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
935 // 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
936 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
937 if (result != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
938 return result;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
939 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
940 do {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
941 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
942 if (old_limit < eden()->end()) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
943 // 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
944 HeapWord* new_limit =
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
945 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
946 if (new_limit != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
947 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
948 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
949 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
950 "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
951 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
952 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
953 // 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
954 // 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
955 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
956 break;
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 // 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
959 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
960 } while (result == NULL);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
961
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
962 // 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
963 // 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
964 // 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
965 // circular dependency at compile time.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
966 if (result == NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
967 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
968 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
969 return result;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
970 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
971
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
972 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
973 bool is_tlab) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
974 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
975 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
976
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
977 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
978 // 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
979 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
980 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
981
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
982 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
983 return eden()->capacity();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
984 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
985
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
986 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
987 return unsafe_max_alloc_nogc();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
988 }