1 /*
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_MEMORY_DEFNEWGENERATION_HPP
26 #define SHARE_VM_MEMORY_DEFNEWGENERATION_HPP
27
28 #include "gc_implementation/shared/ageTable.hpp"
29 #include "gc_implementation/shared/cSpaceCounters.hpp"
30 #include "gc_implementation/shared/generationCounters.hpp"
31 #include "memory/generation.inline.hpp"
32 #include "utilities/stack.hpp"
33
34 class EdenSpace;
35 class ContiguousSpace;
36 class ScanClosure;
37
38 // DefNewGeneration is a young generation containing eden, from- and
39 // to-space.
40
41 class DefNewGeneration: public Generation {
42 friend class VMStructs;
43
44 protected:
45 Generation* _next_gen;
46 uint _tenuring_threshold; // Tenuring threshold for next collection.
47 ageTable _age_table;
48 // Size of object to pretenure in words; command line provides bytes
49 size_t _pretenure_size_threshold_words;
50
51 ageTable* age_table() { return &_age_table; }
52 // Initialize state to optimistically assume no promotion failure will
53 // happen.
54 void init_assuming_no_promotion_failure();
55 // True iff a promotion has failed in the current collection.
56 bool _promotion_failed;
57 bool promotion_failed() { return _promotion_failed; }
58
59 // Handling promotion failure. A young generation collection
60 // can fail if a live object cannot be copied out of its
61 // location in eden or from-space during the collection. If
62 // a collection fails, the young generation is left in a
63 // consistent state such that it can be collected by a
64 // full collection.
65 // Before the collection
66 // Objects are in eden or from-space
67 // All roots into the young generation point into eden or from-space.
68 //
69 // After a failed collection
70 // Objects may be in eden, from-space, or to-space
71 // An object A in eden or from-space may have a copy B
72 // in to-space. If B exists, all roots that once pointed
73 // to A must now point to B.
74 // All objects in the young generation are unmarked.
75 // Eden, from-space, and to-space will all be collected by
76 // the full collection.
77 void handle_promotion_failure(oop);
115 // Allocation support
116 bool _should_allocate_from_space;
117 bool should_allocate_from_space() const {
118 return _should_allocate_from_space;
119 }
120 void clear_should_allocate_from_space() {
121 _should_allocate_from_space = false;
122 }
123 void set_should_allocate_from_space() {
124 _should_allocate_from_space = true;
125 }
126
127 // Tenuring
128 void adjust_desired_tenuring_threshold();
129
130 // Spaces
131 EdenSpace* _eden_space;
132 ContiguousSpace* _from_space;
133 ContiguousSpace* _to_space;
134
135 enum SomeProtectedConstants {
136 // Generations are GenGrain-aligned and have size that are multiples of
137 // GenGrain.
138 MinFreeScratchWords = 100
139 };
140
141 // Return the size of a survivor space if this generation were of size
142 // gen_size.
143 size_t compute_survivor_size(size_t gen_size, size_t alignment) const {
144 size_t n = gen_size / (SurvivorRatio + 2);
145 return n > alignment ? align_size_down(n, alignment) : alignment;
146 }
147
148 public: // was "protected" but caused compile error on win32
149 class IsAliveClosure: public BoolObjectClosure {
150 Generation* _g;
151 public:
152 IsAliveClosure(Generation* g);
153 bool do_object_b(oop p);
154 };
186 };
187
188 class FastEvacuateFollowersClosure: public VoidClosure {
189 GenCollectedHeap* _gch;
190 int _level;
191 DefNewGeneration* _gen;
192 FastScanClosure* _scan_cur_or_nonheap;
193 FastScanClosure* _scan_older;
194 public:
195 FastEvacuateFollowersClosure(GenCollectedHeap* gch, int level,
196 DefNewGeneration* gen,
197 FastScanClosure* cur,
198 FastScanClosure* older);
199 void do_void();
200 };
201
202 public:
203 DefNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level,
204 const char* policy="Copy");
205
206 virtual Generation::Name kind() { return Generation::DefNew; }
207
208 // Accessing spaces
209 EdenSpace* eden() const { return _eden_space; }
210 ContiguousSpace* from() const { return _from_space; }
211 ContiguousSpace* to() const { return _to_space; }
212
213 virtual CompactibleSpace* first_compaction_space() const;
214
215 // Space enquiries
216 size_t capacity() const;
217 size_t used() const;
218 size_t free() const;
219 size_t max_capacity() const;
220 size_t capacity_before_gc() const;
221 size_t unsafe_max_alloc_nogc() const;
222 size_t contiguous_available() const;
223
224 size_t max_eden_size() const { return _max_eden_size; }
225 size_t max_survivor_size() const { return _max_survivor_size; }
|
1 /*
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_MEMORY_DEFNEWGENERATION_HPP
26 #define SHARE_VM_MEMORY_DEFNEWGENERATION_HPP
27
28 #include "gc_implementation/shared/ageTable.hpp"
29 #include "gc_implementation/shared/cSpaceCounters.hpp"
30 #include "gc_implementation/shared/generationCounters.hpp"
31 #include "gc_implementation/shared/copyFailedInfo.hpp"
32 #include "memory/generation.inline.hpp"
33 #include "utilities/stack.hpp"
34
35 class EdenSpace;
36 class ContiguousSpace;
37 class ScanClosure;
38 class STWGCTimer;
39
40 // DefNewGeneration is a young generation containing eden, from- and
41 // to-space.
42
43 class DefNewGeneration: public Generation {
44 friend class VMStructs;
45
46 protected:
47 Generation* _next_gen;
48 uint _tenuring_threshold; // Tenuring threshold for next collection.
49 ageTable _age_table;
50 // Size of object to pretenure in words; command line provides bytes
51 size_t _pretenure_size_threshold_words;
52
53 ageTable* age_table() { return &_age_table; }
54
55 // Initialize state to optimistically assume no promotion failure will
56 // happen.
57 void init_assuming_no_promotion_failure();
58 // True iff a promotion has failed in the current collection.
59 bool _promotion_failed;
60 bool promotion_failed() { return _promotion_failed; }
61 PromotionFailedInfo _promotion_failed_info;
62
63 // Handling promotion failure. A young generation collection
64 // can fail if a live object cannot be copied out of its
65 // location in eden or from-space during the collection. If
66 // a collection fails, the young generation is left in a
67 // consistent state such that it can be collected by a
68 // full collection.
69 // Before the collection
70 // Objects are in eden or from-space
71 // All roots into the young generation point into eden or from-space.
72 //
73 // After a failed collection
74 // Objects may be in eden, from-space, or to-space
75 // An object A in eden or from-space may have a copy B
76 // in to-space. If B exists, all roots that once pointed
77 // to A must now point to B.
78 // All objects in the young generation are unmarked.
79 // Eden, from-space, and to-space will all be collected by
80 // the full collection.
81 void handle_promotion_failure(oop);
119 // Allocation support
120 bool _should_allocate_from_space;
121 bool should_allocate_from_space() const {
122 return _should_allocate_from_space;
123 }
124 void clear_should_allocate_from_space() {
125 _should_allocate_from_space = false;
126 }
127 void set_should_allocate_from_space() {
128 _should_allocate_from_space = true;
129 }
130
131 // Tenuring
132 void adjust_desired_tenuring_threshold();
133
134 // Spaces
135 EdenSpace* _eden_space;
136 ContiguousSpace* _from_space;
137 ContiguousSpace* _to_space;
138
139 STWGCTimer* _gc_timer;
140
141 enum SomeProtectedConstants {
142 // Generations are GenGrain-aligned and have size that are multiples of
143 // GenGrain.
144 MinFreeScratchWords = 100
145 };
146
147 // Return the size of a survivor space if this generation were of size
148 // gen_size.
149 size_t compute_survivor_size(size_t gen_size, size_t alignment) const {
150 size_t n = gen_size / (SurvivorRatio + 2);
151 return n > alignment ? align_size_down(n, alignment) : alignment;
152 }
153
154 public: // was "protected" but caused compile error on win32
155 class IsAliveClosure: public BoolObjectClosure {
156 Generation* _g;
157 public:
158 IsAliveClosure(Generation* g);
159 bool do_object_b(oop p);
160 };
192 };
193
194 class FastEvacuateFollowersClosure: public VoidClosure {
195 GenCollectedHeap* _gch;
196 int _level;
197 DefNewGeneration* _gen;
198 FastScanClosure* _scan_cur_or_nonheap;
199 FastScanClosure* _scan_older;
200 public:
201 FastEvacuateFollowersClosure(GenCollectedHeap* gch, int level,
202 DefNewGeneration* gen,
203 FastScanClosure* cur,
204 FastScanClosure* older);
205 void do_void();
206 };
207
208 public:
209 DefNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level,
210 const char* policy="Copy");
211
212 virtual void ref_processor_init();
213
214 virtual Generation::Name kind() { return Generation::DefNew; }
215
216 // Accessing spaces
217 EdenSpace* eden() const { return _eden_space; }
218 ContiguousSpace* from() const { return _from_space; }
219 ContiguousSpace* to() const { return _to_space; }
220
221 virtual CompactibleSpace* first_compaction_space() const;
222
223 // Space enquiries
224 size_t capacity() const;
225 size_t used() const;
226 size_t free() const;
227 size_t max_capacity() const;
228 size_t capacity_before_gc() const;
229 size_t unsafe_max_alloc_nogc() const;
230 size_t contiguous_available() const;
231
232 size_t max_eden_size() const { return _max_eden_size; }
233 size_t max_survivor_size() const { return _max_survivor_size; }
|