annotate src/share/vm/memory/tenuredGeneration.cpp @ 20304:a22acf6d7598

8048112: G1 Full GC needs to support the case when the very first region is not available Summary: Refactor preparation for compaction during Full GC so that it lazily initializes the first compaction point. This also avoids problems later when the first region may not be committed. Also reviewed by K. Barrett. Reviewed-by: brutisso
author tschatzl
date Mon, 21 Jul 2014 10:00:31 +0200
parents 55fb97c4c58d
children 63a4eb8bcd23
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 9072
diff changeset
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 579
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
26 #include "gc_implementation/shared/collectorCounters.hpp"
6595
aaf61e68b255 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 6197
diff changeset
27 #include "gc_implementation/shared/parGCAllocBuffer.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
28 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
29 #include "memory/blockOffsetTable.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
30 #include "memory/generation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
31 #include "memory/generationSpec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
32 #include "memory/space.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
33 #include "memory/tenuredGeneration.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
34 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
35 #include "runtime/java.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
36 #include "utilities/macros.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 TenuredGeneration::TenuredGeneration(ReservedSpace rs,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 size_t initial_byte_size, int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
40 GenRemSet* remset) :
a61af66fc99e Initial load
duke
parents:
diff changeset
41 OneContigSpaceCardGeneration(rs, initial_byte_size,
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
42 level, remset, NULL)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43 {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 HeapWord* bottom = (HeapWord*) _virtual_space.low();
a61af66fc99e Initial load
duke
parents:
diff changeset
45 HeapWord* end = (HeapWord*) _virtual_space.high();
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _the_space = new TenuredSpace(_bts, MemRegion(bottom, end));
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _the_space->reset_saved_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _shrink_factor = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _capacity_at_prologue = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _gc_stats = new GCStats();
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // initialize performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const char* gen_name = "old";
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Generation Counters -- generation 1, 1 subspace
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _gen_counters = new GenerationCounters(gen_name, 1, 1, &_virtual_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _gc_counters = new CollectorCounters("MSC", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _space_counters = new CSpaceCounters(gen_name, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _virtual_space.reserved_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _the_space, _gen_counters);
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
65 #if INCLUDE_ALL_GCS
7451
ca0a78017dc7 8005396: Use ParNew with only one thread instead of DefNew as default for CMS on single CPU machines
brutisso
parents: 6595
diff changeset
66 if (UseParNewGC) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 typedef ParGCAllocBufferWithBOT* ParGCAllocBufferWithBOTPtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _alloc_buffers = NEW_C_HEAP_ARRAY(ParGCAllocBufferWithBOTPtr,
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
69 ParallelGCThreads, mtGC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 if (_alloc_buffers == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
71 vm_exit_during_initialization("Could not allocate alloc_buffers");
a61af66fc99e Initial load
duke
parents:
diff changeset
72 for (uint i = 0; i < ParallelGCThreads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _alloc_buffers[i] =
a61af66fc99e Initial load
duke
parents:
diff changeset
74 new ParGCAllocBufferWithBOT(OldPLABSize, _bts);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 if (_alloc_buffers[i] == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
76 vm_exit_during_initialization("Could not allocate alloc_buffers");
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 _alloc_buffers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
81 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 const char* TenuredGeneration::name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return "tenured generation";
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 void TenuredGeneration::gc_prologue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _capacity_at_prologue = capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _used_at_prologue = used();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (VerifyBeforeGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 verify_alloc_buffers_clean();
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void TenuredGeneration::gc_epilogue(bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (VerifyAfterGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 verify_alloc_buffers_clean();
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 OneContigSpaceCardGeneration::gc_epilogue(full);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 bool TenuredGeneration::should_collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
106 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
107 bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // This should be one big conditional or (||), but I want to be able to tell
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // why it returns what it returns (without re-evaluating the conditionals
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // in case they aren't idempotent), so I'm doing it this way.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // DeMorgan says it's okay.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 bool result = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (!result && full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 gclog_or_tty->print_cr("TenuredGeneration::should_collect: because"
a61af66fc99e Initial load
duke
parents:
diff changeset
117 " full");
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (!result && should_allocate(size, is_tlab)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 gclog_or_tty->print_cr("TenuredGeneration::should_collect: because"
a61af66fc99e Initial load
duke
parents:
diff changeset
124 " should_allocate(" SIZE_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
125 size);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // If we don't have very much free space.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // XXX: 10000 should be a percentage of the capacity!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
130 if (!result && free() < 10000) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 gclog_or_tty->print_cr("TenuredGeneration::should_collect: because"
a61af66fc99e Initial load
duke
parents:
diff changeset
134 " free(): " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 free());
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // If we had to expand to accomodate promotions from younger generations
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if (!result && _capacity_at_prologue < capacity()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 if (PrintGC && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 gclog_or_tty->print_cr("TenuredGeneration::should_collect: because"
a61af66fc99e Initial load
duke
parents:
diff changeset
143 "_capacity_at_prologue: " SIZE_FORMAT " < capacity(): " SIZE_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _capacity_at_prologue, capacity());
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 void TenuredGeneration::collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
152 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
153 bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 retire_alloc_buffers_before_full_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
155 OneContigSpaceCardGeneration::collect(full, clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
156 size, is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
159 void TenuredGeneration::compute_new_size() {
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
160 assert_locked_or_safepoint(Heap_lock);
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
161
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
162 // Compute some numbers about the state of the heap.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
163 const size_t used_after_gc = used();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
164 const size_t capacity_after_gc = capacity();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
165
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
166 CardGeneration::compute_new_size();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
167
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
168 assert(used() == used_after_gc && used_after_gc <= capacity(),
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
169 err_msg("used: " SIZE_FORMAT " used_after_gc: " SIZE_FORMAT
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
170 " capacity: " SIZE_FORMAT, used(), used_after_gc, capacity()));
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 8001
diff changeset
171 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void TenuredGeneration::update_gc_stats(int current_level,
a61af66fc99e Initial load
duke
parents:
diff changeset
173 bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // If the next lower level(s) has been collected, gather any statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // that are of interest at this point.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if (!full && (current_level + 1) == level()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Calculate size of data promoted from the younger generations
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // before doing the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
179 size_t used_before_gc = used();
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // If the younger gen collections were skipped, then the
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // number of promoted bytes will be 0 and adding it to the
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // average will incorrectly lessen the average. It is, however,
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // also possible that no promotion was needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (used_before_gc >= _used_at_prologue) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 size_t promoted_in_bytes = used_before_gc - _used_at_prologue;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 gc_stats()->avg_promoted()->sample(promoted_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 void TenuredGeneration::update_counters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 _space_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 _gen_counters->update_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
200 #if INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201 oop TenuredGeneration::par_promote(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
202 oop old, markOop m, size_t word_sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 ParGCAllocBufferWithBOT* buf = _alloc_buffers[thread_num];
a61af66fc99e Initial load
duke
parents:
diff changeset
205 HeapWord* obj_ptr = buf->allocate(word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 bool is_lab = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (obj_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (Universe::heap()->promotion_should_fail()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 #endif // #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Slow path:
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (word_sz * 100 < ParallelGCBufferWastePct * buf->word_sz()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Is small enough; abandon this buffer and start a new one.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 size_t buf_size = buf->word_sz();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 HeapWord* buf_space =
a61af66fc99e Initial load
duke
parents:
diff changeset
219 TenuredGeneration::par_allocate(buf_size, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 if (buf_space == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 buf_space = expand_and_allocate(buf_size, false, true /* parallel*/);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 if (buf_space != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 buf->retire(false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 buf->set_buf(buf_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 obj_ptr = buf->allocate(word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 assert(obj_ptr != NULL, "Buffer was definitely big enough...");
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 };
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Otherwise, buffer allocation failed; try allocating object
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // individually.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (obj_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 obj_ptr = TenuredGeneration::par_allocate(word_sz, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (obj_ptr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 obj_ptr = expand_and_allocate(word_sz, false, true /* parallel */);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (obj_ptr == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 assert(obj_ptr != NULL, "program logic");
a61af66fc99e Initial load
duke
parents:
diff changeset
241 Copy::aligned_disjoint_words((HeapWord*)old, obj_ptr, word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 oop obj = oop(obj_ptr);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Restore the mark word copied above.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 obj->set_mark(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 void TenuredGeneration::par_promote_alloc_undo(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
249 HeapWord* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
250 size_t word_sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 ParGCAllocBufferWithBOT* buf = _alloc_buffers[thread_num];
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (buf->contains(obj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 guarantee(buf->contains(obj + word_sz - 1),
a61af66fc99e Initial load
duke
parents:
diff changeset
254 "should contain whole object");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 buf->undo_allocation(obj, word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 } else {
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 196
diff changeset
257 CollectedHeap::fill_with_object(obj, word_sz);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void TenuredGeneration::par_promote_alloc_done(int thread_num) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 ParGCAllocBufferWithBOT* buf = _alloc_buffers[thread_num];
a61af66fc99e Initial load
duke
parents:
diff changeset
263 buf->retire(true, ParallelGCRetainPLAB);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void TenuredGeneration::retire_alloc_buffers_before_full_gc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 if (UseParNewGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 for (uint i = 0; i < ParallelGCThreads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 _alloc_buffers[i]->retire(true /*end_of_gc*/, false /*retain*/);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Verify that any retained parallel allocation buffers do not
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // intersect with dirty cards.
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void TenuredGeneration::verify_alloc_buffers_clean() {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (UseParNewGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 for (uint i = 0; i < ParallelGCThreads; i++) {
6
73e96e5c30df 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 0
diff changeset
279 _rs->verify_aligned_region_empty(_alloc_buffers[i]->range());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
6
73e96e5c30df 6624765: Guarantee failure "Unexpected dirty card found"
jmasa
parents: 0
diff changeset
283
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
284 #else // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 void TenuredGeneration::retire_alloc_buffers_before_full_gc() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
286 void TenuredGeneration::verify_alloc_buffers_clean() {}
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7451
diff changeset
287 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
288
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
289 bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
290 size_t available = max_contiguous_available();
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
291 size_t av_promo = (size_t)gc_stats()->avg_promoted()->padded_average();
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
292 bool res = (available >= av_promo) || (available >= max_promotion_in_bytes);
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
293 if (PrintGC && Verbose) {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
294 gclog_or_tty->print_cr(
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
295 "Tenured: promo attempt is%s safe: available("SIZE_FORMAT") %s av_promo("SIZE_FORMAT"),"
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
296 "max_promo("SIZE_FORMAT")",
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
297 res? "":" not", available, res? ">=":"<",
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
298 av_promo, max_promotion_in_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1552
diff changeset
300 return res;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }