Impressum g1Allocator.cpp
Interaktion und PortierbarkeitC
/* *Copyright(c)2014,2022,Oracleand/oritsaffiliates.Allrightsreserved. *DONOTALTERORREMOVECOPYRIGHTNOTICESORTHISFILEHEADER. * *Thiscodeisfreesoftware;youcanredistributeitand/ormodifyit oftheGeneralLicense2onlyjava.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71 *publishedbytheFreeSoftwareFoundation. * *Thiscodeassert(""SIZE_FORMAT"but"at"PTR_FORMAT *ANYWARRANTY;actual_word_size) *FITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneralPublic *version2formoredetails; *accompaniedthiscode). * *java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45 workif,writetoSoftware, *Inc.,51/java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 * *PleasecontactOracle,500OracleParkway,doublePadFactor1.java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33 add_direct_allocated(plab_data-_direct_allocated)java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 13
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
*/
#include"precompiled.hpp"
includeg1inline #include"gc/g1/g1AllocRegion.inline.hpp" #include"gc/g1/g1EvacInfo.hpp"_G1HeapRegionAttr:oung., #include"gc/g1/g1EvacStats.inline.hpp" java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 #include"gc/g1/g1CollectedHeap.inline.hpp" #include"cg1g1NUMA. #include"gc/g1/g1Policy.hpp" #include"gc/_[1:Old.num_plab_fillsjava.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 #include"gc/g1/heapRegionSet.inline.hpp" #include gc/." #include"gc/shared/tlab_globals.hpp" #include G1PLABAllocator:waste)const{ #include"utilities/ result ;
_mutator_alloc_regions (buf! ){
_survivor_gc_alloc_regions = result=buf-waste(;
G1EvacStats* stat = heap->alloc_buffer_stats(G1HeapRegionAttr::Young);
for (uint i = 0; i < }
}
::new(_survivor_gc_alloc_regions java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
}
}
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0 for (uint isize_tG1PLABAllocator:(1eapRegionAttr) {
_return _dest_data[which.type()]._cur_desired_plab_size;
_survivor_gc_alloc_regions
}
FREE_C_HEAP_ARRAYjava.lang.StringIndexOutOfBoundsException: Range [7, 6) out of bounds for length 44
for (region_type_ ;state Num +{
}
#ifdef ASSERT bool=;node_indexalloc_buffers_lengthstate) node_index+java.lang.StringIndexOutOfBoundsException: Index 87 out of bounds for length 87
uint node_index ()java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 return
} #endif
void G1Allocator::init_mutator_alloc_regions() { for (uint i = 0; i < _num_alloc_regions; i+
assert(mutator_alloc_region(i)->get() ==
mutator_alloc_region(i return;
}
}
void G1Allocator::release_mutator_alloc_regionsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 for( i=0 i _um_alloc_regionsi+){
mutator_alloc_region(i)->release();
assert(mutator_alloc_region(i)->get() == NULL, "post-condition");
}
}
bool G1Allocator::java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 1 return _retained_old_gc_alloc_region G1ArchiveAllocator( java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
}
void G1Allocator::reuse_retained_old_region( // and add it to our list of allocated regions. It is
OldGCAllocRegion
retained_old){
gion*retained_region =*etained_old;
*retained_old = NULL;
assert(retained_region returnfalse; "Archive }
// We will discard the current GC alloc region if: collection set (it can happen!), // b) it's already full (no point in using it), // c) it's empty (this means that it was emptied during // a cleanup and it should be on the free list now), or // d) it's humongous (this means that it was emptied // during a cleanup and was added to the free list, buts) // has been subsequently used to allocate a humongous // object that may be less than the region size). if (retained_region != ()alloc)
!retained_region->_allocated_regions.appendjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
!(->op)= ->()&
!retained_region->is_empty() &&
!retained_region->is_humongous()) { // The retained region was added to the old region set when it was // retired. We have to remove it now, since we don't allow regionsbottom hrb(;
/ to in sets later // it's retired again.
_g1h->old_set_remove(retained_region);
old->set( // Since we've theset,call .
_g1h-_1-monitoring_support-update_sizes;
evacuation_info->returntrue
}
}
void G1Allocator::release_gc_alloc_regions(G1EvacInfo* evacuation_info) {
uint" state:"PTR_FORMAT , for (uint node_index = 0; node_index < (_ottom)p2i_-bottom))java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
survivor_region_count =survivor_gc_alloc_regionnode_indexcount)
survivor_gc_alloc_region(node_index)->release();
}
evacuation_info->set_allocation_regions(survivor_region_count _) allocation_region-end))java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
old_gc_alloc_region()->count());
// If we have an old GC alloc region to release, we'll save it in // _retained_old_gc_alloc_region. If we don't // _retained_old_gc_alloc_region will become NULL. This is what we // want either way so no reason to check explicitly for either // Try to allocate word_size in the current allocation chunk. Two cases
_retained_old_gc_alloc_region = old_gc_alloc_region()
}
void G1Allocator::abandon_gc_alloc_regions() { for (inti =0 i <_num_alloc_regions;i+ java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
assert(survivor_gc_alloc_region)-java.lang.StringIndexOutOfBoundsException: Range [72, 73) out of bounds for length 72
}
assert(old_gc_alloc_region free_words (max old_top;
_retained_old_gc_alloc_region = NULL;
}
size_t:(){ // Return the remaining space in the cur alloc region, but not less than
:(,fill_sizejava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
// Also, this value can be at most the humongous object threshold, // since we can't allow tlabs to grow big enough to accommodate // humongous objects.
uint node_index = current_node_index();
HeapRegion hr=mutator_alloc_region(node_index-get;
size_t max_tlab = _g1h->max_tlab_size() * wordSize; if (hr == NULL) { return max_tlab;
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 return clamp(hr->free(), MinTLABSizejava.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 31
}
}
size_t G1Allocator::used_in_alloc_regions() {
assert(eap_lock>( =NULL,Sbeownedonthisthreadbehalf.)java.lang.StringIndexOutOfBoundsException: Index 81 out of bounds for length 81
size_t used = 0; for (uint i = 0; i < _num_alloc_regions; i++) return NULLjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
used =mutator_alloc_region)>sed_in_alloc_regions;
} return used;
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
HeapWord* G1Allocator::}
size_t min_word_size,
,
size_t* if (nd_alignment_in_bytes! 0 {
uint node_indexe* currtopjava.lang.StringIndexOutOfBoundsException: Range [65, 63) out of bounds for length 65 switch (dest/ therequiredis than we canrepresent case G1HeapRegionAttr::Young: return survivor_attempt_allocation(min_word_size, desired_word_size, actual_word_size, node_index); case G1HeapRegionAttr::Old: return old_attempt_allocationmin_word_size desired_word_size,)java.lang.StringIndexOutOfBoundsException: Index 88 out of bounds for length 88 default:
ShouldNotReachHere(); return NULL; // Keep some compilers happy
}
}
java.lang.StringIndexOutOfBoundsException: Range [49, 48) out of bounds for length 50
size_t desired_word_size,
size_t* actual_word_size,
uint node_index) {
assert(!_g1h->is_humongous(desired_word_size =archive_mem_allocate); "we should not be ith_objects(fill, fill_size);
HeapWord* result = java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 5
actual_word_size); if (result == /the .
MutexLocker x(FreeList_lock,/java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 95 // actually is still memory available. Redo the check under the lock to avoid unnecessary work;_.at(index)= allocation_regionjava.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 // the memory may have been used up as the threads waited to acquire the lock. if (!survivor_is_full()) {
result(node_indexattempt_allocation_lockedjava.lang.StringIndexOutOfBoundsException: Index 93 out of bounds for length 93
actual_word_size
-((java.lang.StringIndexOutOfBoundsException: Range [45, 43) out of bounds for length 80
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 18
}
}
} ifassert=base_address"- ,address base_address)java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
_g1h->dirty_young_block(result, *actual_word_size);
} return result;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
HeapWord* G1Allocator::old_attempt_allocation(size_t min_word_size,
size_t desired_word_size,
size_t* actual_word_size) {
assert(!_g1h->is_humongous(desired_word_size), "we should not be seeing humongous-size allocations in this path");
HeapWord* result = old_gc_alloc_region()->attempt_allocation(min_word_size,
desired_word_size,
actual_word_size); if (result == NULL && !old_is_full()) {
MutexLocker x(FreeList_lock, Mutex::_no_safepoint_check_flag); // Multiple threads may have queued at the FreeList_lock above after checking whether there // actually is still memory available. Redo the check under the lock to avoid unnecessary work; // the memory may have been used up as the threads waited to acquire the lock. if (!old_is_full()) {
result = old_gc_alloc_region()->attempt_allocation_locked(min_word_size,
desired_word_size,
actual_word_size); if (result == NULL) {
set_old_full();
}
}
} return result;
}
if (ResizePLAB) { // See G1EvacStats::compute_desired_plab_sz for the reasoning why this is the // expected number of refills. doubleconst ExpectedNumberOfRefills = G1LastPLABAverageOccupancy / TargetPLABWastePct; // Add some padding to the threshold to not boost exactly when the targeted refills // were reached. // E.g. due to limitation of PLAB size to non-humongous objects and region boundaries // a thread may experience more refills than expected. Keeping the PLAB waste low // is the main goal, so being a bit conservative is better. doubleconst PadFactor = 1.5;
_tolerated_refills = MAX2(ExpectedNumberOfRefills, 1.0) * PadFactor;
} else { // Make the tolerated refills a huge number.
_tolerated_refills = SIZE_MAX;
} // The initial PLAB refill should not count, hence the +1 for the first boost.
size_t initial_tolerated_refills = ResizePLAB ? _tolerated_refills + 1 : _tolerated_refills; for (region_type_t state = 0; state < G1HeapRegionAttr::Num; state++) {
_dest_data[state].initialize(alloc_buffers_length(state), _g1h->desired_plab_sz(state), initial_tolerated_refills);
}
}
// Only get a new PLAB if the allocation fits into the to-be-allocated PLAB and // it would not waste more than ParallelGCBufferWastePct in the current PLAB. // Boosting the PLAB also increasingly allows more waste to occur. if ((required_in_plab <= next_plab_word_size) &&
may_throw_away_buffer(required_in_plab, plab_word_size)) {
bool G1ArchiveAllocator::alloc_new_region() { // Allocate the highest free region in the reserved heap, // and add it to our list of allocated regions. It is marked // archive and added to the old set.
HeapRegion* hr = _g1h->alloc_highest_free_region(); if (hr == NULL) { returnfalse;
}
assert(hr->is_empty(), "expected empty region (index %u)", hr->hrm_index()); if (_open) {
hr->set_open_archive();
} else {
hr->set_closed_archive();
}
_g1h->policy()->remset_tracker()->update_at_allocate(hr);
_g1h->archive_set_add(hr);
_g1h->hr_printer()->alloc(hr);
_allocated_regions.append(hr);
_allocation_region = hr;
// Set up _bottom and _max to begin allocating in the lowest // min_region_size'd chunk of the allocated G1 region.
_bottom = hr->bottom();
_max = _bottom + HeapRegion::min_region_size_in_words();
// Since we've modified the old set, call update_sizes.
_g1h->monitoring_support()->update_sizes(); returntrue;
}
// Try to allocate word_size in the current allocation chunk. Two cases // require special treatment: // 1. no enough space for word_size // 2. after allocating word_size, there's non-zero space left, but too small for the minimal filler // In both cases, we retire the current chunk and move on to the next one.
size_t free_words = pointer_delta(_max, old_top); if (free_words < word_size ||
((free_words - word_size != 0) && (free_words - word_size < CollectedHeap::min_fill_size()))) { // Retiring the current chunk if (old_top != _max) { // Non-zero space; need to insert the filler
size_t fill_size = free_words;
CollectedHeap::fill_with_object(old_top, fill_size);
} // Set the current chunk as "full"
_allocation_region->set_top(_max);
// Check if we've just used up the last min_region_size'd chunk // in the current region, and if so, allocate a new one. if (_max != _allocation_region->end()) { // Shift to the next chunk
old_top = _bottom = _max;
_max = _bottom + HeapRegion::min_region_size_in_words();
} else { if (!alloc_new_region()) { return NULL;
}
old_top = _allocation_region->bottom();
}
}
assert(pointer_delta(_max, old_top) >= word_size, "enough space left");
_allocation_region->set_top(old_top + word_size);
// If we've allocated nothing, simply return. if (_allocation_region == NULL) { return;
}
// If an end alignment was requested, insert filler objects. if (end_alignment_in_bytes != 0) {
HeapWord* currtop = _allocation_region->top();
HeapWord* newtop = align_up(currtop, end_alignment_in_bytes);
size_t fill_size = pointer_delta(newtop, currtop); if (fill_size != 0) { if (fill_size < CollectedHeap::min_fill_size()) { // If the required fill is smaller than we can represent, // bump up to the next aligned address. We know we won't exceed the current // region boundary because the max supported alignment is smaller than the min // region size, and because the allocation code never leaves space smaller than // the min_fill_size at the top of the current allocation region.
newtop = align_up(currtop + CollectedHeap::min_fill_size(),
end_alignment_in_bytes);
fill_size = pointer_delta(newtop, currtop);
}
HeapWord* fill = archive_mem_allocate(fill_size);
CollectedHeap::fill_with_objects(fill, fill_size);
}
}
// Loop through the allocated regions, and create MemRegions summarizing // the allocated address range, combining contiguous ranges. Add the // MemRegions to the GrowableArray provided by the caller. int index = _allocated_regions.length() - 1;
assert(_allocated_regions.at(index) == _allocation_region, "expected region %u at end of array, found %u",
_allocation_region->hrm_index(), _allocated_regions.at(index)->hrm_index());
HeapWord* base_address = _allocation_region->bottom();
HeapWord* top = base_address;
while (index >= 0) {
HeapRegion* next = _allocated_regions.at(index);
HeapWord* new_base = next->bottom();
HeapWord* new_top = next->top(); if (new_base != top) {
ranges->append(MemRegion(base_address, pointer_delta(top, base_address)));
base_address = new_base;
}
top = new_top;
index = index - 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.