129
130 // Clear unhandled oops for memory allocation. Memory allocation might
131 // not take out a lock if from tlab, so clear here.
132 CHECK_UNHANDLED_OOPS_ONLY(THREAD->clear_unhandled_oops();)
133
134 if (HAS_PENDING_EXCEPTION) {
135 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
136 return NULL; // caller does a CHECK_0 too
137 }
138
139 HeapWord* result = NULL;
140 if (UseTLAB) {
141 result = allocate_from_tlab(klass, THREAD, size);
142 if (result != NULL) {
143 assert(!HAS_PENDING_EXCEPTION,
144 "Unexpected exception, will result in uninitialized storage");
145 return result;
146 }
147 }
148 bool gc_overhead_limit_was_exceeded = false;
149 result = Universe::heap()->mem_allocate(size,
150 &gc_overhead_limit_was_exceeded);
151 if (result != NULL) {
152 NOT_PRODUCT(Universe::heap()->
153 check_for_non_bad_heap_word_value(result, size));
154 assert(!HAS_PENDING_EXCEPTION,
155 "Unexpected exception, will result in uninitialized storage");
156 THREAD->incr_allocated_bytes(size * HeapWordSize);
157
158 AllocTracer::send_allocation_outside_tlab_event(klass, size * HeapWordSize);
159
160 return result;
161 }
162
163
164 if (!gc_overhead_limit_was_exceeded) {
165 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
166 report_java_out_of_memory("Java heap space");
167
168 if (JvmtiExport::should_post_resource_exhausted()) {
169 JvmtiExport::post_resource_exhausted(
170 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
171 "Java heap space");
172 }
196 assert(UseTLAB, "should use UseTLAB");
197
198 HeapWord* obj = thread->tlab().allocate(size);
199 if (obj != NULL) {
200 return obj;
201 }
202 // Otherwise...
203 return allocate_from_tlab_slow(klass, thread, size);
204 }
205
206 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
207 assert(obj != NULL, "cannot initialize NULL object");
208 const size_t hs = oopDesc::header_size();
209 assert(size >= hs, "unexpected object size");
210 ((oop)obj)->set_klass_gap(0);
211 Copy::fill_to_aligned_words(obj + hs, size - hs);
212 }
213
214 oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) {
215 debug_only(check_for_valid_allocation_state());
216 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
217 assert(size >= 0, "int won't convert to size_t");
218 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
219 post_allocation_setup_obj(klass, obj, size);
220 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
221 return (oop)obj;
222 }
223
224 oop CollectedHeap::class_allocate(Klass* klass, int size, TRAPS) {
225 debug_only(check_for_valid_allocation_state());
226 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
227 assert(size >= 0, "int won't convert to size_t");
228 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
229 post_allocation_setup_class(klass, obj, size); // set oop_size
230 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
231 return (oop)obj;
232 }
233
234 oop CollectedHeap::array_allocate(Klass* klass,
235 int size,
236 int length,
237 TRAPS) {
238 debug_only(check_for_valid_allocation_state());
239 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
240 assert(size >= 0, "int won't convert to size_t");
241 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
242 post_allocation_setup_array(klass, obj, length);
243 NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
244 return (oop)obj;
245 }
246
247 oop CollectedHeap::array_allocate_nozero(Klass* klass,
248 int size,
249 int length,
250 TRAPS) {
251 debug_only(check_for_valid_allocation_state());
252 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
253 assert(size >= 0, "int won't convert to size_t");
254 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
255 ((oop)obj)->set_klass_gap(0);
256 post_allocation_setup_array(klass, obj, length);
257 #ifndef PRODUCT
258 const size_t hs = oopDesc::header_size()+1;
259 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs);
260 #endif
261 return (oop)obj;
262 }
263
264 inline HeapWord* CollectedHeap::align_allocation_or_fail(HeapWord* addr,
265 HeapWord* end,
266 unsigned short alignment_in_bytes) {
267 if (alignment_in_bytes <= ObjectAlignmentInBytes) {
268 return addr;
269 }
270
271 assert(is_ptr_aligned(addr, HeapWordSize),
272 "Address " PTR_FORMAT " is not properly aligned.", p2i(addr));
273 assert(is_size_aligned(alignment_in_bytes, HeapWordSize),
274 "Alignment size %u is incorrect.", alignment_in_bytes);
275
276 HeapWord* new_addr = (HeapWord*) align_ptr_up(addr, alignment_in_bytes);
277 size_t padding = pointer_delta(new_addr, addr);
278
279 if (padding == 0) {
|
129
130 // Clear unhandled oops for memory allocation. Memory allocation might
131 // not take out a lock if from tlab, so clear here.
132 CHECK_UNHANDLED_OOPS_ONLY(THREAD->clear_unhandled_oops();)
133
134 if (HAS_PENDING_EXCEPTION) {
135 NOT_PRODUCT(guarantee(false, "Should not allocate with exception pending"));
136 return NULL; // caller does a CHECK_0 too
137 }
138
139 HeapWord* result = NULL;
140 if (UseTLAB) {
141 result = allocate_from_tlab(klass, THREAD, size);
142 if (result != NULL) {
143 assert(!HAS_PENDING_EXCEPTION,
144 "Unexpected exception, will result in uninitialized storage");
145 return result;
146 }
147 }
148 bool gc_overhead_limit_was_exceeded = false;
149 result = GC::gc()->heap()->mem_allocate(size,
150 &gc_overhead_limit_was_exceeded);
151 if (result != NULL) {
152 NOT_PRODUCT(GC::gc()->heap()->
153 check_for_non_bad_heap_word_value(result, size));
154 assert(!HAS_PENDING_EXCEPTION,
155 "Unexpected exception, will result in uninitialized storage");
156 THREAD->incr_allocated_bytes(size * HeapWordSize);
157
158 AllocTracer::send_allocation_outside_tlab_event(klass, size * HeapWordSize);
159
160 return result;
161 }
162
163
164 if (!gc_overhead_limit_was_exceeded) {
165 // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
166 report_java_out_of_memory("Java heap space");
167
168 if (JvmtiExport::should_post_resource_exhausted()) {
169 JvmtiExport::post_resource_exhausted(
170 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
171 "Java heap space");
172 }
196 assert(UseTLAB, "should use UseTLAB");
197
198 HeapWord* obj = thread->tlab().allocate(size);
199 if (obj != NULL) {
200 return obj;
201 }
202 // Otherwise...
203 return allocate_from_tlab_slow(klass, thread, size);
204 }
205
206 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
207 assert(obj != NULL, "cannot initialize NULL object");
208 const size_t hs = oopDesc::header_size();
209 assert(size >= hs, "unexpected object size");
210 ((oop)obj)->set_klass_gap(0);
211 Copy::fill_to_aligned_words(obj + hs, size - hs);
212 }
213
214 oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) {
215 debug_only(check_for_valid_allocation_state());
216 assert(!GC::gc()->heap()->is_gc_active(), "Allocation during gc not allowed");
217 assert(size >= 0, "int won't convert to size_t");
218 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
219 post_allocation_setup_obj(klass, obj, size);
220 NOT_PRODUCT(GC::gc()->heap()->check_for_bad_heap_word_value(obj, size));
221 return (oop)obj;
222 }
223
224 oop CollectedHeap::class_allocate(Klass* klass, int size, TRAPS) {
225 debug_only(check_for_valid_allocation_state());
226 assert(!GC::gc()->heap()->is_gc_active(), "Allocation during gc not allowed");
227 assert(size >= 0, "int won't convert to size_t");
228 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
229 post_allocation_setup_class(klass, obj, size); // set oop_size
230 NOT_PRODUCT(GC::gc()->heap()->check_for_bad_heap_word_value(obj, size));
231 return (oop)obj;
232 }
233
234 oop CollectedHeap::array_allocate(Klass* klass,
235 int size,
236 int length,
237 TRAPS) {
238 debug_only(check_for_valid_allocation_state());
239 assert(!GC::gc()->heap()->is_gc_active(), "Allocation during gc not allowed");
240 assert(size >= 0, "int won't convert to size_t");
241 HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
242 post_allocation_setup_array(klass, obj, length);
243 NOT_PRODUCT(GC::gc()->heap()->check_for_bad_heap_word_value(obj, size));
244 return (oop)obj;
245 }
246
247 oop CollectedHeap::array_allocate_nozero(Klass* klass,
248 int size,
249 int length,
250 TRAPS) {
251 debug_only(check_for_valid_allocation_state());
252 assert(!GC::gc()->heap()->is_gc_active(), "Allocation during gc not allowed");
253 assert(size >= 0, "int won't convert to size_t");
254 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
255 ((oop)obj)->set_klass_gap(0);
256 post_allocation_setup_array(klass, obj, length);
257 #ifndef PRODUCT
258 const size_t hs = oopDesc::header_size()+1;
259 GC::gc()->heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs);
260 #endif
261 return (oop)obj;
262 }
263
264 inline HeapWord* CollectedHeap::align_allocation_or_fail(HeapWord* addr,
265 HeapWord* end,
266 unsigned short alignment_in_bytes) {
267 if (alignment_in_bytes <= ObjectAlignmentInBytes) {
268 return addr;
269 }
270
271 assert(is_ptr_aligned(addr, HeapWordSize),
272 "Address " PTR_FORMAT " is not properly aligned.", p2i(addr));
273 assert(is_size_aligned(alignment_in_bytes, HeapWordSize),
274 "Alignment size %u is incorrect.", alignment_in_bytes);
275
276 HeapWord* new_addr = (HeapWord*) align_ptr_up(addr, alignment_in_bytes);
277 size_t padding = pointer_delta(new_addr, addr);
278
279 if (padding == 0) {
|