HeapWord* DefNewGeneration::allocate(size_t word_size, bool is_large_noref, bool is_tlab) { // This is the slow-path allocation for the DefNewGeneration. // Most allocations are fast-path in compiled code. // We try to allocate from the eden. If that works, we are happy. // Note that since DefNewGeneration supports lock-free allocation, we // have to use it here, as well. HeapWord* result = eden()->par_allocate(word_size); if (result == NULL) { // Tell the next generation we reached a limit. HeapWord* new_limit = next_gen()->allocation_limit_reached(eden(), eden()->top(), word_size); if (new_limit != NULL) { eden()->set_soft_end(new_limit); result = eden()->par_allocate(word_size); } else { assert(eden()->soft_end() == eden()->end(), "invalid state after allocation_limit_reached returned null") } // If the eden is full and the last collection bailed out, we are running // out of heap space, and we try to allocate the from-space, too. // allocate_from_space can't be inlined because that would introduce a // circular dependency at compile time. if (result == NULL) { result = allocate_from_space(word_size); } }
HeapWord* DefNewGeneration::allocate(size_t word_size, bool is_tlab) { // This is the slow-path allocation for the DefNewGeneration. // Most allocations are fast-path in compiled code. // We try to allocate from the eden. If that works, we are happy. // Note that since DefNewGeneration supports lock-free allocation, we // have to use it here, as well. HeapWord* result = eden()->par_allocate(word_size); if (result != NULL) { return result; } do { HeapWord* old_limit = eden()->soft_end(); if (old_limit < eden()->end()) { // Tell the next generation we reached a limit. HeapWord* new_limit = next_gen()->allocation_limit_reached(eden(), eden()->top(), word_size); if (new_limit != NULL) { Atomic::cmpxchg_ptr(new_limit, eden()->soft_end_addr(), old_limit); } else { assert(eden()->soft_end() == eden()->end(), "invalid state after allocation_limit_reached returned null"); } } else { // The allocation failed and the soft limit is equal to the hard limit, // there are no reasons to do an attempt to allocate assert(old_limit == eden()->end(), "sanity check"); break; } // Try to allocate until succeeded or the soft limit can't be adjusted result = eden()->par_allocate(word_size); } while (result == NULL); // If the eden is full and the last collection bailed out, we are running // out of heap space, and we try to allocate the from-space, too. // allocate_from_space can't be inlined because that would introduce a // circular dependency at compile time. if (result == NULL) { result = allocate_from_space(word_size); } return result; }