8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
26 #define SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
27
28 #include "gc_interface/collectedHeap.hpp"
29 #include "memory/threadLocalAllocBuffer.inline.hpp"
30 #include "memory/universe.hpp"
31 #include "oops/arrayOop.hpp"
32 #include "prims/jvmtiExport.hpp"
33 #include "runtime/sharedRuntime.hpp"
34 #include "runtime/thread.inline.hpp"
35 #include "services/lowMemoryDetector.hpp"
36 #include "utilities/copy.hpp"
37
38 // Inline allocation implementations.
39
40 void CollectedHeap::post_allocation_setup_common(KlassHandle klass,
41 HeapWord* obj) {
42 post_allocation_setup_no_klass_install(klass, obj);
43 post_allocation_install_obj_klass(klass, oop(obj));
44 }
45
46 void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
47 HeapWord* objPtr) {
90 assert(Universe::is_bootstrapping() ||
91 !((oop)obj)->is_array(), "must not be an array");
92 // notify jvmti and dtrace
93 post_allocation_notify(klass, (oop)obj);
94 }
95
96 void CollectedHeap::post_allocation_setup_array(KlassHandle klass,
97 HeapWord* obj,
98 int length) {
99 // Set array length before setting the _klass field
100 // in post_allocation_setup_common() because the klass field
101 // indicates that the object is parsable by concurrent GC.
102 assert(length >= 0, "length should be non-negative");
103 ((arrayOop)obj)->set_length(length);
104 post_allocation_setup_common(klass, obj);
105 assert(((oop)obj)->is_array(), "must be an array");
106 // notify jvmti and dtrace (must be after length is set for dtrace)
107 post_allocation_notify(klass, (oop)obj);
108 }
109
110 HeapWord* CollectedHeap::common_mem_allocate_noinit(size_t size, TRAPS) {
111
112 // Clear unhandled oops for memory allocation. Memory allocation might
113 // not take out a lock if from tlab, so clear here.
114 CHECK_UNHANDLED_OOPS_ONLY(THREAD->clear_unhandled_oops();)
115
116 if (HAS_PENDING_EXCEPTION) {
117 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
118 return NULL; // caller does a CHECK_0 too
119 }
120
121 HeapWord* result = NULL;
122 if (UseTLAB) {
123 result = CollectedHeap::allocate_from_tlab(THREAD, size);
124 if (result != NULL) {
125 assert(!HAS_PENDING_EXCEPTION,
126 "Unexpected exception, will result in uninitialized storage");
127 return result;
128 }
129 }
130 bool gc_overhead_limit_was_exceeded = false;
131 result = Universe::heap()->mem_allocate(size,
132 &gc_overhead_limit_was_exceeded);
133 if (result != NULL) {
134 NOT_PRODUCT(Universe::heap()->
135 check_for_non_bad_heap_word_value(result, size));
136 assert(!HAS_PENDING_EXCEPTION,
137 "Unexpected exception, will result in uninitialized storage");
138 THREAD->incr_allocated_bytes(size * HeapWordSize);
139 return result;
140 }
141
142
143 if (!gc_overhead_limit_was_exceeded) {
144 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
145 report_java_out_of_memory("Java heap space");
146
147 if (JvmtiExport::should_post_resource_exhausted()) {
148 JvmtiExport::post_resource_exhausted(
149 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
150 "Java heap space");
151 }
152
153 THROW_OOP_0(Universe::out_of_memory_error_java_heap());
154 } else {
155 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
156 report_java_out_of_memory("GC overhead limit exceeded");
157
158 if (JvmtiExport::should_post_resource_exhausted()) {
159 JvmtiExport::post_resource_exhausted(
160 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
161 "GC overhead limit exceeded");
162 }
163
164 THROW_OOP_0(Universe::out_of_memory_error_gc_overhead_limit());
165 }
166 }
167
168 HeapWord* CollectedHeap::common_mem_allocate_init(size_t size, TRAPS) {
169 HeapWord* obj = common_mem_allocate_noinit(size, CHECK_NULL);
170 init_obj(obj, size);
171 return obj;
172 }
173
174 HeapWord* CollectedHeap::allocate_from_tlab(Thread* thread, size_t size) {
175 assert(UseTLAB, "should use UseTLAB");
176
177 HeapWord* obj = thread->tlab().allocate(size);
178 if (obj != NULL) {
179 return obj;
180 }
181 // Otherwise...
182 return allocate_from_tlab_slow(thread, size);
183 }
184
185 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
186 assert(obj != NULL, "cannot initialize NULL object");
187 const size_t hs = oopDesc::header_size();
188 assert(size >= hs, "unexpected object size");
189 ((oop)obj)->set_klass_gap(0);
190 Copy::fill_to_aligned_words(obj + hs, size - hs);
191 }
192
193 oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
194 debug_only(check_for_valid_allocation_state());
195 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
196 assert(size >= 0, "int won't convert to size_t");
197 HeapWord* obj = common_mem_allocate_init(size, CHECK_NULL);
198 post_allocation_setup_obj(klass, obj);
199 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
200 return (oop)obj;
201 }
202
203 oop CollectedHeap::array_allocate(KlassHandle klass,
204 int size,
205 int length,
206 TRAPS) {
207 debug_only(check_for_valid_allocation_state());
208 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
209 assert(size >= 0, "int won't convert to size_t");
210 HeapWord* obj = common_mem_allocate_init(size, CHECK_NULL);
211 post_allocation_setup_array(klass, obj, length);
212 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
213 return (oop)obj;
214 }
215
216 oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
217 int size,
218 int length,
219 TRAPS) {
220 debug_only(check_for_valid_allocation_state());
221 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
222 assert(size >= 0, "int won't convert to size_t");
223 HeapWord* obj = common_mem_allocate_noinit(size, CHECK_NULL);
224 ((oop)obj)->set_klass_gap(0);
225 post_allocation_setup_array(klass, obj, length);
226 #ifndef PRODUCT
227 const size_t hs = oopDesc::header_size()+1;
228 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs);
229 #endif
230 return (oop)obj;
231 }
232
233 inline void CollectedHeap::oop_iterate_no_header(OopClosure* cl) {
234 NoHeaderExtendedOopClosure no_header_cl(cl);
235 oop_iterate(&no_header_cl);
236 }
237
238 #ifndef PRODUCT
239
240 inline bool
241 CollectedHeap::promotion_should_fail(volatile size_t* count) {
242 // Access to count is not atomic; the value does not have to be exact.
243 if (PromotionFailureALot) {
|
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
26 #define SHARE_VM_GC_INTERFACE_COLLECTEDHEAP_INLINE_HPP
27
28 #include "gc_interface/allocTracer.hpp"
29 #include "gc_interface/collectedHeap.hpp"
30 #include "memory/threadLocalAllocBuffer.inline.hpp"
31 #include "memory/universe.hpp"
32 #include "oops/arrayOop.hpp"
33 #include "prims/jvmtiExport.hpp"
34 #include "runtime/sharedRuntime.hpp"
35 #include "runtime/thread.inline.hpp"
36 #include "services/lowMemoryDetector.hpp"
37 #include "utilities/copy.hpp"
38
39 // Inline allocation implementations.
40
41 void CollectedHeap::post_allocation_setup_common(KlassHandle klass,
42 HeapWord* obj) {
43 post_allocation_setup_no_klass_install(klass, obj);
44 post_allocation_install_obj_klass(klass, oop(obj));
45 }
46
47 void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
48 HeapWord* objPtr) {
91 assert(Universe::is_bootstrapping() ||
92 !((oop)obj)->is_array(), "must not be an array");
93 // notify jvmti and dtrace
94 post_allocation_notify(klass, (oop)obj);
95 }
96
97 void CollectedHeap::post_allocation_setup_array(KlassHandle klass,
98 HeapWord* obj,
99 int length) {
100 // Set array length before setting the _klass field
101 // in post_allocation_setup_common() because the klass field
102 // indicates that the object is parsable by concurrent GC.
103 assert(length >= 0, "length should be non-negative");
104 ((arrayOop)obj)->set_length(length);
105 post_allocation_setup_common(klass, obj);
106 assert(((oop)obj)->is_array(), "must be an array");
107 // notify jvmti and dtrace (must be after length is set for dtrace)
108 post_allocation_notify(klass, (oop)obj);
109 }
110
111 HeapWord* CollectedHeap::common_mem_allocate_noinit(KlassHandle klass, size_t size, TRAPS) {
112
113 // Clear unhandled oops for memory allocation. Memory allocation might
114 // not take out a lock if from tlab, so clear here.
115 CHECK_UNHANDLED_OOPS_ONLY(THREAD->clear_unhandled_oops();)
116
117 if (HAS_PENDING_EXCEPTION) {
118 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
119 return NULL; // caller does a CHECK_0 too
120 }
121
122 HeapWord* result = NULL;
123 if (UseTLAB) {
124 result = allocate_from_tlab(klass, THREAD, size);
125 if (result != NULL) {
126 assert(!HAS_PENDING_EXCEPTION,
127 "Unexpected exception, will result in uninitialized storage");
128 return result;
129 }
130 }
131 bool gc_overhead_limit_was_exceeded = false;
132 result = Universe::heap()->mem_allocate(size,
133 &gc_overhead_limit_was_exceeded);
134 if (result != NULL) {
135 NOT_PRODUCT(Universe::heap()->
136 check_for_non_bad_heap_word_value(result, size));
137 assert(!HAS_PENDING_EXCEPTION,
138 "Unexpected exception, will result in uninitialized storage");
139 THREAD->incr_allocated_bytes(size * HeapWordSize);
140
141 AllocTracer::send_allocation_outside_tlab_event(klass, size * HeapWordSize);
142
143 return result;
144 }
145
146
147 if (!gc_overhead_limit_was_exceeded) {
148 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
149 report_java_out_of_memory("Java heap space");
150
151 if (JvmtiExport::should_post_resource_exhausted()) {
152 JvmtiExport::post_resource_exhausted(
153 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
154 "Java heap space");
155 }
156
157 THROW_OOP_0(Universe::out_of_memory_error_java_heap());
158 } else {
159 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
160 report_java_out_of_memory("GC overhead limit exceeded");
161
162 if (JvmtiExport::should_post_resource_exhausted()) {
163 JvmtiExport::post_resource_exhausted(
164 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
165 "GC overhead limit exceeded");
166 }
167
168 THROW_OOP_0(Universe::out_of_memory_error_gc_overhead_limit());
169 }
170 }
171
172 HeapWord* CollectedHeap::common_mem_allocate_init(KlassHandle klass, size_t size, TRAPS) {
173 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
174 init_obj(obj, size);
175 return obj;
176 }
177
178 HeapWord* CollectedHeap::allocate_from_tlab(KlassHandle klass, Thread* thread, size_t size) {
179 assert(UseTLAB, "should use UseTLAB");
180
181 HeapWord* obj = thread->tlab().allocate(size);
182 if (obj != NULL) {
183 return obj;
184 }
185 // Otherwise...
186 return allocate_from_tlab_slow(klass, thread, size);
187 }
188
189 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
190 assert(obj != NULL, "cannot initialize NULL object");
191 const size_t hs = oopDesc::header_size();
192 assert(size >= hs, "unexpected object size");
193 ((oop)obj)->set_klass_gap(0);
194 Copy::fill_to_aligned_words(obj + hs, size - hs);
195 }
196
197 oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
198 debug_only(check_for_valid_allocation_state());
199 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
200 assert(size >= 0, "int won't convert to size_t");
201 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
202 post_allocation_setup_obj(klass, obj);
203 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
204 return (oop)obj;
205 }
206
207 oop CollectedHeap::array_allocate(KlassHandle klass,
208 int size,
209 int length,
210 TRAPS) {
211 debug_only(check_for_valid_allocation_state());
212 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
213 assert(size >= 0, "int won't convert to size_t");
214 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
215 post_allocation_setup_array(klass, obj, length);
216 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
217 return (oop)obj;
218 }
219
220 oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
221 int size,
222 int length,
223 TRAPS) {
224 debug_only(check_for_valid_allocation_state());
225 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
226 assert(size >= 0, "int won't convert to size_t");
227 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
228 ((oop)obj)->set_klass_gap(0);
229 post_allocation_setup_array(klass, obj, length);
230 #ifndef PRODUCT
231 const size_t hs = oopDesc::header_size()+1;
232 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs);
233 #endif
234 return (oop)obj;
235 }
236
237 inline void CollectedHeap::oop_iterate_no_header(OopClosure* cl) {
238 NoHeaderExtendedOopClosure no_header_cl(cl);
239 oop_iterate(&no_header_cl);
240 }
241
242 #ifndef PRODUCT
243
244 inline bool
245 CollectedHeap::promotion_should_fail(volatile size_t* count) {
246 // Access to count is not atomic; the value does not have to be exact.
247 if (PromotionFailureALot) {
|