annotate src/share/vm/memory/generation.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 30c99d8e0f02
children 7848fc12602b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17727
diff changeset
2 * Copyright (c) 1997, 2014, 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: 1145
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1145
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: 1145
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 #ifndef SHARE_VM_MEMORY_GENERATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
26 #define SHARE_VM_MEMORY_GENERATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
28 #include "gc_implementation/shared/collectorCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
30 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
31 #include "memory/referenceProcessor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
32 #include "memory/universe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
33 #include "memory/watermark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
34 #include "runtime/mutex.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
35 #include "runtime/perfData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
36 #include "runtime/virtualspace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
37
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // A Generation models a heap area for similarly-aged objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // It will contain one ore more spaces holding the actual objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 //
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // The Generation class hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Generation - abstract base class
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // - DefNewGeneration - allocation area (copy collected)
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // - ParNewGeneration - a DefNewGeneration that is collected by
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // several threads
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // - CardGeneration - abstract class adding offset array behavior
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // - OneContigSpaceCardGeneration - abstract class holding a single
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // contiguous space with card marking
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // - TenuredGeneration - tenured (old object) space (markSweepCompact)
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // - ConcurrentMarkSweepGeneration - Mostly Concurrent Mark Sweep Generation
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // (Detlefs-Printezis refinement of
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Boehm-Demers-Schenker)
a61af66fc99e Initial load
duke
parents:
diff changeset
54 //
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // The system configurations currently allowed are:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
57 // DefNewGeneration + TenuredGeneration
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
58 // DefNewGeneration + ConcurrentMarkSweepGeneration
0
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
60 // ParNewGeneration + TenuredGeneration
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
61 // ParNewGeneration + ConcurrentMarkSweepGeneration
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class DefNewGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class GenerationSpec;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class CompactibleSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 class ContiguousSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class CompactPoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 class OopsInGenClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class OopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class ScanClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class FastScanClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 class GenCollectedHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class GenRemSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 class GCStats;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // A "ScratchBlock" represents a block of memory in one generation usable by
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // another. It represents "num_words" free words, starting at and including
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // the address of "this".
a61af66fc99e Initial load
duke
parents:
diff changeset
80 struct ScratchBlock {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 ScratchBlock* next;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 size_t num_words;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 HeapWord scratch_space[1]; // Actually, of size "num_words-2" (assuming
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // first two fields are word-sized.)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 };
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6008
diff changeset
88 class Generation: public CHeapObj<mtGC> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
89 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
91 jlong _time_of_last_gc; // time when last gc on this generation happened (ms)
a61af66fc99e Initial load
duke
parents:
diff changeset
92 MemRegion _prev_used_region; // for collectors that want to "remember" a value for
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // used region at some specific point during collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Minimum and maximum addresses for memory reserved (not necessarily
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // committed) for generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Used by card marking code. Must not overlap with address ranges of
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // other generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 MemRegion _reserved;
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Memory area reserved for generation
a61af66fc99e Initial load
duke
parents:
diff changeset
103 VirtualSpace _virtual_space;
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Level in the generation hierarchy.
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int _level;
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // ("Weak") Reference processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
109 ReferenceProcessor* _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
112 CollectorCounters* _gc_counters;
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Statistics for garbage collection
a61af66fc99e Initial load
duke
parents:
diff changeset
115 GCStats* _gc_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Returns the next generation in the configuration, or else NULL if this
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // is the highest generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 Generation* next_gen() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // Initialize the generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
122 Generation(ReservedSpace rs, size_t initial_byte_size, int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Apply "cl->do_oop" to (the address of) (exactly) all the ref fields in
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // "sp" that point into younger generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // The iteration is only over objects allocated at the start of the
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // iterations; objects allocated as a result of applying the closure are
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // not included.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void younger_refs_in_space_iterate(Space* sp, OopsInGenClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // The set of possible generation kinds.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 enum Name {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 ASParNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 ASConcurrentMarkSweep,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 DefNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 ParNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
138 MarkSweepCompact,
a61af66fc99e Initial load
duke
parents:
diff changeset
139 ConcurrentMarkSweep,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 Other
a61af66fc99e Initial load
duke
parents:
diff changeset
141 };
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 enum SomePublicConstants {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Generations are GenGrain-aligned and have size that are multiples of
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // GenGrain.
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
146 // Note: on ARM we add 1 bit for card_table_base to be properly aligned
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
147 // (we expect its low byte to be zero - see implementation of post_barrier)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
148 LogOfGenGrain = 16 ARM_ONLY(+1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149 GenGrain = 1 << LogOfGenGrain
a61af66fc99e Initial load
duke
parents:
diff changeset
150 };
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // allocate and initialize ("weak") refs processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
153 virtual void ref_processor_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void set_ref_processor(ReferenceProcessor* rp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 assert(_ref_processor == NULL, "clobbering existing _ref_processor");
a61af66fc99e Initial load
duke
parents:
diff changeset
156 _ref_processor = rp;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 virtual Generation::Name kind() { return Generation::Other; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 GenerationSpec* spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // This properly belongs in the collector, but for now this
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // will do.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 virtual bool refs_discovery_is_atomic() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 virtual bool refs_discovery_is_mt() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Space enquiries (results in bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
168 virtual size_t capacity() const = 0; // The maximum number of object bytes the
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // generation can currently hold.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 virtual size_t used() const = 0; // The number of used bytes in the gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 virtual size_t free() const = 0; // The number of free bytes in the gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Support for java.lang.Runtime.maxMemory(); see CollectedHeap.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Returns the total number of bytes available in a generation
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // for the allocation of objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 virtual size_t max_capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // If this is a young generation, the maximum number of bytes that can be
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // allocated in this generation before a GC is triggered.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 virtual size_t capacity_before_gc() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // The largest number of contiguous free bytes in the generation,
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // including expansion (Assumes called at a safepoint.)
a61af66fc99e Initial load
duke
parents:
diff changeset
184 virtual size_t contiguous_available() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // The largest number of contiguous free bytes in this or any higher generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 virtual size_t max_contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
187
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
188 // Returns true if promotions of the specified amount are
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
189 // likely to succeed without a promotion failure.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Promotion of the full amount is not guaranteed but
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
191 // might be attempted in the worst case.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
192 virtual bool promotion_attempt_is_safe(size_t max_promotion_in_bytes) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
194 // For a non-young generation, this interface can be used to inform a
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
195 // generation that a promotion attempt into that generation failed.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
196 // Typically used to enable diagnostic output for post-mortem analysis,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
197 // but other uses of the interface are not ruled out.
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
198 virtual void promotion_failure_occurred() { /* does nothing */ }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 579
diff changeset
199
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Return an estimate of the maximum allocation that could be performed
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // in the generation without triggering any collection or expansion
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // activity. It is "unsafe" because no locks are taken; the result
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // should be treated as an approximation, not a guarantee, for use in
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // heuristic resizing decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 virtual size_t unsafe_max_alloc_nogc() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Returns true if this generation cannot be expanded further
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // without a GC. Override as appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 virtual bool is_maximal_no_gc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return _virtual_space.uncommitted_size() == 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 MemRegion reserved() const { return _reserved; }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Returns a region guaranteed to contain all the objects in the
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 virtual MemRegion used_region() const { return _reserved; }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 MemRegion prev_used_region() const { return _prev_used_region; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 virtual void save_used_region() { _prev_used_region = used_region(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 1972
diff changeset
222 // Returns "TRUE" iff "p" points into the committed areas in the generation.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // For some kinds of generations, this may be an expensive operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // To avoid performance problems stemming from its inadvertent use in
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // product jvm's, we restrict its use to assertion checking or
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // verification only.
a61af66fc99e Initial load
duke
parents:
diff changeset
227 virtual bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 /* Returns "TRUE" iff "p" points into the reserved area of the generation. */
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool is_in_reserved(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 return _reserved.contains(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Check that the generation kind is DefNewGeneration or a sub
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // class of DefNewGeneration and return a DefNewGeneration*
a61af66fc99e Initial load
duke
parents:
diff changeset
236 DefNewGeneration* as_DefNewGeneration();
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // If some space in the generation contains the given "addr", return a
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // pointer to that space, else return "NULL".
a61af66fc99e Initial load
duke
parents:
diff changeset
240 virtual Space* space_containing(const void* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Iteration - do not use for time critical operations
a61af66fc99e Initial load
duke
parents:
diff changeset
243 virtual void space_iterate(SpaceClosure* blk, bool usedOnly = false) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Returns the first space, if any, in the generation that can participate
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // in compaction, or else "NULL".
a61af66fc99e Initial load
duke
parents:
diff changeset
247 virtual CompactibleSpace* first_compaction_space() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // Returns "true" iff this generation should be used to allocate an
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // object of the given size. Young generations might
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // wish to exclude very large objects, for example, since, if allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // often, they would greatly increase the frequency of young-gen
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
254 virtual bool should_allocate(size_t word_size, bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 bool result = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 size_t overflow_limit = (size_t)1 << (BitsPerSize_t - LogHeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (!is_tlab || supports_tlab_allocation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 result = (word_size > 0) && (word_size < overflow_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Allocate and returns a block of the requested size, or returns "NULL".
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Assumes the caller has done any necessary locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 virtual HeapWord* allocate(size_t word_size, bool is_tlab) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Like "allocate", but performs any necessary locking internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
268 virtual HeapWord* par_allocate(size_t word_size, bool is_tlab) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // A 'younger' gen has reached an allocation limit, and uses this to notify
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // the next older gen. The return value is a new limit, or NULL if none. The
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // caller must do the necessary locking.
a61af66fc99e Initial load
duke
parents:
diff changeset
273 virtual HeapWord* allocation_limit_reached(Space* space, HeapWord* top,
a61af66fc99e Initial load
duke
parents:
diff changeset
274 size_t word_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // Some generation may offer a region for shared, contiguous allocation,
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // via inlined code (by exporting the address of the top and end fields
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // defining the extent of the contiguous allocation region.)
a61af66fc99e Initial load
duke
parents:
diff changeset
281
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // This function returns "true" iff the heap supports this kind of
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // allocation. (More precisely, this means the style of allocation that
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // increments *top_addr()" with a CAS.) (Default is "no".)
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // A generation that supports this allocation style must use lock-free
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // allocation for *all* allocation, since there are times when lock free
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // allocation will be concurrent with plain "allocate" calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 virtual bool supports_inline_contig_alloc() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // These functions return the addresses of the fields that define the
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // boundaries of the contiguous allocation area. (These fields should be
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // physicall near to one another.)
a61af66fc99e Initial load
duke
parents:
diff changeset
293 virtual HeapWord** top_addr() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 virtual HeapWord** end_addr() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Thread-local allocation buffers
a61af66fc99e Initial load
duke
parents:
diff changeset
297 virtual bool supports_tlab_allocation() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
298 virtual size_t tlab_capacity() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 guarantee(false, "Generation doesn't support thread local allocation buffers");
a61af66fc99e Initial load
duke
parents:
diff changeset
300 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17467
diff changeset
302 virtual size_t tlab_used() const {
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17467
diff changeset
303 guarantee(false, "Generation doesn't support thread local allocation buffers");
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17467
diff changeset
304 return 0;
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17467
diff changeset
305 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 virtual size_t unsafe_max_tlab_alloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 guarantee(false, "Generation doesn't support thread local allocation buffers");
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // "obj" is the address of an object in a younger generation. Allocate space
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // for "obj" in the current (or some higher) generation, and copy "obj" into
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // the newly allocated space, if possible, returning the result (or NULL if
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // the allocation failed).
a61af66fc99e Initial load
duke
parents:
diff changeset
315 //
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // The "obj_size" argument is just obj->size(), passed along so the caller can
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // avoid repeating the virtual call to retrieve it.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
318 virtual oop promote(oop obj, size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Thread "thread_num" (0 <= i < ParalleGCThreads) wants to promote
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // object "obj", whose original mark word was "m", and whose size is
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // "word_sz". If possible, allocate space for "obj", copy obj into it
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // (taking care to copy "m" into the mark word when done, since the mark
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // word of "obj" may have been overwritten with a forwarding pointer, and
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // also taking care to copy the klass pointer *last*. Returns the new
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // object if successful, or else NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 virtual oop par_promote(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
328 oop obj, markOop m, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Undo, if possible, the most recent par_promote_alloc allocation by
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // "thread_num" ("obj", of "word_sz").
a61af66fc99e Initial load
duke
parents:
diff changeset
332 virtual void par_promote_alloc_undo(int thread_num,
a61af66fc99e Initial load
duke
parents:
diff changeset
333 HeapWord* obj, size_t word_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // Informs the current generation that all par_promote_alloc's in the
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // collection have been completed; any supporting data structures can be
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // reset. Default is to do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 virtual void par_promote_alloc_done(int thread_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Informs the current generation that all oop_since_save_marks_iterates
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // performed by "thread_num" in the current collection, if any, have been
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // completed; any supporting data structures can be reset. Default is to
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 virtual void par_oop_since_save_marks_iterate_done(int thread_num) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // This generation will collect all younger generations
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // during a full collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
348 virtual bool full_collects_younger_generations() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // This generation does in-place marking, meaning that mark words
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // are mutated during the marking phase and presumably reinitialized
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // to a canonical value after the GC. This is currently used by the
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // biased locking implementation to determine whether additional
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // work is required during the GC prologue and epilogue.
a61af66fc99e Initial load
duke
parents:
diff changeset
355 virtual bool performs_in_place_marking() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // Returns "true" iff collect() should subsequently be called on this
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // this generation. See comment below.
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // This is a generic implementation which can be overridden.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 //
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Note: in the current (1.4) implementation, when genCollectedHeap's
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // incremental_collection_will_fail flag is set, all allocations are
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // slow path (the only fast-path place to allocate is DefNew, which
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // will be full if the flag is set).
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Thus, older generations which collect younger generations should
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // test this flag and collect if it is set.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 virtual bool should_collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
368 size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
369 bool is_tlab) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 return (full || should_allocate(word_size, is_tlab));
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
373 // Returns true if the collection is likely to be safely
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
374 // completed. Even if this method returns true, a collection
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
375 // may not be guaranteed to succeed, and the system should be
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
376 // able to safely unwind and recover from that failure, albeit
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
377 // at some additional cost.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
378 virtual bool collection_attempt_is_safe() {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
379 guarantee(false, "Are you sure you want to call this method?");
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
380 return true;
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
381 }
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1681
diff changeset
382
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Perform a garbage collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // If full is true attempt a full garbage collection of this generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // Otherwise, attempting to (at least) free enough space to support an
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // allocation of the given "word_size".
a61af66fc99e Initial load
duke
parents:
diff changeset
387 virtual void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
388 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
389 size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
390 bool is_tlab) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Perform a heap collection, attempting to create (at least) enough
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // space to support an allocation of the given "word_size". If
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // successful, perform the allocation and return the resulting
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // "oop" (initializing the allocated block). If the allocation is
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // still unsuccessful, return "NULL".
a61af66fc99e Initial load
duke
parents:
diff changeset
397 virtual HeapWord* expand_and_allocate(size_t word_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
398 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
399 bool parallel = false) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Some generations may require some cleanup or preparation actions before
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // allowing a collection. The default is to do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
403 virtual void gc_prologue(bool full) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Some generations may require some cleanup actions after a collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // The default is to do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 virtual void gc_epilogue(bool full) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
408
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
409 // Save the high water marks for the used space in a generation.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
410 virtual void record_spaces_top() {};
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
411
0
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Some generations may need to be "fixed-up" after some allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // activity to make them parsable again. The default is to do nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
414 virtual void ensure_parsability() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Time (in ms) when we were last collected or now if a collection is
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
418 virtual jlong time_of_last_gc(jlong now) {
4712
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
419 // Both _time_of_last_gc and now are set using a time source
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
420 // that guarantees monotonically non-decreasing values provided
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
421 // the underlying platform provides such a source. So we still
e7dead7e90af 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
johnc
parents: 4708
diff changeset
422 // have to guard against non-monotonicity.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
423 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
424 if (now < _time_of_last_gc) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17727
diff changeset
425 warning("time warp: "INT64_FORMAT" to "INT64_FORMAT, (int64_t)_time_of_last_gc, (int64_t)now);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427 )
a61af66fc99e Initial load
duke
parents:
diff changeset
428 return _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 virtual void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 _time_of_last_gc = now;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // Generations may keep statistics about collection. This
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // method updates those statistics. current_level is
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // the level of the collection that has most recently
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // occurred. This allows the generation to decide what
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // statistics are valid to collect. For example, the
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // generation can decide to gather the amount of promoted data
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // if the collection of the younger generations has completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
442 GCStats* gc_stats() const { return _gc_stats; }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 virtual void update_gc_stats(int current_level, bool full) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Mark sweep support phase2
a61af66fc99e Initial load
duke
parents:
diff changeset
446 virtual void prepare_for_compaction(CompactPoint* cp);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Mark sweep support phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
448 virtual void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Mark sweep support phase4
a61af66fc99e Initial load
duke
parents:
diff changeset
450 virtual void compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 virtual void post_compact() {ShouldNotReachHere();}
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Support for CMS's rescan. In this general form we return a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // to an abstract object that can be used, based on specific previously
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // decided protocols, to exchange information between generations,
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // information that may be useful for speeding up certain types of
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // garbage collectors. A NULL value indicates to the client that
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // no data recording is expected by the provider. The data-recorder is
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // expected to be GC worker thread-local, with the worker index
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // indicated by "thr_num".
a61af66fc99e Initial load
duke
parents:
diff changeset
461 virtual void* get_data_recorder(int thr_num) { return NULL; }
11973
7b06ae405d7b 6990419: CMS Remaining work for 6572569: consistently skewed work distribution in (long) re-mark pauses
jmasa
parents: 11096
diff changeset
462 virtual void sample_eden_chunk() {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Some generations may require some cleanup actions before allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // a verification.
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual void prepare_for_verify() {};
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Accessing "marks".
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // This function gives a generation a chance to note a point between
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // collections. For example, a contiguous generation might note the
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // beginning allocation point post-collection, which might allow some later
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // operations to be optimized.
a61af66fc99e Initial load
duke
parents:
diff changeset
474 virtual void save_marks() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // This function allows generations to initialize any "saved marks". That
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // is, should only be called when the generation is empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 virtual void reset_saved_marks() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // This function is "true" iff any no allocations have occurred in the
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // generation since the last call to "save_marks".
a61af66fc99e Initial load
duke
parents:
diff changeset
482 virtual bool no_allocs_since_save_marks() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Apply "cl->apply" to (the addresses of) all reference fields in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // allocated in the current generation since the last call to "save_marks".
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // If more objects are allocated in this generation as a result of applying
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // the closure, iterates over reference fields in those objects as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // Calls "save_marks" at the end of the iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // General signature...
a61af66fc99e Initial load
duke
parents:
diff changeset
490 virtual void oop_since_save_marks_iterate_v(OopsInGenClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // ...and specializations for de-virtualization. (The general
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // implemention of the _nv versions call the virtual version.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Note that the _nv suffix is not really semantically necessary,
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // but it avoids some not-so-useful warnings on Solaris.)
a61af66fc99e Initial load
duke
parents:
diff changeset
495 #define Generation_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
496 virtual void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
497 oop_since_save_marks_iterate_v((OopsInGenClosure*)cl); \
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(Generation_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 #undef Generation_SINCE_SAVE_MARKS_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // The "requestor" generation is performing some garbage collection
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // action for which it would be useful to have scratch space. If
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // the target is not the requestor, no gc actions will be required
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // of the target. The requestor promises to allocate no more than
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // "max_alloc_words" in the target generation (via promotion say,
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // if the requestor is a young generation and the target is older).
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // If the target generation can provide any scratch space, it adds
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // it to "list", leaving "list" pointing to the head of the
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // augmented list. The default is to offer no space.
a61af66fc99e Initial load
duke
parents:
diff changeset
512 virtual void contribute_scratch(ScratchBlock*& list, Generation* requestor,
a61af66fc99e Initial load
duke
parents:
diff changeset
513 size_t max_alloc_words) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
514
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
515 // Give each generation an opportunity to do clean up for any
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
516 // contributed scratch.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
517 virtual void reset_scratch() {};
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
518
0
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // When an older generation has been collected, and perhaps resized,
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // this method will be invoked on all younger generations (from older to
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // younger), allowing them to resize themselves as appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 virtual void compute_new_size() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
525 virtual const char* name() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 virtual const char* short_name() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 int level() const { return _level; }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // Attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // True iff the given generation may only be the youngest generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
533 virtual bool must_be_youngest() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // True iff the given generation may only be the oldest generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 virtual bool must_be_oldest() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Reference Processing accessor
a61af66fc99e Initial load
duke
parents:
diff changeset
538 ReferenceProcessor* const ref_processor() { return _ref_processor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // Iteration.
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // Iterate over all the ref-containing fields of all objects in the
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // generation, calling "cl.do_oop" on each.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
544 virtual void oop_iterate(ExtendedOopClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // Iterate over all objects in the generation, calling "cl.do_object" on
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // each.
a61af66fc99e Initial load
duke
parents:
diff changeset
548 virtual void object_iterate(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
549
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 271
diff changeset
550 // Iterate over all safe objects in the generation, calling "cl.do_object" on
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 271
diff changeset
551 // each. An object is safe if its references point to other objects in
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 271
diff changeset
552 // the heap. This defaults to object_iterate() unless overridden.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 271
diff changeset
553 virtual void safe_object_iterate(ObjectClosure* cl);
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 271
diff changeset
554
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // Apply "cl->do_oop" to (the address of) all and only all the ref fields
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // in the current generation that contain pointers to objects in younger
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // generations. Objects allocated since the last "save_marks" call are
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // excluded.
a61af66fc99e Initial load
duke
parents:
diff changeset
559 virtual void younger_refs_iterate(OopsInGenClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // Inform a generation that it longer contains references to objects
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // in any younger generation. [e.g. Because younger gens are empty,
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // clear the card table.]
a61af66fc99e Initial load
duke
parents:
diff changeset
564 virtual void clear_remembered_set() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // Inform a generation that some of its objects have moved. [e.g. The
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // generation's spaces were compacted, invalidating the card table.]
a61af66fc99e Initial load
duke
parents:
diff changeset
568 virtual void invalidate_remembered_set() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // Block abstraction.
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // Returns the address of the start of the "block" that contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // address "addr". We say "blocks" instead of "object" since some heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // may not pack objects densely; a chunk may either be an object or a
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // non-object.
a61af66fc99e Initial load
duke
parents:
diff changeset
576 virtual HeapWord* block_start(const void* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // of the active area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
581 virtual size_t block_size(const HeapWord* addr) const ;
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // the block is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 virtual bool block_is_obj(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // PrintGC, PrintGCDetails support
a61af66fc99e Initial load
duke
parents:
diff changeset
589 void print_heap_change(size_t prev_used) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // PrintHeapAtGC support
a61af66fc99e Initial load
duke
parents:
diff changeset
592 virtual void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
593 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
594
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4712
diff changeset
595 virtual void verify() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 struct StatRecord {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 int invocations;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 elapsedTimer accumulated_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 StatRecord() :
a61af66fc99e Initial load
duke
parents:
diff changeset
601 invocations(0),
a61af66fc99e Initial load
duke
parents:
diff changeset
602 accumulated_time(elapsedTimer()) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
603 };
a61af66fc99e Initial load
duke
parents:
diff changeset
604 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
605 StatRecord _stat_record;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
607 StatRecord* stat_record() { return &_stat_record; }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 virtual void print_summary_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
610 virtual void print_summary_info_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Performance Counter support
a61af66fc99e Initial load
duke
parents:
diff changeset
613 virtual void update_counters() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 virtual CollectorCounters* counters() { return _gc_counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // Class CardGeneration is a generation that is covered by a card table,
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // and uses a card-size block-offset array to implement block_start.
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // class BlockOffsetArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // class BlockOffsetArrayContigSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 class BlockOffsetSharedArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 class CardGeneration: public Generation {
a61af66fc99e Initial load
duke
parents:
diff changeset
625 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // This is shared with other generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
628 GenRemSet* _rs;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // This is local to this generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
630 BlockOffsetSharedArray* _bts;
a61af66fc99e Initial load
duke
parents:
diff changeset
631
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
632 // current shrinking effect: this damps shrinking when the heap gets empty.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
633 size_t _shrink_factor;
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
634
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
635 size_t _min_heap_delta_bytes; // Minimum amount to expand.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
636
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
637 // Some statistics from before gc started.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
638 // These are gathered in the gc_prologue (and should_collect)
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
639 // to control growing/shrinking policy in spite of promotions.
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
640 size_t _capacity_at_prologue;
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
641 size_t _used_at_prologue;
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
642
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643 CardGeneration(ReservedSpace rs, size_t initial_byte_size, int level,
a61af66fc99e Initial load
duke
parents:
diff changeset
644 GenRemSet* remset);
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
647
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
648 // Attempt to expand the generation by "bytes". Expand by at a
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
649 // minimum "expand_bytes". Return true if some amount (not
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
650 // necessarily the full "bytes") was done.
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
651 virtual bool expand(size_t bytes, size_t expand_bytes);
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
652
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
653 // Shrink generation with specified size (returns false if unable to shrink)
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
654 virtual void shrink(size_t bytes) = 0;
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
655
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
656 virtual void compute_new_size();
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
657
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658 virtual void clear_remembered_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
659
a61af66fc99e Initial load
duke
parents:
diff changeset
660 virtual void invalidate_remembered_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 virtual void prepare_for_verify();
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
663
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
664 // Grow generation with specified size (returns false if unable to grow)
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
665 virtual bool grow_by(size_t bytes) = 0;
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
666 // Grow generation to reserved size.
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
667 virtual bool grow_to_reserved() = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
668 };
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // OneContigSpaceCardGeneration models a heap of old objects contained in a single
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // contiguous space.
a61af66fc99e Initial load
duke
parents:
diff changeset
672 //
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // Garbage collection is performed using mark-compact.
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 class OneContigSpaceCardGeneration: public CardGeneration {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // Abstractly, this is a subtype that gets access to protected fields.
a61af66fc99e Initial load
duke
parents:
diff changeset
678 friend class VM_PopulateDumpSharedSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
681 ContiguousSpace* _the_space; // actual space holding objects
a61af66fc99e Initial load
duke
parents:
diff changeset
682 WaterMark _last_gc; // watermark between objects allocated before
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // and after last GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Grow generation with specified size (returns false if unable to grow)
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
686 virtual bool grow_by(size_t bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // Grow generation to reserved size.
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
688 virtual bool grow_to_reserved();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Shrink generation with specified size (returns false if unable to shrink)
a61af66fc99e Initial load
duke
parents:
diff changeset
690 void shrink_by(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // Allocation failure
271
818a18cd69a8 6730514: assertion failure in mangling code when expanding by 0 bytes
jmasa
parents: 269
diff changeset
693 virtual bool expand(size_t bytes, size_t expand_bytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694 void shrink(size_t bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // Accessing spaces
a61af66fc99e Initial load
duke
parents:
diff changeset
697 ContiguousSpace* the_space() const { return _the_space; }
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
700 OneContigSpaceCardGeneration(ReservedSpace rs, size_t initial_byte_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
701 int level, GenRemSet* remset,
a61af66fc99e Initial load
duke
parents:
diff changeset
702 ContiguousSpace* space) :
a61af66fc99e Initial load
duke
parents:
diff changeset
703 CardGeneration(rs, initial_byte_size, level, remset),
9072
8617e38bb4cb 8008508: CMS does not correctly reduce heap size after a Full GC
jmasa
parents: 6725
diff changeset
704 _the_space(space)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 {}
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 inline bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // Space enquiries
a61af66fc99e Initial load
duke
parents:
diff changeset
710 size_t capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
711 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
712 size_t free() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 MemRegion used_region() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 size_t unsafe_max_alloc_nogc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 size_t contiguous_available() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
720 void object_iterate(ObjectClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 void space_iterate(SpaceClosure* blk, bool usedOnly = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 void younger_refs_iterate(OopsInGenClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 inline CompactibleSpace* first_compaction_space() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 virtual inline HeapWord* allocate(size_t word_size, bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 virtual inline HeapWord* par_allocate(size_t word_size, bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // Accessing marks
a61af66fc99e Initial load
duke
parents:
diff changeset
731 inline WaterMark top_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
732 inline WaterMark bottom_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 #define OneContig_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
735 void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 OneContig_SINCE_SAVE_MARKS_DECL(OopsInGenClosure,_v)
a61af66fc99e Initial load
duke
parents:
diff changeset
737 SPECIALIZED_SINCE_SAVE_MARKS_CLOSURES(OneContig_SINCE_SAVE_MARKS_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
740 void reset_saved_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
741 bool no_allocs_since_save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 inline size_t block_size(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 inline bool block_is_obj(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 virtual void collect(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
748 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
749 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
750 bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
751 HeapWord* expand_and_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
752 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
753 bool parallel = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 virtual void prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757 virtual void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
758
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
759 virtual void record_spaces_top();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 113
diff changeset
760
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 4712
diff changeset
761 virtual void verify();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
762 virtual void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
763 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
764
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1888
diff changeset
765 #endif // SHARE_VM_MEMORY_GENERATION_HPP