268
269 void CompactibleFreeListSpace::reset(MemRegion mr) {
270 resetIndexedFreeListArray();
271 dictionary()->reset();
272 if (BlockOffsetArrayUseUnallocatedBlock) {
273 assert(end() == mr.end(), "We are compacting to the bottom of CMS gen");
274 // Everything's allocated until proven otherwise.
275 _bt.set_unallocated_block(end());
276 }
277 if (!mr.is_empty()) {
278 assert(mr.word_size() >= MinChunkSize, "Chunk size is too small");
279 _bt.single_block(mr.start(), mr.word_size());
280 FreeChunk* fc = (FreeChunk*) mr.start();
281 fc->set_size(mr.word_size());
282 if (mr.word_size() >= IndexSetSize ) {
283 returnChunkToDictionary(fc);
284 } else {
285 _bt.verify_not_unallocated((HeapWord*)fc, fc->size());
286 _indexedFreeList[mr.word_size()].return_chunk_at_head(fc);
287 }
288 }
289 _promoInfo.reset();
290 _smallLinearAllocBlock._ptr = NULL;
291 _smallLinearAllocBlock._word_size = 0;
292 }
293
294 void CompactibleFreeListSpace::reset_after_compaction() {
295 // Reset the space to the new reality - one free chunk.
296 MemRegion mr(compaction_top(), end());
297 reset(mr);
298 // Now refill the linear allocation block(s) if possible.
299 if (_adaptive_freelists) {
300 refillLinearAllocBlocksIfNeeded();
301 } else {
302 // Place as much of mr in the linAB as we can get,
303 // provided it was big enough to go into the dictionary.
304 FreeChunk* fc = dictionary()->find_largest_dict();
305 if (fc != NULL) {
306 assert(fc->size() == mr.word_size(),
307 "Why was the chunk broken up?");
|
268
269 void CompactibleFreeListSpace::reset(MemRegion mr) {
270 resetIndexedFreeListArray();
271 dictionary()->reset();
272 if (BlockOffsetArrayUseUnallocatedBlock) {
273 assert(end() == mr.end(), "We are compacting to the bottom of CMS gen");
274 // Everything's allocated until proven otherwise.
275 _bt.set_unallocated_block(end());
276 }
277 if (!mr.is_empty()) {
278 assert(mr.word_size() >= MinChunkSize, "Chunk size is too small");
279 _bt.single_block(mr.start(), mr.word_size());
280 FreeChunk* fc = (FreeChunk*) mr.start();
281 fc->set_size(mr.word_size());
282 if (mr.word_size() >= IndexSetSize ) {
283 returnChunkToDictionary(fc);
284 } else {
285 _bt.verify_not_unallocated((HeapWord*)fc, fc->size());
286 _indexedFreeList[mr.word_size()].return_chunk_at_head(fc);
287 }
288 coalBirth(mr.word_size());
289 }
290 _promoInfo.reset();
291 _smallLinearAllocBlock._ptr = NULL;
292 _smallLinearAllocBlock._word_size = 0;
293 }
294
295 void CompactibleFreeListSpace::reset_after_compaction() {
296 // Reset the space to the new reality - one free chunk.
297 MemRegion mr(compaction_top(), end());
298 reset(mr);
299 // Now refill the linear allocation block(s) if possible.
300 if (_adaptive_freelists) {
301 refillLinearAllocBlocksIfNeeded();
302 } else {
303 // Place as much of mr in the linAB as we can get,
304 // provided it was big enough to go into the dictionary.
305 FreeChunk* fc = dictionary()->find_largest_dict();
306 if (fc != NULL) {
307 assert(fc->size() == mr.word_size(),
308 "Why was the chunk broken up?");
|