< prev index next >

src/hotspot/share/gc/shared/collectedHeap.inline.hpp

erik allocation

119   assert(length >= 0, "length should be non-negative");                                                                              
120   ((arrayOop)obj_ptr)->set_length(length);                                                                                           
121   post_allocation_setup_common(klass, obj_ptr);                                                                                      
122   oop new_obj = (oop)obj_ptr;                                                                                                        
123   assert(new_obj->is_array(), "must be an array");                                                                                   
124   // notify jvmti and dtrace (must be after length is set for dtrace)                                                                
125   post_allocation_notify(klass, new_obj, new_obj->size());                                                                           
126 }                                                                                                                                    
127 
128 HeapWord* CollectedHeap::common_mem_allocate_noinit(Klass* klass, size_t size, TRAPS) {                                              
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(klass, result, size * HeapWordSize, THREAD);                                           
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     }                                                                                                                                
173 
174     THROW_OOP_0(Universe::out_of_memory_error_java_heap());                                                                          
175   } else {                                                                                                                           
176     // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support                                                            
177     report_java_out_of_memory("GC overhead limit exceeded");                                                                         
178 
179     if (JvmtiExport::should_post_resource_exhausted()) {                                                                             
180       JvmtiExport::post_resource_exhausted(                                                                                          
181         JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,                                                     
182         "GC overhead limit exceeded");                                                                                               
183     }                                                                                                                                
184 
185     THROW_OOP_0(Universe::out_of_memory_error_gc_overhead_limit());                                                                  
186   }                                                                                                                                  
187 }                                                                                                                                    
188 
189 HeapWord* CollectedHeap::common_mem_allocate_init(Klass* klass, size_t size, TRAPS) {                                                
190   HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);                                                               
191   init_obj(obj, size);                                                                                                               
192   return obj;                                                                                                                        
193 }                                                                                                                                    
194 
195 HeapWord* CollectedHeap::allocate_from_tlab(Klass* klass, Thread* thread, size_t size) {                                             
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 }                                                                                                                                    

119   assert(length >= 0, "length should be non-negative");
120   ((arrayOop)obj_ptr)->set_length(length);
121   post_allocation_setup_common(klass, obj_ptr);
122   oop new_obj = (oop)obj_ptr;
123   assert(new_obj->is_array(), "must be an array");
124   // notify jvmti and dtrace (must be after length is set for dtrace)
125   post_allocation_notify(klass, new_obj, new_obj->size());
126 }
127 
128 HeapWord* CollectedHeap::common_mem_allocate_noinit(Klass* klass, size_t size, TRAPS) {
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   bool gc_overhead_limit_was_exceeded = false;
140   CollectedHeap* heap = Universe::heap();
141   HeapWord* result = heap->obj_allocate_raw(klass, size, &gc_overhead_limit_was_exceeded, THREAD);
142 
143   if (result != NULL) {
144     NOT_PRODUCT(Universe::heap()->
145       check_for_non_bad_heap_word_value(result, size));
146     assert(!HAS_PENDING_EXCEPTION,
147            "Unexpected exception, will result in uninitialized storage");
148     THREAD->incr_allocated_bytes(size * HeapWordSize);
149 
150     AllocTracer::send_allocation_outside_tlab(klass, result, size * HeapWordSize, THREAD);
151 
152     return result;
153   }
154 

155   if (!gc_overhead_limit_was_exceeded) {
156     // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
157     report_java_out_of_memory("Java heap space");
158 
159     if (JvmtiExport::should_post_resource_exhausted()) {
160       JvmtiExport::post_resource_exhausted(
161         JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
162         "Java heap space");
163     }
164 
165     THROW_OOP_0(Universe::out_of_memory_error_java_heap());
166   } else {
167     // -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
168     report_java_out_of_memory("GC overhead limit exceeded");
169 
170     if (JvmtiExport::should_post_resource_exhausted()) {
171       JvmtiExport::post_resource_exhausted(
172         JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP,
173         "GC overhead limit exceeded");
174     }
175 
176     THROW_OOP_0(Universe::out_of_memory_error_gc_overhead_limit());
177   }
178 }
179 
180 HeapWord* CollectedHeap::common_mem_allocate_init(Klass* klass, size_t size, TRAPS) {
181   HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL);
182   init_obj(obj, size);
183   return obj;
184 }
185 
186 HeapWord* CollectedHeap::allocate_from_tlab(Klass* klass, size_t size, TRAPS) {
187   assert(UseTLAB, "should use UseTLAB");
188 
189   HeapWord* obj = THREAD->tlab().allocate(size);
190   if (obj != NULL) {
191     return obj;
192   }
193   // Otherwise...
194   obj = allocate_from_tlab_slow(klass, size, THREAD);
195   assert(obj == NULL || !HAS_PENDING_EXCEPTION,
196          "Unexpected exception, will result in uninitialized storage");
197   return obj;
198 }
199 
200 void CollectedHeap::init_obj(HeapWord* obj, size_t size) {
201   assert(obj != NULL, "cannot initialize NULL object");
202   const size_t hs = oopDesc::header_size();
203   assert(size >= hs, "unexpected object size");
204   ((oop)obj)->set_klass_gap(0);
205   Copy::fill_to_aligned_words(obj + hs, size - hs);
206 }
207 
208 oop CollectedHeap::obj_allocate(Klass* klass, int size, TRAPS) {
209   debug_only(check_for_valid_allocation_state());
210   assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed");
211   assert(size >= 0, "int won't convert to size_t");
212   HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL);
213   post_allocation_setup_obj(klass, obj, size);
214   NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size));
215   return (oop)obj;
216 }
< prev index next >