Mercurial > hg > graal-compiler
annotate src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp @ 12233:40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation.
Reviewed-by: stefank, dholmes
author | tschatzl |
---|---|
date | Wed, 11 Sep 2013 16:25:02 +0200 |
parents | f2110083203d |
children | 46d7652b223c |
rev | line source |
---|---|
0 | 1 /* |
10405 | 2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1387
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1387
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:
1387
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARALLELSCAVENGEHEAP_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARALLELSCAVENGEHEAP_HPP | |
27 | |
28 #include "gc_implementation/parallelScavenge/objectStartArray.hpp" | |
29 #include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp" | |
30 #include "gc_implementation/parallelScavenge/psOldGen.hpp" | |
31 #include "gc_implementation/parallelScavenge/psYoungGen.hpp" | |
32 #include "gc_implementation/shared/gcPolicyCounters.hpp" | |
10405 | 33 #include "gc_implementation/shared/gcWhen.hpp" |
1972 | 34 #include "gc_interface/collectedHeap.inline.hpp" |
35 #include "utilities/ostream.hpp" | |
36 | |
0 | 37 class AdjoiningGenerations; |
10405 | 38 class CollectorPolicy; |
39 class GCHeapSummary; | |
0 | 40 class GCTaskManager; |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1166
diff
changeset
|
41 class GenerationSizer; |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1166
diff
changeset
|
42 class CollectorPolicy; |
10405 | 43 class PSAdaptiveSizePolicy; |
44 class PSHeapSummary; | |
0 | 45 |
46 class ParallelScavengeHeap : public CollectedHeap { | |
47 friend class VMStructs; | |
48 private: | |
49 static PSYoungGen* _young_gen; | |
50 static PSOldGen* _old_gen; | |
51 | |
52 // Sizing policy for entire heap | |
53 static PSAdaptiveSizePolicy* _size_policy; | |
54 static PSGCAdaptivePolicyCounters* _gc_policy_counters; | |
55 | |
56 static ParallelScavengeHeap* _psh; | |
57 | |
58 size_t _young_gen_alignment; | |
59 size_t _old_gen_alignment; | |
60 | |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1166
diff
changeset
|
61 GenerationSizer* _collector_policy; |
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1166
diff
changeset
|
62 |
0 | 63 inline size_t set_alignment(size_t& var, size_t val); |
64 | |
65 // Collection of generations that are adjacent in the | |
66 // space reserved for the heap. | |
67 AdjoiningGenerations* _gens; | |
4914
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
68 unsigned int _death_march_count; |
0 | 69 |
70 static GCTaskManager* _gc_task_manager; // The task manager. | |
71 | |
10405 | 72 void trace_heap(GCWhen::Type when, GCTracer* tracer); |
73 | |
0 | 74 protected: |
75 static inline size_t total_invocations(); | |
76 HeapWord* allocate_new_tlab(size_t size); | |
77 | |
4914
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
78 inline bool should_alloc_in_eden(size_t size) const; |
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
79 inline void death_march_check(HeapWord* const result, size_t size); |
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
80 HeapWord* mem_allocate_old_gen(size_t size); |
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
81 |
0 | 82 public: |
83 ParallelScavengeHeap() : CollectedHeap() { | |
4914
23c0eb012d6f
6330863: vm/gc/InfiniteList.java fails intermittently due to timeout
jcoomes
parents:
4073
diff
changeset
|
84 _death_march_count = 0; |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
85 set_alignment(_young_gen_alignment, intra_heap_alignment()); |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
86 set_alignment(_old_gen_alignment, intra_heap_alignment()); |
0 | 87 } |
88 | |
12233
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
89 // Return the (conservative) maximum heap alignment |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
90 static size_t conservative_max_heap_alignment() { |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
91 return intra_heap_alignment(); |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
92 } |
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
93 |
0 | 94 // For use by VM operations |
95 enum CollectionType { | |
96 Scavenge, | |
97 MarkSweep | |
98 }; | |
99 | |
100 ParallelScavengeHeap::Name kind() const { | |
101 return CollectedHeap::ParallelScavengeHeap; | |
102 } | |
103 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
104 virtual CollectorPolicy* collector_policy() const { return (CollectorPolicy*) _collector_policy; } |
1387
0bfd3fb24150
6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents:
1166
diff
changeset
|
105 |
0 | 106 static PSYoungGen* young_gen() { return _young_gen; } |
107 static PSOldGen* old_gen() { return _old_gen; } | |
108 | |
109 virtual PSAdaptiveSizePolicy* size_policy() { return _size_policy; } | |
110 | |
111 static PSGCAdaptivePolicyCounters* gc_policy_counters() { return _gc_policy_counters; } | |
112 | |
113 static ParallelScavengeHeap* heap(); | |
114 | |
115 static GCTaskManager* const gc_task_manager() { return _gc_task_manager; } | |
116 | |
117 AdjoiningGenerations* gens() { return _gens; } | |
118 | |
119 // Returns JNI_OK on success | |
120 virtual jint initialize(); | |
121 | |
122 void post_initialize(); | |
123 void update_counters(); | |
124 // The alignment used for the various generations. | |
125 size_t young_gen_alignment() const { return _young_gen_alignment; } | |
126 size_t old_gen_alignment() const { return _old_gen_alignment; } | |
127 | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
128 // The alignment used for eden and survivors within the young gen |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
129 // and for boundary between young gen and old gen. |
12233
40136aa2cdb1
8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents:
10405
diff
changeset
|
130 static size_t intra_heap_alignment() { return 64 * K * HeapWordSize; } |
0 | 131 |
132 size_t capacity() const; | |
133 size_t used() const; | |
134 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
135 // Return "true" if all generations have reached the |
0 | 136 // maximal committed limit that they can reach, without a garbage |
137 // collection. | |
138 virtual bool is_maximal_no_gc() const; | |
139 | |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
140 // Return true if the reference points to an object that |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
141 // can be moved in a partial collection. For currently implemented |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
142 // generational collectors that means during a collection of |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
143 // the young gen. |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
144 virtual bool is_scavengable(const void* addr); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
145 |
0 | 146 // Does this heap support heap inspection? (+PrintClassHistogram) |
147 bool supports_heap_inspection() const { return true; } | |
148 | |
149 size_t max_capacity() const; | |
150 | |
151 // Whether p is in the allocated part of the heap | |
152 bool is_in(const void* p) const; | |
153 | |
154 bool is_in_reserved(const void* p) const; | |
155 | |
3377
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
156 #ifdef ASSERT |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
157 virtual bool is_in_partial_collection(const void *p); |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
158 #endif |
2aa9ddbb9e60
7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents:
1972
diff
changeset
|
159 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
160 bool is_in_young(oop p); // reserved part |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
161 bool is_in_old(oop p); // reserved part |
0 | 162 |
163 // Memory allocation. "gc_time_limit_was_exceeded" will | |
164 // be set to true if the adaptive size policy determine that | |
165 // an excessive amount of time is being spent doing collections | |
166 // and caused a NULL to be returned. If a NULL is not returned, | |
167 // "gc_time_limit_was_exceeded" has an undefined meaning. | |
3774
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
168 HeapWord* mem_allocate(size_t size, |
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
169 bool* gc_overhead_limit_was_exceeded); |
0 | 170 |
3774
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
171 // Allocation attempt(s) during a safepoint. It should never be called |
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
172 // to allocate a new TLAB as this allocation might be satisfied out |
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
173 // of the old generation. |
c9ca3f51cf41
6994322: Remove the is_tlab and is_noref / is_large_noref parameters from the CollectedHeap
tonyp
parents:
3772
diff
changeset
|
174 HeapWord* failed_mem_allocate(size_t size); |
0 | 175 |
176 // Support for System.gc() | |
177 void collect(GCCause::Cause cause); | |
178 | |
179 // These also should be called by the vm thread at a safepoint (e.g., from a | |
180 // VM operation). | |
181 // | |
182 // The first collects the young generation only, unless the scavenge fails; it | |
183 // will then attempt a full gc. The second collects the entire heap; if | |
184 // maximum_compaction is true, it will compact everything and clear all soft | |
185 // references. | |
186 inline void invoke_scavenge(); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
187 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
188 // Perform a full collection |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
189 virtual void do_full_collection(bool clear_all_soft_refs); |
0 | 190 |
191 bool supports_inline_contig_alloc() const { return !UseNUMA; } | |
141 | 192 |
193 HeapWord** top_addr() const { return !UseNUMA ? young_gen()->top_addr() : (HeapWord**)-1; } | |
194 HeapWord** end_addr() const { return !UseNUMA ? young_gen()->end_addr() : (HeapWord**)-1; } | |
0 | 195 |
196 void ensure_parsability(bool retire_tlabs); | |
197 void accumulate_statistics_all_tlabs(); | |
198 void resize_all_tlabs(); | |
199 | |
200 size_t unsafe_max_alloc(); | |
201 | |
202 bool supports_tlab_allocation() const { return true; } | |
203 | |
204 size_t tlab_capacity(Thread* thr) const; | |
205 size_t unsafe_max_tlab_alloc(Thread* thr) const; | |
206 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
207 // Can a compiler initialize a new object without store barriers? |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
208 // This permission only extends from the creation of a new object |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
209 // via a TLAB up to the first subsequent safepoint. |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
210 virtual bool can_elide_tlab_store_barriers() const { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
211 return true; |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
212 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
141
diff
changeset
|
213 |
1166 | 214 virtual bool card_mark_must_follow_store() const { |
215 return false; | |
216 } | |
217 | |
1027
39b01ab7035a
6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents:
989
diff
changeset
|
218 // Return true if we don't we need a store barrier for |
39b01ab7035a
6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents:
989
diff
changeset
|
219 // initializing stores to an object at this address. |
39b01ab7035a
6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents:
989
diff
changeset
|
220 virtual bool can_elide_initializing_store_barrier(oop new_obj); |
39b01ab7035a
6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents:
989
diff
changeset
|
221 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6008
diff
changeset
|
222 void oop_iterate(ExtendedOopClosure* cl); |
0 | 223 void object_iterate(ObjectClosure* cl); |
517
e9be0e04635a
6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents:
356
diff
changeset
|
224 void safe_object_iterate(ObjectClosure* cl) { object_iterate(cl); } |
0 | 225 |
226 HeapWord* block_start(const void* addr) const; | |
227 size_t block_size(const HeapWord* addr) const; | |
228 bool block_is_obj(const HeapWord* addr) const; | |
229 | |
230 jlong millis_since_last_gc(); | |
231 | |
232 void prepare_for_verify(); | |
10405 | 233 PSHeapSummary create_ps_heap_summary(); |
4073
53074c2c4600
7099849: G1: include heap region information in hs_err files
tonyp
parents:
3774
diff
changeset
|
234 virtual void print_on(outputStream* st) const; |
9076
7b835924c31c
8011872: Include Bit Map addresses in the hs_err files
stefank
parents:
6725
diff
changeset
|
235 virtual void print_on_error(outputStream* st) const; |
0 | 236 virtual void print_gc_threads_on(outputStream* st) const; |
237 virtual void gc_threads_do(ThreadClosure* tc) const; | |
238 virtual void print_tracing_info() const; | |
239 | |
6008 | 240 void verify(bool silent, VerifyOption option /* ignored */); |
0 | 241 |
242 void print_heap_change(size_t prev_used); | |
243 | |
244 // Resize the young generation. The reserved space for the | |
245 // generation may be expanded in preparation for the resize. | |
246 void resize_young_gen(size_t eden_size, size_t survivor_size); | |
247 | |
248 // Resize the old generation. The reserved space for the | |
249 // generation may be expanded in preparation for the resize. | |
250 void resize_old_gen(size_t desired_free_space); | |
263
12eea04c8b06
6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents:
141
diff
changeset
|
251 |
12eea04c8b06
6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents:
141
diff
changeset
|
252 // 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:
141
diff
changeset
|
253 void record_gen_tops_before_GC() PRODUCT_RETURN; |
12eea04c8b06
6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents:
141
diff
changeset
|
254 |
12eea04c8b06
6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents:
141
diff
changeset
|
255 // Mangle the unused parts of all spaces in the heap |
12eea04c8b06
6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents:
141
diff
changeset
|
256 void gen_mangle_unused_area() PRODUCT_RETURN; |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
257 |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
258 // Call these in sequential code around the processing of strong roots. |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
259 class ParStrongRootsScope : public MarkingCodeBlobClosure::MarkScope { |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
260 public: |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
261 ParStrongRootsScope(); |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
262 ~ParStrongRootsScope(); |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
845
diff
changeset
|
263 }; |
0 | 264 }; |
265 | |
266 inline size_t ParallelScavengeHeap::set_alignment(size_t& var, size_t val) | |
267 { | |
268 assert(is_power_of_2((intptr_t)val), "must be a power of 2"); | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
0
diff
changeset
|
269 var = round_to(val, intra_heap_alignment()); |
0 | 270 return var; |
271 } | |
1972 | 272 |
273 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARALLELSCAVENGEHEAP_HPP |