< prev index next >
src/share/vm/gc/g1/g1CollectedHeap.cpp
Print this page
*** 337,358 ****
// type and, for a very short period of time, the klass and length
// fields will be inconsistent. This could cause a refinement
// thread to calculate the object size incorrectly.
Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
! size_t fill_size = word_size_sum - word_size;
! if (fill_size >= min_fill_size()) {
! fill_with_objects(obj_top, fill_size);
! } else {
! fill_size = 0;
}
// We will set up the first region as "starts humongous". This
// will also update the BOT covering all the regions to reflect
// that there is a single object that starts at the bottom of the
// first region.
! first_hr->set_starts_humongous(obj_top, fill_size);
first_hr->set_allocation_context(context);
// Then, if there are any, we will set up the "continues
// humongous" regions.
HeapRegion* hr = NULL;
for (uint i = first + 1; i < last; ++i) {
--- 337,365 ----
// type and, for a very short period of time, the klass and length
// fields will be inconsistent. This could cause a refinement
// thread to calculate the object size incorrectly.
Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
! // How many words we use for filler objects.
! size_t word_fill_size = word_size_sum - word_size;
!
! // How many words memory we "waste" which cannot hold a filler object.
! size_t words_not_fillable = 0;
!
! if (word_fill_size >= min_fill_size()) {
! fill_with_objects(obj_top, word_fill_size);
! } else if (word_fill_size > 0) {
! // We have space to fill, but we cannot fit an object there.
! words_not_fillable = word_fill_size;
! word_fill_size = 0;
}
// We will set up the first region as "starts humongous". This
// will also update the BOT covering all the regions to reflect
// that there is a single object that starts at the bottom of the
// first region.
! first_hr->set_starts_humongous(obj_top, word_fill_size);
first_hr->set_allocation_context(context);
// Then, if there are any, we will set up the "continues
// humongous" regions.
HeapRegion* hr = NULL;
for (uint i = first + 1; i < last; ++i) {
*** 370,401 ****
// object header and the BOT initialization.
OrderAccess::storestore();
// Now that the BOT and the object header have been initialized,
// we can update top of the "starts humongous" region.
! first_hr->set_top(first_hr->end());
! if (_hr_printer.is_active()) {
! _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, first_hr->end());
! }
// Now, we will update the top fields of the "continues humongous"
// regions.
- hr = NULL;
for (uint i = first + 1; i < last; ++i) {
hr = region_at(i);
! hr->set_top(hr->end());
! if (_hr_printer.is_active()) {
! _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
! }
}
! assert(hr == NULL || (hr->bottom() < obj_top && obj_top <= hr->end()),
"obj_top should be in last region");
check_bitmaps("Humongous Region Allocation", first_hr);
! increase_used(word_size_sum * HeapWordSize);
for (uint i = first; i < last; ++i) {
_humongous_set.add(region_at(i));
}
--- 377,415 ----
// object header and the BOT initialization.
OrderAccess::storestore();
// Now that the BOT and the object header have been initialized,
// we can update top of the "starts humongous" region.
! hr = first_hr;
!
! // If we cannot fit a filler object, we must set top to the end
! // of the humongous object, otherwise we cannot iterate the heap
! // and the BOT will not be complete.
! hr->set_top((obj_top == hr->end() - words_not_fillable) ? obj_top : hr->end());
! _hr_printer.alloc(G1HRPrinter::StartsHumongous, hr, hr->top());
// Now, we will update the top fields of the "continues humongous"
// regions.
for (uint i = first + 1; i < last; ++i) {
hr = region_at(i);
! // If we cannot fit a filler object, we must set top to the end
! // of the humongous object, otherwise we cannot iterate the heap
! // and the BOT will not be complete.
! hr->set_top((obj_top == hr->end() - words_not_fillable) ? obj_top : hr->end());
! _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->top());
}
! assert(hr->bottom() < obj_top && obj_top <= hr->end(),
"obj_top should be in last region");
check_bitmaps("Humongous Region Allocation", first_hr);
! assert(words_not_fillable == 0 ||
! first_hr->bottom() + word_size_sum - words_not_fillable == hr->top(),
! "Miscalculation in humongous allocation");
!
! increase_used((word_size_sum - words_not_fillable) * HeapWordSize);
for (uint i = first; i < last; ++i) {
_humongous_set.add(region_at(i));
}
< prev index next >