annotate src/share/vm/memory/genCollectedHeap.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents a7214d79fcf1
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1166
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1166
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: 1166
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class SubTasksDone;
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // A "GenCollectedHeap" is a SharedHeap that uses generational
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // collection. It is represented with a sequence of Generation's.
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class GenCollectedHeap : public SharedHeap {
a61af66fc99e Initial load
duke
parents:
diff changeset
30 friend class GenCollectorPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 friend class Generation;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 friend class DefNewGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 friend class TenuredGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 friend class ConcurrentMarkSweepGeneration;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 friend class CMSCollector;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 friend class GenMarkSweep;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 friend class VM_GenCollectForAllocation;
139
c0492d52d55b 6539517: CR 6186200 should be extended to perm gen allocation to prevent spurious OOM's from perm gen
apetrusenko
parents: 0
diff changeset
38 friend class VM_GenCollectForPermanentAllocation;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39 friend class VM_GenCollectFull;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 friend class VM_GenCollectFullConcurrent;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 friend class VM_GC_HeapInspection;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 friend class VM_HeapDumper;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 friend class HeapInspection;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 friend class GCCauseSetter;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
47 enum SomeConstants {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 max_gens = 10
a61af66fc99e Initial load
duke
parents:
diff changeset
49 };
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 friend class VM_PopulateDumpSharedSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // Fields:
a61af66fc99e Initial load
duke
parents:
diff changeset
55 static GenCollectedHeap* _gch;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 int _n_gens;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 Generation* _gens[max_gens];
a61af66fc99e Initial load
duke
parents:
diff changeset
60 GenerationSpec** _gen_specs;
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // The generational collector policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
63 GenCollectorPolicy* _gen_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
65 // Indicates that the most recent previous incremental collection failed.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
66 // The flag is cleared when an action is taken that might clear the
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
67 // condition that caused that incremental collection to fail.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
68 bool _incremental_collection_failed;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // In support of ExplicitGCInvokesConcurrent functionality
a61af66fc99e Initial load
duke
parents:
diff changeset
71 unsigned int _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Data structure for claiming the (potentially) parallel tasks in
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // (gen-specific) strong roots processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 SubTasksDone* _gen_process_strong_tasks;
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
76 SubTasksDone* gen_process_strong_tasks() { return _gen_process_strong_tasks; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // In block contents verification, the number of header words to skip
a61af66fc99e Initial load
duke
parents:
diff changeset
79 NOT_PRODUCT(static size_t _skip_header_HeapWords;)
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // GC is not allowed during the dump of the shared classes. Keep track
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // of this in order to provide an reasonable error message when terminating.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 bool _preloading_shared_classes;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Directs each generation up to and including "collectedGen" to recompute
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // its desired size.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 void compute_new_generation_sizes(int collectedGen);
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Helper functions for allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
91 HeapWord* attempt_allocation(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
92 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bool first_only);
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Helper function for two callbacks below.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Considers collection of the first max_level+1 generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void do_collection(bool full,
a61af66fc99e Initial load
duke
parents:
diff changeset
98 bool clear_all_soft_refs,
a61af66fc99e Initial load
duke
parents:
diff changeset
99 size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 int max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // Callback from VM_GenCollectForAllocation operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // This function does everything necessary/possible to satisfy an
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // allocation request that failed in the youngest generation that should
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // have handled it (including collection, expansion, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
107 HeapWord* satisfy_failed_allocation(size_t size, bool is_tlab);
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Callback from VM_GenCollectFull operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Perform a full collection of the first max_level+1 generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void do_full_collection(bool clear_all_soft_refs, int max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Does the "cause" of GC indicate that
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // we absolutely __must__ clear soft refs?
a61af66fc99e Initial load
duke
parents:
diff changeset
115 bool must_clear_all_soft_refs();
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
118 GenCollectedHeap(GenCollectorPolicy *policy);
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 GCStats* gc_stats(int level) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Returns JNI_OK on success
a61af66fc99e Initial load
duke
parents:
diff changeset
123 virtual jint initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 char* allocate(size_t alignment, PermanentGenerationSpec* perm_gen_spec,
a61af66fc99e Initial load
duke
parents:
diff changeset
125 size_t* _total_reserved, int* _n_covered_regions,
a61af66fc99e Initial load
duke
parents:
diff changeset
126 ReservedSpace* heap_rs);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Does operations required after initialization has been done.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void post_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Initialize ("weak") refs processing support
a61af66fc99e Initial load
duke
parents:
diff changeset
132 virtual void ref_processing_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual CollectedHeap::Name kind() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return CollectedHeap::GenCollectedHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // The generational collector policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
139 GenCollectorPolicy* gen_policy() const { return _gen_policy; }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Adaptive size policy
a61af66fc99e Initial load
duke
parents:
diff changeset
142 virtual AdaptiveSizePolicy* size_policy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return gen_policy()->size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 size_t capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 size_t used() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Save the "used_region" for generations level and lower,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // and, if perm is true, for perm gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 void save_used_regions(int level, bool perm);
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 size_t max_capacity() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 HeapWord* mem_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
156 bool is_large_noref,
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
158 bool* gc_overhead_limit_was_exceeded);
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // We may support a shared contiguous allocation area, if the youngest
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // generation does.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 bool supports_inline_contig_alloc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 HeapWord** top_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 HeapWord** end_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Return an estimate of the maximum allocation that could be performed
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // without triggering any collection activity. In a generational
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // collector, for example, this is probably the largest allocation that
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // could be supported in the youngest generation. It is "unsafe" because
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // no locks are taken; the result should be treated as an approximation,
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // not a guarantee.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 size_t unsafe_max_alloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Does this heap support heap inspection? (+PrintClassHistogram)
a61af66fc99e Initial load
duke
parents:
diff changeset
175 virtual bool supports_heap_inspection() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Perform a full collection of the heap; intended for use in implementing
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // "System.gc". This implies as full a collection as the CollectedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // supports. Caller does not hold the Heap_lock on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void collect(GCCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // This interface assumes that it's being called by the
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // vm thread. It collects the heap assuming that the
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // heap lock is already held and that we are executing in
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // the context of the vm thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void collect_as_vm_thread(GCCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // The same as above but assume that the caller holds the Heap_lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void collect_locked(GCCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Perform a full collection of the first max_level+1 generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Mostly used for testing purposes. Caller does not hold the Heap_lock on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void collect(GCCause::Cause cause, int max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Returns "TRUE" iff "p" points into the allocated area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // The methods is_in(), is_in_closed_subset() and is_in_youngest() may
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // be expensive to compute in general, so, to prevent
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // their inadvertent use in product jvm's, we restrict their use to
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // assertion checking or verification only.
a61af66fc99e Initial load
duke
parents:
diff changeset
200 bool is_in(const void* p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // override
a61af66fc99e Initial load
duke
parents:
diff changeset
203 bool is_in_closed_subset(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return is_in_reserved(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
206 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return is_in(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Returns "TRUE" iff "p" points into the youngest generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bool is_in_youngest(void* p);
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Iteration functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void oop_iterate(OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void oop_iterate(MemRegion mr, OopClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void object_iterate(ObjectClosure* cl);
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 356
diff changeset
218 void safe_object_iterate(ObjectClosure* cl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void object_iterate_since_last_GC(ObjectClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 Space* space_containing(const void* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // each address in the (reserved) heap is a member of exactly
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // one block. The defining characteristic of a block is that it is
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // possible to find its size, and thus to progress forward to the next
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // block. (Blocks may be of different sizes.) Thus, blocks may
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // represent Java objects, or they might be free blocks in a
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // free-list-based heap (or subheap), as long as the two kinds are
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // distinguishable and the size of each is determinable.
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Returns the address of the start of the "block" that contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // address "addr". We say "blocks" instead of "object" since some heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // may not pack objects densely; a chunk may either be an object or a
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // non-object.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 virtual HeapWord* block_start(const void* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // of the active area of the heap. Assumes (and verifies in non-product
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // builds) that addr is in the allocated part of the heap and is
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // the start of a chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
242 virtual size_t block_size(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // the block is an object. Assumes (and verifies in non-product
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // builds) that addr is in the allocated part of the heap and is
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // the start of a chunk.
a61af66fc99e Initial load
duke
parents:
diff changeset
248 virtual bool block_is_obj(const HeapWord* addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Section on TLAB's.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 virtual bool supports_tlab_allocation() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 virtual size_t tlab_capacity(Thread* thr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 virtual size_t unsafe_max_tlab_alloc(Thread* thr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 virtual HeapWord* allocate_new_tlab(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
255
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
256 // Can a compiler initialize a new object without store barriers?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
257 // This permission only extends from the creation of a new object
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
258 // via a TLAB up to the first subsequent safepoint.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
259 virtual bool can_elide_tlab_store_barriers() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
260 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
261 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
262
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1028
diff changeset
263 virtual bool card_mark_must_follow_store() const {
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1028
diff changeset
264 return UseConcMarkSweepGC;
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1028
diff changeset
265 }
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1028
diff changeset
266
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
267 // We don't need barriers for stores to objects in the
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
268 // young gen and, a fortiori, for initializing stores to
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
269 // objects therein. This applies to {DefNew,ParNew}+{Tenured,CMS}
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
270 // only and may need to be re-examined in case other
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
271 // kinds of collectors are implemented in the future.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
272 virtual bool can_elide_initializing_store_barrier(oop new_obj) {
1028
052a899eec3e 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 1027
diff changeset
273 // We wanted to assert that:-
052a899eec3e 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 1027
diff changeset
274 // assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC,
052a899eec3e 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 1027
diff changeset
275 // "Check can_elide_initializing_store_barrier() for this collector");
052a899eec3e 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 1027
diff changeset
276 // but unfortunately the flag UseSerialGC need not necessarily always
052a899eec3e 6892749: assert(UseParNewGC || UseSerialGC || UseConcMarkSweepGC, "...") fails
ysr
parents: 1027
diff changeset
277 // be set when DefNew+Tenured are being used.
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
278 return is_in_youngest((void*)new_obj);
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
279 }
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 989
diff changeset
280
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
281 // Can a compiler elide a store barrier when it writes
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
282 // a permanent oop into the heap? Applies when the compiler
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
283 // is storing x to the heap, where x->is_perm() is true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
284 virtual bool can_elide_permanent_oop_store_barriers() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
285 // CMS needs to see all, even intra-generational, ref updates.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
286 return !UseConcMarkSweepGC;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
287 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 142
diff changeset
288
0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // The "requestor" generation is performing some garbage collection
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // action for which it would be useful to have scratch space. The
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // requestor promises to allocate no more than "max_alloc_words" in any
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // older generation (via promotion say.) Any blocks of space that can
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // be provided are returned as a list of ScratchBlocks, sorted by
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // decreasing size.
a61af66fc99e Initial load
duke
parents:
diff changeset
295 ScratchBlock* gather_scratch(Generation* requestor, size_t max_alloc_words);
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
296 // Allow each generation to reset any scratch space that it has
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
297 // contributed as it needs.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
298 void release_scratch();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 size_t large_typearray_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // Ensure parsability: override
a61af66fc99e Initial load
duke
parents:
diff changeset
303 virtual void ensure_parsability(bool retire_tlabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Time in ms since the longest time a collector ran in
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // in any generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 virtual jlong millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Total number of full collections completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
310 unsigned int total_full_collections_completed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 assert(_full_collections_completed <= _total_full_collections,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 "Can't complete more collections than were started");
a61af66fc99e Initial load
duke
parents:
diff changeset
313 return _full_collections_completed;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Update above counter, as appropriate, at the end of a stop-world GC cycle
a61af66fc99e Initial load
duke
parents:
diff changeset
317 unsigned int update_full_collections_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Update above counter, as appropriate, at the end of a concurrent GC cycle
a61af66fc99e Initial load
duke
parents:
diff changeset
319 unsigned int update_full_collections_completed(unsigned int count);
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Update "time of last gc" for all constituent generations
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // to "now".
a61af66fc99e Initial load
duke
parents:
diff changeset
323 void update_time_of_last_gc(jlong now) {
a61af66fc99e Initial load
duke
parents:
diff changeset
324 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 _gens[i]->update_time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 perm_gen()->update_time_of_last_gc(now);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Update the gc statistics for each generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // "level" is the level of the lastest collection
a61af66fc99e Initial load
duke
parents:
diff changeset
332 void update_gc_stats(int current_level, bool full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 for (int i = 0; i < _n_gens; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 _gens[i]->update_gc_stats(current_level, full);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 perm_gen()->update_gc_stats(current_level, full);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 bool no_gc_in_progress() { return !is_gc_active(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 void prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // Override.
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 579
diff changeset
346 void verify(bool allow_dirty, bool silent, bool /* option */);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // Override.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void print() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 virtual void print_gc_threads_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 virtual void gc_threads_do(ThreadClosure* tc) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 virtual void print_tracing_info() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // PrintGC, PrintGCDetails support
a61af66fc99e Initial load
duke
parents:
diff changeset
356 void print_heap_change(size_t prev_used) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 void print_perm_heap_change(size_t perm_prev_used) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // The functions below are helper functions that a subclass of
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // "CollectedHeap" can use in the implementation of its virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 class GenClosure : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
365 virtual void do_generation(Generation* gen) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 };
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Apply "cl.do_generation" to all generations in the heap (not including
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // the permanent generation). If "old_to_young" determines the order.
a61af66fc99e Initial load
duke
parents:
diff changeset
370 void generation_iterate(GenClosure* cl, bool old_to_young);
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 void space_iterate(SpaceClosure* cl);
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Return "true" if all generations (but perm) have reached the
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // maximal committed limit that they can reach, without a garbage
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
377 virtual bool is_maximal_no_gc() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Return the generation before "gen", or else NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 Generation* prev_gen(Generation* gen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 int l = gen->level();
a61af66fc99e Initial load
duke
parents:
diff changeset
382 if (l == 0) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 else return _gens[l-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Return the generation after "gen", or else NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
387 Generation* next_gen(Generation* gen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 int l = gen->level() + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 if (l == _n_gens) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 else return _gens[l];
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 Generation* get_gen(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (i >= 0 && i < _n_gens)
a61af66fc99e Initial load
duke
parents:
diff changeset
395 return _gens[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
396 else
a61af66fc99e Initial load
duke
parents:
diff changeset
397 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 int n_gens() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 assert(_n_gens == gen_policy()->number_of_generations(), "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
402 return _n_gens;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Convenience function to be used in situations where the heap type can be
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // asserted to be this type.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 static GenCollectedHeap* heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void set_par_threads(int t);
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // Invoke the "do_oop" method of one of the closures "not_older_gens"
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // or "older_gens" on root locations for the generation at
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // "level". (The "older_gens" closure is used for scanning references
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // from older generations; "not_older_gens" is used everywhere else.)
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // If "younger_gens_as_roots" is false, younger generations are
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // not scanned as roots; in this case, the caller must be arranging to
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // scan the younger generations itself. (For example, a generation might
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // explicitly mark reachable objects in younger generations, to avoid
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // excess storage retention.) If "collecting_perm_gen" is false, then
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // roots that may only contain references to permGen objects are not
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // scanned. The "so" argument determines which of the roots
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // the closure is applied to:
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // "SO_None" does none;
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // "SO_AllClasses" applies the closure to all entries in the SystemDictionary;
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // "SO_SystemClasses" to all the "system" classes and loaders;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // "SO_Symbols_and_Strings" applies the closure to all entries in
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // SymbolsTable and StringTable.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
429 void gen_process_strong_roots(int level,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
430 bool younger_gens_as_roots,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
431 // The remaining arguments are in an order
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
432 // consistent with SharedHeap::process_strong_roots:
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
433 bool activate_scope,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 bool collecting_perm_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
435 SharedHeap::ScanningOption so,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
436 OopsInGenClosure* not_older_gens,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
437 bool do_code_roots,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
438 OopsInGenClosure* older_gens);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Apply "blk" to all the weak roots of the system. These include
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // JNI weak roots, the code cache, system dictionary, symbol table,
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // string table, and referents of reachable weak refs.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 void gen_process_weak_roots(OopClosure* root_closure,
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
444 CodeBlobClosure* code_roots,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
445 OopClosure* non_root_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Set the saved marks of generations, if that makes sense.
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // In particular, if any generation might iterate over the oops
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // in other generations, it should call this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void save_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // Apply "cur->do_oop" or "older->do_oop" to all the oops in objects
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // allocated since the last call to save_marks in generations at or above
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // "level" (including the permanent generation.) The "cur" closure is
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // applied to references in the generation at "level", and the "older"
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // closure to older (and permanent) generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
457 #define GCH_SINCE_SAVE_MARKS_ITERATE_DECL(OopClosureType, nv_suffix) \
a61af66fc99e Initial load
duke
parents:
diff changeset
458 void oop_since_save_marks_iterate(int level, \
a61af66fc99e Initial load
duke
parents:
diff changeset
459 OopClosureType* cur, \
a61af66fc99e Initial load
duke
parents:
diff changeset
460 OopClosureType* older);
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DECL)
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 #undef GCH_SINCE_SAVE_MARKS_ITERATE_DECL
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Returns "true" iff no allocations have occurred in any generation at
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // "level" or above (including the permanent generation) since the last
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // call to "save_marks".
a61af66fc99e Initial load
duke
parents:
diff changeset
469 bool no_allocs_since_save_marks(int level);
a61af66fc99e Initial load
duke
parents:
diff changeset
470
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
471 // Returns true if an incremental collection is likely to fail.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
472 bool incremental_collection_will_fail() {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
473 // Assumes a 2-generation system; the first disjunct remembers if an
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
474 // incremental collection failed, even when we thought (second disjunct)
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
475 // that it would not.
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
476 assert(heap()->collector_policy()->is_two_generation_policy(),
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
477 "the following definition may not be suitable for an n(>2)-generation system");
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
478 return incremental_collection_failed() || !get_gen(0)->collection_attempt_is_safe();
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
479 }
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
480
0
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // If a generation bails out of an incremental collection,
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // it sets this flag.
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
483 bool incremental_collection_failed() const {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
484 return _incremental_collection_failed;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
486 void set_incremental_collection_failed() {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
487 _incremental_collection_failed = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
1888
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
489 void clear_incremental_collection_failed() {
a7214d79fcf1 6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents: 1833
diff changeset
490 _incremental_collection_failed = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Promotion of obj into gen failed. Try to promote obj to higher non-perm
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // gens in ascending order; return the new location of obj if successful.
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // Otherwise, try expand-and-allocate for obj in each generation starting at
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // gen; return the new location of obj if successful. Otherwise, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
497 oop handle_failed_promotion(Generation* gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
498 oop obj,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
499 size_t obj_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // Accessor for memory state verification support
a61af66fc99e Initial load
duke
parents:
diff changeset
503 NOT_PRODUCT(
a61af66fc99e Initial load
duke
parents:
diff changeset
504 static size_t skip_header_HeapWords() { return _skip_header_HeapWords; }
a61af66fc99e Initial load
duke
parents:
diff changeset
505 )
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // Override
a61af66fc99e Initial load
duke
parents:
diff changeset
508 void check_for_non_bad_heap_word_value(HeapWord* addr,
a61af66fc99e Initial load
duke
parents:
diff changeset
509 size_t size) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // For use by mark-sweep. As implemented, mark-sweep-compact is global
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // in an essential way: compaction is performed across generations, by
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // iterating over spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
514 void prepare_for_compaction();
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Perform a full collection of the first max_level+1 generations.
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // This is the low level interface used by the public versions of
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // collect() and collect_locked(). Caller holds the Heap_lock on entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
519 void collect_locked(GCCause::Cause cause, int max_level);
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Returns success or failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 bool create_cms_collector();
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // In support of ExplicitGCInvokesConcurrent functionality
a61af66fc99e Initial load
duke
parents:
diff changeset
525 bool should_do_concurrent_full_gc(GCCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 void collect_mostly_concurrent(GCCause::Cause cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
527
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
528 // Save the tops of the spaces in all generations
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
529 void record_gen_tops_before_GC() PRODUCT_RETURN;
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 142
diff changeset
530
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
532 virtual void gc_prologue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 virtual void gc_epilogue(bool full);
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
536 virtual void preload_and_dump(TRAPS) KERNEL_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 };