< prev index next >
src/hotspot/share/memory/metaspace.cpp
Print this page
rev 49833 : [mq]: 8202074-metaspace-retire-after-humongous-chunks-are-allocated
*** 3404,3414 ****
// If a chunk was available, add it to the in-use chunk list
// and do an allocation from it.
if (next != NULL) {
// Add to this manager's list of chunks in use.
! add_chunk(next, false);
mem = next->allocate(word_size);
}
// Track metaspace memory usage statistic.
track_metaspace_memory_usage();
--- 3404,3423 ----
// If a chunk was available, add it to the in-use chunk list
// and do an allocation from it.
if (next != NULL) {
// Add to this manager's list of chunks in use.
! // If the new chunk is humongous, it was created to serve a single large allocation. In that
! // case it usually makes no sense to make it the current chunk, since the next allocation would
! // need to allocate a new chunk anyway, while we would now prematurely retire a perfectly
! // good chunk which could be used for more normal allocations.
! bool make_current_chunk = true;
! if (next->get_chunk_type() == HumongousIndex &&
! current_chunk() != NULL) {
! make_current_chunk = false;
! }
! add_chunk(next, make_current_chunk);
mem = next->allocate(word_size);
}
// Track metaspace memory usage statistic.
track_metaspace_memory_usage();
*** 3560,3591 ****
// Find the correct list and and set the current
// chunk for that list.
ChunkIndex index = chunk_manager()->list_index(new_chunk->word_size());
- if (index != HumongousIndex) {
- retire_current_chunk();
- set_current_chunk(new_chunk);
- new_chunk->set_next(chunks_in_use(index));
- set_chunks_in_use(index, new_chunk);
- } else {
- // For null class loader data and DumpSharedSpaces, the first chunk isn't
- // small, so small will be null. Link this first chunk as the current
- // chunk.
if (make_current) {
! // Set as the current chunk but otherwise treat as a humongous chunk.
set_current_chunk(new_chunk);
}
- // Link at head. The _current_chunk only points to a humongous chunk for
- // the null class loader metaspace (class and data virtual space managers)
- // any humongous chunks so will not point to the tail
- // of the humongous chunks list.
- new_chunk->set_next(chunks_in_use(HumongousIndex));
- set_chunks_in_use(HumongousIndex, new_chunk);
! assert(new_chunk->word_size() > medium_chunk_size(), "List inconsistency");
! }
// Add to the running sum of capacity
inc_size_metrics(new_chunk->word_size());
assert(new_chunk->is_empty(), "Not ready for reuse");
--- 3569,3588 ----
// Find the correct list and and set the current
// chunk for that list.
ChunkIndex index = chunk_manager()->list_index(new_chunk->word_size());
if (make_current) {
! // If we are to make the chunk current, retire the old current chunk and replace
! // it with the new chunk.
! retire_current_chunk();
set_current_chunk(new_chunk);
}
! // Add the new chunk at the head of its respective chunk list.
! new_chunk->set_next(chunks_in_use(index));
! set_chunks_in_use(index, new_chunk);
// Add to the running sum of capacity
inc_size_metrics(new_chunk->word_size());
assert(new_chunk->is_empty(), "Not ready for reuse");
*** 4798,4808 ****
}
}
void ClassLoaderMetaspace::initialize_first_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype) {
Metachunk* chunk = get_initialization_chunk(type, mdtype);
if (chunk != NULL) {
! // Add to this manager's list of chunks in use and current_chunk().
get_space_manager(mdtype)->add_chunk(chunk, true);
}
}
Metachunk* ClassLoaderMetaspace::get_initialization_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype) {
--- 4795,4805 ----
}
}
void ClassLoaderMetaspace::initialize_first_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype) {
Metachunk* chunk = get_initialization_chunk(type, mdtype);
if (chunk != NULL) {
! // Add to this manager's list of chunks in use and make it the current_chunk().
get_space_manager(mdtype)->add_chunk(chunk, true);
}
}
Metachunk* ClassLoaderMetaspace::get_initialization_chunk(Metaspace::MetaspaceType type, Metaspace::MetadataType mdtype) {
< prev index next >