annotate src/share/vm/gc_interface/collectedHeap.hpp @ 3772:6747fd0512e0

7004681: G1: Extend marking verification to Full GCs Summary: Perform a heap verification after the first phase of G1's full GC using objects' mark words to determine liveness. The third parameter of the heap verification routines, which was used in G1 to determine which marking bitmap to use in liveness calculations, has been changed from a boolean to an enum with values defined for using the mark word, and the 'prev' and 'next' bitmaps. Reviewed-by: tonyp, ysr
author johnc
date Tue, 14 Jun 2011 11:01:10 -0700
parents 2aa9ddbb9e60
children c9ca3f51cf41
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
2 * Copyright (c) 2001, 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: 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
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: 1833
diff changeset
25 #ifndef SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
26 #define SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
28 #include "gc_interface/gcCause.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
30 #include "memory/barrierSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
31 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
32 #include "runtime/perfData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
33 #include "runtime/safepoint.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
34
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // A "CollectedHeap" is an implementation of a java heap for HotSpot. This
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // is an abstract class: there may be many different kinds of heaps. This
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // class defines the functions that a heap must implement, and contains
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // infrastructure common to all heaps.
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class BarrierSet;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class ThreadClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class AdaptiveSizePolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class Thread;
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1166
diff changeset
44 class CollectorPolicy;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // CollectedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // SharedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // GenCollectedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // G1CollectedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // ParallelScavengeHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
52 //
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class CollectedHeap : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 friend class IsGCActiveMark; // Block structured external access to _is_gc_active
542
9a25e0c45327 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 517
diff changeset
56 friend class constantPoolCacheKlass; // allocate() method inserts is_conc_safe
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
59 static int _fire_out_of_memory_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
61
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
62 // Used for filler objects (static, but initialized in ctor).
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
63 static size_t _filler_array_max_size;
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
64
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
65 // Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 is being used
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
66 bool _defer_initial_card_mark;
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
67
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
69 MemRegion _reserved;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 BarrierSet* _barrier_set;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 bool _is_gc_active;
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
72 int _n_par_threads;
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
73
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 unsigned int _total_collections; // ... started
a61af66fc99e Initial load
duke
parents:
diff changeset
75 unsigned int _total_full_collections; // ... started
a61af66fc99e Initial load
duke
parents:
diff changeset
76 NOT_PRODUCT(volatile size_t _promotion_failure_alot_count;)
a61af66fc99e Initial load
duke
parents:
diff changeset
77 NOT_PRODUCT(volatile size_t _promotion_failure_alot_gc_number;)
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Reason for current garbage collection. Should be set to
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // a value reflecting no collection between collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
81 GCCause::Cause _gc_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 GCCause::Cause _gc_lastcause;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 PerfStringVariable* _perf_gc_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 PerfStringVariable* _perf_gc_lastcause;
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
87 CollectedHeap();
a61af66fc99e Initial load
duke
parents:
diff changeset
88
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
89 // Do common initializations that must follow instance construction,
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
90 // for example, those needing virtual calls.
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
91 // This code could perhaps be moved into initialize() but would
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
92 // be slightly more awkward because we want the latter to be a
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
93 // pure virtual.
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
94 void pre_initialize();
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
95
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Create a new tlab
a61af66fc99e Initial load
duke
parents:
diff changeset
97 virtual HeapWord* allocate_new_tlab(size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // Accumulate statistics on all tlabs.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 virtual void accumulate_statistics_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Reinitialize tlabs before resuming mutators.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 virtual void resize_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Allocate from the current thread's TLAB, with broken-out slow path.
a61af66fc99e Initial load
duke
parents:
diff changeset
107 inline static HeapWord* allocate_from_tlab(Thread* thread, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static HeapWord* allocate_from_tlab_slow(Thread* thread, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Allocate an uninitialized block of the given size, or returns NULL if
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // this is impossible.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 inline static HeapWord* common_mem_allocate_noinit(size_t size, bool is_noref, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Like allocate_init, but the block returned by a successful allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // is guaranteed initialized to zeros.
a61af66fc99e Initial load
duke
parents:
diff changeset
116 inline static HeapWord* common_mem_allocate_init(size_t size, bool is_noref, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Same as common_mem version, except memory is allocated in the permanent area
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // If there is no permanent area, revert to common_mem_allocate_noinit
a61af66fc99e Initial load
duke
parents:
diff changeset
120 inline static HeapWord* common_permanent_mem_allocate_noinit(size_t size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Same as common_mem version, except memory is allocated in the permanent area
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // If there is no permanent area, revert to common_mem_allocate_init
a61af66fc99e Initial load
duke
parents:
diff changeset
124 inline static HeapWord* common_permanent_mem_allocate_init(size_t size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Helper functions for (VM) allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
127 inline static void post_allocation_setup_common(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
128 HeapWord* obj, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 inline static void post_allocation_setup_no_klass_install(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
130 HeapWord* objPtr,
a61af66fc99e Initial load
duke
parents:
diff changeset
131 size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 inline static void post_allocation_setup_obj(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 HeapWord* obj, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 inline static void post_allocation_setup_array(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 HeapWord* obj, size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int length);
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Clears an allocated object.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 inline static void init_obj(HeapWord* obj, size_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
143 // Filler object utilities.
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
144 static inline size_t filler_array_hdr_size();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
145 static inline size_t filler_array_min_size();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
146 static inline size_t filler_array_max_size();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
147
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
148 DEBUG_ONLY(static void fill_args_check(HeapWord* start, size_t words);)
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
149 DEBUG_ONLY(static void zap_filler_array(HeapWord* start, size_t words, bool zap = true);)
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
150
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
151 // Fill with a single array; caller must ensure filler_array_min_size() <=
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
152 // words <= filler_array_max_size().
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
153 static inline void fill_with_array(HeapWord* start, size_t words, bool zap = true);
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
154
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
155 // Fill with a single object (either an int array or a java.lang.Object).
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
156 static inline void fill_with_object_impl(HeapWord* start, size_t words, bool zap = true);
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
157
0
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Verification functions
a61af66fc99e Initial load
duke
parents:
diff changeset
159 virtual void check_for_bad_heap_word_value(HeapWord* addr, size_t size)
a61af66fc99e Initial load
duke
parents:
diff changeset
160 PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 virtual void check_for_non_bad_heap_word_value(HeapWord* addr, size_t size)
a61af66fc99e Initial load
duke
parents:
diff changeset
162 PRODUCT_RETURN;
542
9a25e0c45327 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 517
diff changeset
163 debug_only(static void check_for_valid_allocation_state();)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
166 enum Name {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 Abstract,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 SharedHeap,
a61af66fc99e Initial load
duke
parents:
diff changeset
169 GenCollectedHeap,
a61af66fc99e Initial load
duke
parents:
diff changeset
170 ParallelScavengeHeap,
a61af66fc99e Initial load
duke
parents:
diff changeset
171 G1CollectedHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 virtual CollectedHeap::Name kind() const { return CollectedHeap::Abstract; }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
177 * Returns JNI error code JNI_ENOMEM if memory could not be allocated,
a61af66fc99e Initial load
duke
parents:
diff changeset
178 * and JNI_OK on success.
a61af66fc99e Initial load
duke
parents:
diff changeset
179 */
a61af66fc99e Initial load
duke
parents:
diff changeset
180 virtual jint initialize() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // In many heaps, there will be a need to perform some initialization activities
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // after the Universe is fully formed, but before general heap allocation is allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // This is the correct place to place such initialization methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 virtual void post_initialize() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 MemRegion reserved_region() const { return _reserved; }
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
188 address base() const { return (address)reserved_region().start(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // Future cleanup here. The following functions should specify bytes or
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // heapwords as part of their signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 virtual size_t capacity() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 virtual size_t used() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // Return "true" if the part of the heap that allocates Java
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // objects has reached the maximal committed limit that it can
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // reach, without a garbage collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 virtual bool is_maximal_no_gc() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 virtual size_t permanent_capacity() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 virtual size_t permanent_used() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // Support for java.lang.Runtime.maxMemory(): return the maximum amount of
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // memory that the vm could make available for storing 'normal' java objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // This is based on the reserved address space, but should not include space
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // that the vm uses internally for bookkeeping or temporary storage (e.g.,
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // perm gen space or, in the case of the young gen, one of the survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // spaces).
a61af66fc99e Initial load
duke
parents:
diff changeset
209 virtual size_t max_capacity() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Returns "TRUE" if "p" points into the reserved area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 bool is_in_reserved(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return _reserved.contains(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 bool is_in_reserved_or_null(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return p == NULL || is_in_reserved(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Returns "TRUE" if "p" points to the head of an allocated object in the
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // heap. Since this method can be expensive in general, we restrict its
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // use to assertion checking only.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 virtual bool is_in(const void* p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 bool is_in_or_null(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return p == NULL || is_in(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Let's define some terms: a "closed" subset of a heap is one that
a61af66fc99e Initial load
duke
parents:
diff changeset
230 //
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // 1) contains all currently-allocated objects, and
a61af66fc99e Initial load
duke
parents:
diff changeset
232 //
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // 2) is closed under reference: no object in the closed subset
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // references one outside the closed subset.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 //
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Membership in a heap's closed subset is useful for assertions.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Clearly, the entire heap is a closed subset, so the default
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // implementation is to use "is_in_reserved". But this may not be too
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // liberal to perform useful checking. Also, the "is_in" predicate
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // defines a closed subset, but may be too expensive, since "is_in"
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // verifies that its argument points to an object head. The
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // "closed_subset" method allows a heap to define an intermediate
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // predicate, allowing more precise checking than "is_in_reserved" at
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // lower cost than "is_in."
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // One important case is a heap composed of disjoint contiguous spaces,
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // such as the Garbage-First collector. Such heaps have a convenient
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // closed subset consisting of the allocated portions of those
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // contiguous spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Return "TRUE" iff the given pointer points into the heap's defined
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // closed subset (which defaults to the entire heap).
a61af66fc99e Initial load
duke
parents:
diff changeset
253 virtual bool is_in_closed_subset(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return is_in_reserved(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 bool is_in_closed_subset_or_null(const void* p) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return p == NULL || is_in_closed_subset(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
261 // XXX is_permanent() and is_in_permanent() should be better named
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
262 // to distinguish one from the other.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
263
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Returns "TRUE" if "p" is allocated as "permanent" data.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // If the heap does not use "permanent" data, returns the same
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // value is_in_reserved() would return.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // NOTE: this actually returns true if "p" is in reserved space
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // for the space not that it is actually allocated (i.e. in committed
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // space). If you need the more conservative answer use is_permanent().
a61af66fc99e Initial load
duke
parents:
diff changeset
270 virtual bool is_in_permanent(const void *p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
271
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
272
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
273 #ifdef ASSERT
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
274 // Returns true if "p" is in the part of the
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
275 // heap being collected.
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
276 virtual bool is_in_partial_collection(const void *p) = 0;
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
277 #endif
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
278
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
279 bool is_in_permanent_or_null(const void *p) const {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
280 return p == NULL || is_in_permanent(p);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
281 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
282
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Returns "TRUE" if "p" is in the committed area of "permanent" data.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // If the heap does not use "permanent" data, returns the same
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // value is_in() would return.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 virtual bool is_permanent(const void *p) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
288 bool is_permanent_or_null(const void *p) const {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 845
diff changeset
289 return p == NULL || is_permanent(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
292 // An object is scavengable if its location may move during a scavenge.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
293 // (A scavenge is a GC which is not a full GC.)
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 1972
diff changeset
294 virtual bool is_scavengable(const void *p) = 0;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 845
diff changeset
295
0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Returns "TRUE" if "p" is a method oop in the
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // current heap, with high probability. This predicate
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // is not stable, in general.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool is_valid_method(oop p) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 void set_gc_cause(GCCause::Cause v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 _gc_lastcause = _gc_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 _perf_gc_lastcause->set_value(GCCause::to_string(_gc_lastcause));
a61af66fc99e Initial load
duke
parents:
diff changeset
305 _perf_gc_cause->set_value(GCCause::to_string(v));
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 _gc_cause = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 GCCause::Cause gc_cause() { return _gc_cause; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
311 // Number of threads currently working on GC tasks.
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
312 int n_par_threads() { return _n_par_threads; }
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
313
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
314 // May be overridden to set additional parallelism.
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
315 virtual void set_par_threads(int t) { _n_par_threads = t; };
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
316
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Preload classes into the shared portion of the heap, and then dump
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // that data to a file so that it can be loaded directly by another
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // VM (then terminate).
a61af66fc99e Initial load
duke
parents:
diff changeset
320 virtual void preload_and_dump(TRAPS) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // General obj/array allocation facilities.
a61af66fc99e Initial load
duke
parents:
diff changeset
323 inline static oop obj_allocate(KlassHandle klass, int size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 inline static oop array_allocate(KlassHandle klass, int size, int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 inline static oop large_typearray_allocate(KlassHandle klass, int size, int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // Special obj/array allocation facilities.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Some heaps may want to manage "permanent" data uniquely. These default
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // to the general routines if the heap does not support such handling.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 inline static oop permanent_obj_allocate(KlassHandle klass, int size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // permanent_obj_allocate_no_klass_install() does not do the installation of
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // the klass pointer in the newly created object (as permanent_obj_allocate()
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // above does). This allows for a delay in the installation of the klass
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // pointer that is needed during the create of klassKlass's. The
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // method post_allocation_install_obj_klass() is used to install the
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // klass pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 inline static oop permanent_obj_allocate_no_klass_install(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
338 int size,
a61af66fc99e Initial load
duke
parents:
diff changeset
339 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 inline static void post_allocation_install_obj_klass(KlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
341 oop obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
342 int size);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 inline static oop permanent_array_allocate(KlassHandle klass, int size, int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // Raw memory allocation facilities
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // The obj and array allocate methods are covers for these methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // The permanent allocation method should default to mem_allocate if
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // permanent memory isn't supported.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 virtual HeapWord* mem_allocate(size_t size,
a61af66fc99e Initial load
duke
parents:
diff changeset
350 bool is_noref,
a61af66fc99e Initial load
duke
parents:
diff changeset
351 bool is_tlab,
a61af66fc99e Initial load
duke
parents:
diff changeset
352 bool* gc_overhead_limit_was_exceeded) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 virtual HeapWord* permanent_mem_allocate(size_t size) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // The boundary between a "large" and "small" array of primitives, in words.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 virtual size_t large_typearray_limit() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
357
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
358 // Utilities for turning raw memory into filler objects.
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
359 //
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
360 // min_fill_size() is the smallest region that can be filled.
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
361 // fill_with_objects() can fill arbitrary-sized regions of the heap using
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
362 // multiple objects. fill_with_object() is for regions known to be smaller
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
363 // than the largest array of integers; it uses a single object to fill the
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
364 // region and has slightly less overhead.
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
365 static size_t min_fill_size() {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
366 return size_t(align_object_size(oopDesc::header_size()));
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
367 }
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
368
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
369 static void fill_with_objects(HeapWord* start, size_t words, bool zap = true);
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
370
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
371 static void fill_with_object(HeapWord* start, size_t words, bool zap = true);
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
372 static void fill_with_object(MemRegion region, bool zap = true) {
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
373 fill_with_object(region.start(), region.word_size(), zap);
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
374 }
1165
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
375 static void fill_with_object(HeapWord* start, HeapWord* end, bool zap = true) {
2dd52dea6d28 6902115: G1:assert(ignore_max_completed||thread->is_Java_thread()||SafepointSynchronize::is_at_safepoint())
johnc
parents: 1027
diff changeset
376 fill_with_object(start, pointer_delta(end, start), zap);
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
377 }
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 356
diff changeset
378
0
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Some heaps may offer a contiguous region for shared non-blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // allocation, via inlined code (by exporting the address of the top and
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // end fields defining the extent of the contiguous allocation region.)
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // This function returns "true" iff the heap supports this kind of
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // allocation. (Default is "no".)
a61af66fc99e Initial load
duke
parents:
diff changeset
385 virtual bool supports_inline_contig_alloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // These functions return the addresses of the fields that define the
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // boundaries of the contiguous allocation area. (These fields should be
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // physically near to one another.)
a61af66fc99e Initial load
duke
parents:
diff changeset
391 virtual HeapWord** top_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 guarantee(false, "inline contiguous allocation not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 virtual HeapWord** end_addr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 guarantee(false, "inline contiguous allocation not supported");
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 // Some heaps may be in an unparseable state at certain times between
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // collections. This may be necessary for efficient implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // certain allocation-related activities. Calling this function before
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // attempting to parse a heap ensures that the heap is in a parsable
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // state (provided other concurrent activity does not introduce
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // unparsability). It is normally expected, therefore, that this
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // method is invoked with the world stopped.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // NOTE: if you override this method, make sure you call
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // super::ensure_parsability so that the non-generational
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // part of the work gets done. See implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // CollectedHeap::ensure_parsability and, for instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // that of GenCollectedHeap::ensure_parsability().
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // The argument "retire_tlabs" controls whether existing TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // are merely filled or also retired, thus preventing further
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // allocation from them and necessitating allocation of new TLABs.
a61af66fc99e Initial load
duke
parents:
diff changeset
415 virtual void ensure_parsability(bool retire_tlabs);
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // Return an estimate of the maximum allocation that could be performed
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // without triggering any collection or expansion activity. In a
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // generational collector, for example, this is probably the largest
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // allocation that could be supported (without expansion) in the youngest
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // generation. It is "unsafe" because no locks are taken; the result
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // should be treated as an approximation, not a guarantee, for use in
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // heuristic resizing decisions.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 virtual size_t unsafe_max_alloc() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // Section on thread-local allocation buffers (TLABs)
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // If the heap supports thread-local allocation buffers, it should override
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // the following methods:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // Returns "true" iff the heap supports thread-local allocation buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // The default is "no".
a61af66fc99e Initial load
duke
parents:
diff changeset
431 virtual bool supports_tlab_allocation() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // The amount of space available for thread-local allocation buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
435 virtual size_t tlab_capacity(Thread *thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 guarantee(false, "thread-local allocation buffers not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
437 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // An estimate of the maximum allocation that could be performed
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // for thread-local allocation buffers without triggering any
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // collection or expansion activity.
a61af66fc99e Initial load
duke
parents:
diff changeset
442 virtual size_t unsafe_max_tlab_alloc(Thread *thr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 guarantee(false, "thread-local allocation buffers not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
446
0
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Can a compiler initialize a new object without store barriers?
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // This permission only extends from the creation of a new object
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
449 // via a TLAB up to the first subsequent safepoint. If such permission
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
450 // is granted for this heap type, the compiler promises to call
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
451 // defer_store_barrier() below on any slow path allocation of
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
452 // a new object for which such initializing store barriers will
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
453 // have been elided.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
454 virtual bool can_elide_tlab_store_barriers() const = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
455
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // If a compiler is eliding store barriers for TLAB-allocated objects,
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // there is probably a corresponding slow path which can produce
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // an object allocated anywhere. The compiler's runtime support
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // promises to call this function on such a slow-path-allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // object before performing initializations that have elided
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
461 // store barriers. Returns new_obj, or maybe a safer copy thereof.
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
462 virtual oop new_store_pre_barrier(JavaThread* thread, oop new_obj);
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
463
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
464 // Answers whether an initializing store to a new object currently
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
465 // allocated at the given address doesn't need a store
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
466 // barrier. Returns "true" if it doesn't need an initializing
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
467 // store barrier; answers "false" if it does.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
468 virtual bool can_elide_initializing_store_barrier(oop new_obj) = 0;
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
469
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
470 // If a compiler is eliding store barriers for TLAB-allocated objects,
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
471 // we will be informed of a slow-path allocation by a call
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
472 // to new_store_pre_barrier() above. Such a call precedes the
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
473 // initialization of the object itself, and no post-store-barriers will
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
474 // be issued. Some heap types require that the barrier strictly follows
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
475 // the initializing stores. (This is currently implemented by deferring the
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
476 // barrier until the next slow-path allocation or gc-related safepoint.)
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
477 // This interface answers whether a particular heap type needs the card
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
478 // mark to be thus strictly sequenced after the stores.
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
479 virtual bool card_mark_must_follow_store() const = 0;
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1165
diff changeset
480
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
481 // If the CollectedHeap was asked to defer a store barrier above,
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
482 // this informs it to flush such a deferred store barrier to the
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
483 // remembered set.
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 993
diff changeset
484 virtual void flush_deferred_store_barrier(JavaThread* thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Can a compiler elide a store barrier when it writes
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // a permanent oop into the heap? Applies when the compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // is storing x to the heap, where x->is_perm() is true.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
489 virtual bool can_elide_permanent_oop_store_barriers() const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // Does this heap support heap inspection (+PrintClassHistogram?)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
492 virtual bool supports_heap_inspection() const = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // Perform a collection of the heap; intended for use in implementing
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // "System.gc". This probably implies as full a collection as the
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // "CollectedHeap" supports.
a61af66fc99e Initial load
duke
parents:
diff changeset
497 virtual void collect(GCCause::Cause cause) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // This interface assumes that it's being called by the
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // vm thread. It collects the heap assuming that the
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // heap lock is already held and that we are executing in
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // the context of the vm thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
503 virtual void collect_as_vm_thread(GCCause::Cause cause) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // Returns the barrier set for this heap
a61af66fc99e Initial load
duke
parents:
diff changeset
506 BarrierSet* barrier_set() { return _barrier_set; }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Returns "true" iff there is a stop-world GC in progress. (I assume
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // that it should answer "false" for the concurrent part of a concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // collector -- dld).
a61af66fc99e Initial load
duke
parents:
diff changeset
511 bool is_gc_active() const { return _is_gc_active; }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // Total number of GC collections (started)
a61af66fc99e Initial load
duke
parents:
diff changeset
514 unsigned int total_collections() const { return _total_collections; }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 unsigned int total_full_collections() const { return _total_full_collections;}
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Increment total number of GC collections (started)
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // Should be protected but used by PSMarkSweep - cleanup for 1.4.2
a61af66fc99e Initial load
duke
parents:
diff changeset
519 void increment_total_collections(bool full = false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 _total_collections++;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (full) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 increment_total_full_collections();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 void increment_total_full_collections() { _total_full_collections++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // Return the AdaptiveSizePolicy for the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
529 virtual AdaptiveSizePolicy* size_policy() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
530
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1166
diff changeset
531 // Return the CollectorPolicy for the heap
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1166
diff changeset
532 virtual CollectorPolicy* collector_policy() const = 0;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1166
diff changeset
533
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Iterate over all the ref-containing fields of all objects, calling
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // "cl.do_oop" on each. This includes objects in permanent memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
536 virtual void oop_iterate(OopClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Iterate over all objects, calling "cl.do_object" on each.
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // This includes objects in permanent memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
540 virtual void object_iterate(ObjectClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
541
517
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
542 // Similar to object_iterate() except iterates only
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
543 // over live objects.
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
544 virtual void safe_object_iterate(ObjectClosure* cl) = 0;
e9be0e04635a 6689653: JMapPerm fails with UseConcMarkSweepIncGC and compressed oops off
jmasa
parents: 481
diff changeset
545
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // Behaves the same as oop_iterate, except only traverses
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // interior pointers contained in permanent memory. If there
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // is no permanent memory, does nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
549 virtual void permanent_oop_iterate(OopClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // Behaves the same as object_iterate, except only traverses
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // object contained in permanent memory. If there is no
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // permanent memory, does nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
554 virtual void permanent_object_iterate(ObjectClosure* cl) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // NOTE! There is no requirement that a collector implement these
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
558 //
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // A CollectedHeap is divided into a dense sequence of "blocks"; that is,
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // each address in the (reserved) heap is a member of exactly
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // one block. The defining characteristic of a block is that it is
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // possible to find its size, and thus to progress forward to the next
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // block. (Blocks may be of different sizes.) Thus, blocks may
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // represent Java objects, or they might be free blocks in a
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // free-list-based heap (or subheap), as long as the two kinds are
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // distinguishable and the size of each is determinable.
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Returns the address of the start of the "block" that contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // address "addr". We say "blocks" instead of "object" since some heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // may not pack objects densely; a chunk may either be an object or a
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // non-object.
a61af66fc99e Initial load
duke
parents:
diff changeset
572 virtual HeapWord* block_start(const void* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // Requires "addr" to be the start of a chunk, and returns its size.
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // "addr + size" is required to be the start of a new chunk, or the end
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // of the active area of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
577 virtual size_t block_size(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // Requires "addr" to be the start of a block, and returns "TRUE" iff
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // the block is an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
581 virtual bool block_is_obj(const HeapWord* addr) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Returns the longest time (in ms) that has elapsed since the last
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // time that any part of the heap was examined by a garbage collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 virtual jlong millis_since_last_gc() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // Perform any cleanup actions necessary before allowing a verification.
a61af66fc99e Initial load
duke
parents:
diff changeset
588 virtual void prepare_for_verify() = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
589
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 542
diff changeset
590 // Generate any dumps preceding or following a full gc
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 542
diff changeset
591 void pre_full_gc_dump();
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 542
diff changeset
592 void post_full_gc_dump();
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 542
diff changeset
593
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 virtual void print() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 virtual void print_on(outputStream* st) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Print all GC threads (other than the VM thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // used by this heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
599 virtual void print_gc_threads_on(outputStream* st) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void print_gc_threads() { print_gc_threads_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Iterator for all GC threads (other than VM thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
602 virtual void gc_threads_do(ThreadClosure* tc) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Print any relevant tracing info that flags imply.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // Default implementation does nothing.
a61af66fc99e Initial load
duke
parents:
diff changeset
606 virtual void print_tracing_info() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // Heap verification
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3377
diff changeset
609 virtual void verify(bool allow_dirty, bool silent, VerifyOption option) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Non product verification and debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
612 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // Support for PromotionFailureALot. Return true if it's time to cause a
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // promotion failure. The no-argument version uses
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // this->_promotion_failure_alot_count as the counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
616 inline bool promotion_should_fail(volatile size_t* count);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 inline bool promotion_should_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Reset the PromotionFailureALot counters. Should be called at the end of a
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // GC in which promotion failure ocurred.
a61af66fc99e Initial load
duke
parents:
diff changeset
621 inline void reset_promotion_should_fail(volatile size_t* count);
a61af66fc99e Initial load
duke
parents:
diff changeset
622 inline void reset_promotion_should_fail();
a61af66fc99e Initial load
duke
parents:
diff changeset
623 #endif // #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
626 static int fired_fake_oom() {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 return (CIFireOOMAt > 1 && _fire_out_of_memory_count >= CIFireOOMAt);
a61af66fc99e Initial load
duke
parents:
diff changeset
628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
629 #endif
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
630
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
631 public:
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
632 // This is a convenience method that is used in cases where
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
633 // the actual number of GC worker threads is not pertinent but
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
634 // only whether there more than 0. Use of this method helps
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
635 // reduce the occurrence of ParallelGCThreads to uses where the
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
636 // actual number may be germane.
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1552
diff changeset
637 static bool use_parallel_gc_threads() { return ParallelGCThreads > 0; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638 };
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Class to set and reset the GC cause for a CollectedHeap.
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 class GCCauseSetter : StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 CollectedHeap* _heap;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 GCCause::Cause _previous_cause;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
646 GCCauseSetter(CollectedHeap* heap, GCCause::Cause cause) {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 assert(SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
648 "This method manipulates heap state without locking");
a61af66fc99e Initial load
duke
parents:
diff changeset
649 _heap = heap;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 _previous_cause = _heap->gc_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
651 _heap->set_gc_cause(cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 ~GCCauseSetter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 assert(SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
656 "This method manipulates heap state without locking");
a61af66fc99e Initial load
duke
parents:
diff changeset
657 _heap->set_gc_cause(_previous_cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
660
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
661 #endif // SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_HPP