1 /* 2 * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "gc_implementation/concurrentMarkSweep/cmsLockVerifier.hpp" 27 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" 28 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp" 29 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp" 30 #include "gc_implementation/shared/liveRange.hpp" 31 #include "gc_implementation/shared/spaceDecorator.hpp" 32 #include "gc_interface/collectedHeap.inline.hpp" 33 #include "memory/allocation.inline.hpp" 34 #include "memory/blockOffsetTable.inline.hpp" 35 #include "memory/resourceArea.hpp" 36 #include "memory/space.inline.hpp" 37 #include "memory/universe.inline.hpp" 38 #include "oops/oop.inline.hpp" 39 #include "runtime/globals.hpp" 40 #include "runtime/handles.inline.hpp" 41 #include "runtime/init.hpp" 42 #include "runtime/java.hpp" 43 #include "runtime/orderAccess.inline.hpp" 44 #include "runtime/vmThread.hpp" 45 #include "utilities/copy.hpp" 46 47 ///////////////////////////////////////////////////////////////////////// 48 //// CompactibleFreeListSpace 49 ///////////////////////////////////////////////////////////////////////// 50 51 // highest ranked free list lock rank 52 int CompactibleFreeListSpace::_lockRank = Mutex::leaf + 3; 53 54 // Defaults are 0 so things will break badly if incorrectly initialized. 55 size_t CompactibleFreeListSpace::IndexSetStart = 0; 56 size_t CompactibleFreeListSpace::IndexSetStride = 0; 57 58 size_t MinChunkSize = 0; 59 60 void CompactibleFreeListSpace::set_cms_values() { 61 // Set CMS global values 62 assert(MinChunkSize == 0, "already set"); 63 64 // MinChunkSize should be a multiple of MinObjAlignment and be large enough 65 // for chunks to contain a FreeChunk. 66 size_t min_chunk_size_in_bytes = align_size_up(sizeof(FreeChunk), MinObjAlignmentInBytes); 67 MinChunkSize = min_chunk_size_in_bytes / BytesPerWord; 68 69 assert(IndexSetStart == 0 && IndexSetStride == 0, "already set"); 70 IndexSetStart = MinChunkSize; 71 IndexSetStride = MinObjAlignment; 72 } 73 74 // Constructor 75 CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, 76 MemRegion mr, bool use_adaptive_freelists, 77 FreeBlockDictionary<FreeChunk>::DictionaryChoice dictionaryChoice) : 78 _dictionaryChoice(dictionaryChoice), 79 _adaptive_freelists(use_adaptive_freelists), 80 _bt(bs, mr), 81 // free list locks are in the range of values taken by _lockRank 82 // This range currently is [_leaf+2, _leaf+3] 83 // Note: this requires that CFLspace c'tors 84 // are called serially in the order in which the locks are 85 // are acquired in the program text. This is true today. 86 _freelistLock(_lockRank--, "CompactibleFreeListSpace._lock", true), 87 _parDictionaryAllocLock(Mutex::leaf - 1, // == rank(ExpandHeap_lock) - 1 88 "CompactibleFreeListSpace._dict_par_lock", true), 89 _rescan_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord * 90 CMSRescanMultiple), 91 _marking_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord * 92 CMSConcMarkMultiple), 93 _collector(NULL) 94 { 95 assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize, 96 "FreeChunk is larger than expected"); 97 _bt.set_space(this); 98 initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle); 99 // We have all of "mr", all of which we place in the dictionary 100 // as one big chunk. We'll need to decide here which of several 101 // possible alternative dictionary implementations to use. For 102 // now the choice is easy, since we have only one working 103 // implementation, namely, the simple binary tree (splaying 104 // temporarily disabled). 105 switch (dictionaryChoice) { 106 case FreeBlockDictionary<FreeChunk>::dictionaryBinaryTree: 107 _dictionary = new AFLBinaryTreeDictionary(mr); 108 break; 109 case FreeBlockDictionary<FreeChunk>::dictionarySplayTree: 110 case FreeBlockDictionary<FreeChunk>::dictionarySkipList: 111 default: 112 warning("dictionaryChoice: selected option not understood; using" 113 " default BinaryTreeDictionary implementation instead."); 114 } 115 assert(_dictionary != NULL, "CMS dictionary initialization"); 116 // The indexed free lists are initially all empty and are lazily 117 // filled in on demand. Initialize the array elements to NULL. 118 initializeIndexedFreeListArray(); 119 120 // Not using adaptive free lists assumes that allocation is first 121 // from the linAB's. Also a cms perm gen which can be compacted 122 // has to have the klass's klassKlass allocated at a lower 123 // address in the heap than the klass so that the klassKlass is 124 // moved to its new location before the klass is moved. 125 // Set the _refillSize for the linear allocation blocks 126 if (!use_adaptive_freelists) { 127 FreeChunk* fc = _dictionary->get_chunk(mr.word_size(), 128 FreeBlockDictionary<FreeChunk>::atLeast); 129 // The small linAB initially has all the space and will allocate 130 // a chunk of any size. 131 HeapWord* addr = (HeapWord*) fc; 132 _smallLinearAllocBlock.set(addr, fc->size() , 133 1024*SmallForLinearAlloc, fc->size()); 134 // Note that _unallocated_block is not updated here. 135 // Allocations from the linear allocation block should 136 // update it. 137 } else { 138 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc, 139 SmallForLinearAlloc); 140 } 141 // CMSIndexedFreeListReplenish should be at least 1 142 CMSIndexedFreeListReplenish = MAX2((uintx)1, CMSIndexedFreeListReplenish); 143 _promoInfo.setSpace(this); 144 if (UseCMSBestFit) { 145 _fitStrategy = FreeBlockBestFitFirst; 146 } else { 147 _fitStrategy = FreeBlockStrategyNone; 148 } 149 check_free_list_consistency(); 150 151 // Initialize locks for parallel case. 152 153 if (CollectedHeap::use_parallel_gc_threads()) { 154 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 155 _indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1 156 "a freelist par lock", 157 true); 158 DEBUG_ONLY( 159 _indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]); 160 ) 161 } 162 _dictionary->set_par_lock(&_parDictionaryAllocLock); 163 } 164 165 _used_stable = 0; 166 } 167 168 // Like CompactibleSpace forward() but always calls cross_threshold() to 169 // update the block offset table. Removed initialize_threshold call because 170 // CFLS does not use a block offset array for contiguous spaces. 171 HeapWord* CompactibleFreeListSpace::forward(oop q, size_t size, 172 CompactPoint* cp, HeapWord* compact_top) { 173 // q is alive 174 // First check if we should switch compaction space 175 assert(this == cp->space, "'this' should be current compaction space."); 176 size_t compaction_max_size = pointer_delta(end(), compact_top); 177 assert(adjustObjectSize(size) == cp->space->adjust_object_size_v(size), 178 "virtual adjustObjectSize_v() method is not correct"); 179 size_t adjusted_size = adjustObjectSize(size); 180 assert(compaction_max_size >= MinChunkSize || compaction_max_size == 0, 181 "no small fragments allowed"); 182 assert(minimum_free_block_size() == MinChunkSize, 183 "for de-virtualized reference below"); 184 // Can't leave a nonzero size, residual fragment smaller than MinChunkSize 185 if (adjusted_size + MinChunkSize > compaction_max_size && 186 adjusted_size != compaction_max_size) { 187 do { 188 // switch to next compaction space 189 cp->space->set_compaction_top(compact_top); 190 cp->space = cp->space->next_compaction_space(); 191 if (cp->space == NULL) { 192 cp->gen = GenCollectedHeap::heap()->prev_gen(cp->gen); 193 assert(cp->gen != NULL, "compaction must succeed"); 194 cp->space = cp->gen->first_compaction_space(); 195 assert(cp->space != NULL, "generation must have a first compaction space"); 196 } 197 compact_top = cp->space->bottom(); 198 cp->space->set_compaction_top(compact_top); 199 // The correct adjusted_size may not be the same as that for this method 200 // (i.e., cp->space may no longer be "this" so adjust the size again. 201 // Use the virtual method which is not used above to save the virtual 202 // dispatch. 203 adjusted_size = cp->space->adjust_object_size_v(size); 204 compaction_max_size = pointer_delta(cp->space->end(), compact_top); 205 assert(cp->space->minimum_free_block_size() == 0, "just checking"); 206 } while (adjusted_size > compaction_max_size); 207 } 208 209 // store the forwarding pointer into the mark word 210 if ((HeapWord*)q != compact_top) { 211 q->forward_to(oop(compact_top)); 212 assert(q->is_gc_marked(), "encoding the pointer should preserve the mark"); 213 } else { 214 // if the object isn't moving we can just set the mark to the default 215 // mark and handle it specially later on. 216 q->init_mark(); 217 assert(q->forwardee() == NULL, "should be forwarded to NULL"); 218 } 219 220 compact_top += adjusted_size; 221 222 // we need to update the offset table so that the beginnings of objects can be 223 // found during scavenge. Note that we are updating the offset table based on 224 // where the object will be once the compaction phase finishes. 225 226 // Always call cross_threshold(). A contiguous space can only call it when 227 // the compaction_top exceeds the current threshold but not for an 228 // non-contiguous space. 229 cp->threshold = 230 cp->space->cross_threshold(compact_top - adjusted_size, compact_top); 231 return compact_top; 232 } 233 234 // A modified copy of OffsetTableContigSpace::cross_threshold() with _offsets -> _bt 235 // and use of single_block instead of alloc_block. The name here is not really 236 // appropriate - maybe a more general name could be invented for both the 237 // contiguous and noncontiguous spaces. 238 239 HeapWord* CompactibleFreeListSpace::cross_threshold(HeapWord* start, HeapWord* the_end) { 240 _bt.single_block(start, the_end); 241 return end(); 242 } 243 244 // Initialize them to NULL. 245 void CompactibleFreeListSpace::initializeIndexedFreeListArray() { 246 for (size_t i = 0; i < IndexSetSize; i++) { 247 // Note that on platforms where objects are double word aligned, 248 // the odd array elements are not used. It is convenient, however, 249 // to map directly from the object size to the array element. 250 _indexedFreeList[i].reset(IndexSetSize); 251 _indexedFreeList[i].set_size(i); 252 assert(_indexedFreeList[i].count() == 0, "reset check failed"); 253 assert(_indexedFreeList[i].head() == NULL, "reset check failed"); 254 assert(_indexedFreeList[i].tail() == NULL, "reset check failed"); 255 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed"); 256 } 257 } 258 259 void CompactibleFreeListSpace::resetIndexedFreeListArray() { 260 for (size_t i = 1; i < IndexSetSize; i++) { 261 assert(_indexedFreeList[i].size() == (size_t) i, 262 "Indexed free list sizes are incorrect"); 263 _indexedFreeList[i].reset(IndexSetSize); 264 assert(_indexedFreeList[i].count() == 0, "reset check failed"); 265 assert(_indexedFreeList[i].head() == NULL, "reset check failed"); 266 assert(_indexedFreeList[i].tail() == NULL, "reset check failed"); 267 assert(_indexedFreeList[i].hint() == IndexSetSize, "reset check failed"); 268 } 269 } 270 271 void CompactibleFreeListSpace::reset(MemRegion mr) { 272 resetIndexedFreeListArray(); 273 dictionary()->reset(); 274 if (BlockOffsetArrayUseUnallocatedBlock) { 275 assert(end() == mr.end(), "We are compacting to the bottom of CMS gen"); 276 // Everything's allocated until proven otherwise. 277 _bt.set_unallocated_block(end()); 278 } 279 if (!mr.is_empty()) { 280 assert(mr.word_size() >= MinChunkSize, "Chunk size is too small"); 281 _bt.single_block(mr.start(), mr.word_size()); 282 FreeChunk* fc = (FreeChunk*) mr.start(); 283 fc->set_size(mr.word_size()); 284 if (mr.word_size() >= IndexSetSize ) { 285 returnChunkToDictionary(fc); 286 } else { 287 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 288 _indexedFreeList[mr.word_size()].return_chunk_at_head(fc); 289 } 290 coalBirth(mr.word_size()); 291 } 292 _promoInfo.reset(); 293 _smallLinearAllocBlock._ptr = NULL; 294 _smallLinearAllocBlock._word_size = 0; 295 } 296 297 void CompactibleFreeListSpace::reset_after_compaction() { 298 // Reset the space to the new reality - one free chunk. 299 MemRegion mr(compaction_top(), end()); 300 reset(mr); 301 // Now refill the linear allocation block(s) if possible. 302 if (_adaptive_freelists) { 303 refillLinearAllocBlocksIfNeeded(); 304 } else { 305 // Place as much of mr in the linAB as we can get, 306 // provided it was big enough to go into the dictionary. 307 FreeChunk* fc = dictionary()->find_largest_dict(); 308 if (fc != NULL) { 309 assert(fc->size() == mr.word_size(), 310 "Why was the chunk broken up?"); 311 removeChunkFromDictionary(fc); 312 HeapWord* addr = (HeapWord*) fc; 313 _smallLinearAllocBlock.set(addr, fc->size() , 314 1024*SmallForLinearAlloc, fc->size()); 315 // Note that _unallocated_block is not updated here. 316 } 317 } 318 } 319 320 // Walks the entire dictionary, returning a coterminal 321 // chunk, if it exists. Use with caution since it involves 322 // a potentially complete walk of a potentially large tree. 323 FreeChunk* CompactibleFreeListSpace::find_chunk_at_end() { 324 325 assert_lock_strong(&_freelistLock); 326 327 return dictionary()->find_chunk_ends_at(end()); 328 } 329 330 331 #ifndef PRODUCT 332 void CompactibleFreeListSpace::initializeIndexedFreeListArrayReturnedBytes() { 333 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 334 _indexedFreeList[i].allocation_stats()->set_returned_bytes(0); 335 } 336 } 337 338 size_t CompactibleFreeListSpace::sumIndexedFreeListArrayReturnedBytes() { 339 size_t sum = 0; 340 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 341 sum += _indexedFreeList[i].allocation_stats()->returned_bytes(); 342 } 343 return sum; 344 } 345 346 size_t CompactibleFreeListSpace::totalCountInIndexedFreeLists() const { 347 size_t count = 0; 348 for (size_t i = IndexSetStart; i < IndexSetSize; i++) { 349 debug_only( 350 ssize_t total_list_count = 0; 351 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 352 fc = fc->next()) { 353 total_list_count++; 354 } 355 assert(total_list_count == _indexedFreeList[i].count(), 356 "Count in list is incorrect"); 357 ) 358 count += _indexedFreeList[i].count(); 359 } 360 return count; 361 } 362 363 size_t CompactibleFreeListSpace::totalCount() { 364 size_t num = totalCountInIndexedFreeLists(); 365 num += dictionary()->total_count(); 366 if (_smallLinearAllocBlock._word_size != 0) { 367 num++; 368 } 369 return num; 370 } 371 #endif 372 373 bool CompactibleFreeListSpace::is_free_block(const HeapWord* p) const { 374 FreeChunk* fc = (FreeChunk*) p; 375 return fc->is_free(); 376 } 377 378 size_t CompactibleFreeListSpace::used() const { 379 return capacity() - free(); 380 } 381 382 size_t CompactibleFreeListSpace::used_stable() const { 383 return _used_stable; 384 } 385 386 void CompactibleFreeListSpace::recalculate_used_stable() { 387 _used_stable = used(); 388 } 389 390 size_t CompactibleFreeListSpace::free() const { 391 // "MT-safe, but not MT-precise"(TM), if you will: i.e. 392 // if you do this while the structures are in flux you 393 // may get an approximate answer only; for instance 394 // because there is concurrent allocation either 395 // directly by mutators or for promotion during a GC. 396 // It's "MT-safe", however, in the sense that you are guaranteed 397 // not to crash and burn, for instance, because of walking 398 // pointers that could disappear as you were walking them. 399 // The approximation is because the various components 400 // that are read below are not read atomically (and 401 // further the computation of totalSizeInIndexedFreeLists() 402 // is itself a non-atomic computation. The normal use of 403 // this is during a resize operation at the end of GC 404 // and at that time you are guaranteed to get the 405 // correct actual value. However, for instance, this is 406 // also read completely asynchronously by the "perf-sampler" 407 // that supports jvmstat, and you are apt to see the values 408 // flicker in such cases. 409 assert(_dictionary != NULL, "No _dictionary?"); 410 return (_dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())) + 411 totalSizeInIndexedFreeLists() + 412 _smallLinearAllocBlock._word_size) * HeapWordSize; 413 } 414 415 size_t CompactibleFreeListSpace::max_alloc_in_words() const { 416 assert(_dictionary != NULL, "No _dictionary?"); 417 assert_locked(); 418 size_t res = _dictionary->max_chunk_size(); 419 res = MAX2(res, MIN2(_smallLinearAllocBlock._word_size, 420 (size_t) SmallForLinearAlloc - 1)); 421 // XXX the following could potentially be pretty slow; 422 // should one, pesimally for the rare cases when res 423 // caclulated above is less than IndexSetSize, 424 // just return res calculated above? My reasoning was that 425 // those cases will be so rare that the extra time spent doesn't 426 // really matter.... 427 // Note: do not change the loop test i >= res + IndexSetStride 428 // to i > res below, because i is unsigned and res may be zero. 429 for (size_t i = IndexSetSize - 1; i >= res + IndexSetStride; 430 i -= IndexSetStride) { 431 if (_indexedFreeList[i].head() != NULL) { 432 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList"); 433 return i; 434 } 435 } 436 return res; 437 } 438 439 void LinearAllocBlock::print_on(outputStream* st) const { 440 st->print_cr(" LinearAllocBlock: ptr = " PTR_FORMAT ", word_size = " SIZE_FORMAT 441 ", refillsize = " SIZE_FORMAT ", allocation_size_limit = " SIZE_FORMAT, 442 p2i(_ptr), _word_size, _refillSize, _allocation_size_limit); 443 } 444 445 void CompactibleFreeListSpace::print_on(outputStream* st) const { 446 st->print_cr("COMPACTIBLE FREELIST SPACE"); 447 st->print_cr(" Space:"); 448 Space::print_on(st); 449 450 st->print_cr("promoInfo:"); 451 _promoInfo.print_on(st); 452 453 st->print_cr("_smallLinearAllocBlock"); 454 _smallLinearAllocBlock.print_on(st); 455 456 // dump_memory_block(_smallLinearAllocBlock->_ptr, 128); 457 458 st->print_cr(" _fitStrategy = %s, _adaptive_freelists = %s", 459 _fitStrategy?"true":"false", _adaptive_freelists?"true":"false"); 460 } 461 462 void CompactibleFreeListSpace::print_indexed_free_lists(outputStream* st) 463 const { 464 reportIndexedFreeListStatistics(); 465 gclog_or_tty->print_cr("Layout of Indexed Freelists"); 466 gclog_or_tty->print_cr("---------------------------"); 467 AdaptiveFreeList<FreeChunk>::print_labels_on(st, "size"); 468 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 469 _indexedFreeList[i].print_on(gclog_or_tty); 470 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 471 fc = fc->next()) { 472 gclog_or_tty->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", 473 p2i(fc), p2i((HeapWord*)fc + i), 474 fc->cantCoalesce() ? "\t CC" : ""); 475 } 476 } 477 } 478 479 void CompactibleFreeListSpace::print_promo_info_blocks(outputStream* st) 480 const { 481 _promoInfo.print_on(st); 482 } 483 484 void CompactibleFreeListSpace::print_dictionary_free_lists(outputStream* st) 485 const { 486 _dictionary->report_statistics(); 487 st->print_cr("Layout of Freelists in Tree"); 488 st->print_cr("---------------------------"); 489 _dictionary->print_free_lists(st); 490 } 491 492 class BlkPrintingClosure: public BlkClosure { 493 const CMSCollector* _collector; 494 const CompactibleFreeListSpace* _sp; 495 const CMSBitMap* _live_bit_map; 496 const bool _post_remark; 497 outputStream* _st; 498 public: 499 BlkPrintingClosure(const CMSCollector* collector, 500 const CompactibleFreeListSpace* sp, 501 const CMSBitMap* live_bit_map, 502 outputStream* st): 503 _collector(collector), 504 _sp(sp), 505 _live_bit_map(live_bit_map), 506 _post_remark(collector->abstract_state() > CMSCollector::FinalMarking), 507 _st(st) { } 508 size_t do_blk(HeapWord* addr); 509 }; 510 511 size_t BlkPrintingClosure::do_blk(HeapWord* addr) { 512 size_t sz = _sp->block_size_no_stall(addr, _collector); 513 assert(sz != 0, "Should always be able to compute a size"); 514 if (_sp->block_is_obj(addr)) { 515 const bool dead = _post_remark && !_live_bit_map->isMarked(addr); 516 _st->print_cr(PTR_FORMAT ": %s object of size " SIZE_FORMAT "%s", 517 p2i(addr), 518 dead ? "dead" : "live", 519 sz, 520 (!dead && CMSPrintObjectsInDump) ? ":" : "."); 521 if (CMSPrintObjectsInDump && !dead) { 522 oop(addr)->print_on(_st); 523 _st->print_cr("--------------------------------------"); 524 } 525 } else { // free block 526 _st->print_cr(PTR_FORMAT ": free block of size " SIZE_FORMAT "%s", 527 p2i(addr), sz, CMSPrintChunksInDump ? ":" : "."); 528 if (CMSPrintChunksInDump) { 529 ((FreeChunk*)addr)->print_on(_st); 530 _st->print_cr("--------------------------------------"); 531 } 532 } 533 return sz; 534 } 535 536 void CompactibleFreeListSpace::dump_at_safepoint_with_locks(CMSCollector* c, 537 outputStream* st) { 538 st->print_cr("\n========================="); 539 st->print_cr("Block layout in CMS Heap:"); 540 st->print_cr("========================="); 541 BlkPrintingClosure bpcl(c, this, c->markBitMap(), st); 542 blk_iterate(&bpcl); 543 544 st->print_cr("\n======================================="); 545 st->print_cr("Order & Layout of Promotion Info Blocks"); 546 st->print_cr("======================================="); 547 print_promo_info_blocks(st); 548 549 st->print_cr("\n==========================="); 550 st->print_cr("Order of Indexed Free Lists"); 551 st->print_cr("========================="); 552 print_indexed_free_lists(st); 553 554 st->print_cr("\n================================="); 555 st->print_cr("Order of Free Lists in Dictionary"); 556 st->print_cr("================================="); 557 print_dictionary_free_lists(st); 558 } 559 560 561 void CompactibleFreeListSpace::reportFreeListStatistics() const { 562 assert_lock_strong(&_freelistLock); 563 assert(PrintFLSStatistics != 0, "Reporting error"); 564 _dictionary->report_statistics(); 565 if (PrintFLSStatistics > 1) { 566 reportIndexedFreeListStatistics(); 567 size_t total_size = totalSizeInIndexedFreeLists() + 568 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); 569 gclog_or_tty->print(" free=" SIZE_FORMAT " frag=%1.4f\n", total_size, flsFrag()); 570 } 571 } 572 573 void CompactibleFreeListSpace::reportIndexedFreeListStatistics() const { 574 assert_lock_strong(&_freelistLock); 575 gclog_or_tty->print("Statistics for IndexedFreeLists:\n" 576 "--------------------------------\n"); 577 size_t total_size = totalSizeInIndexedFreeLists(); 578 size_t free_blocks = numFreeBlocksInIndexedFreeLists(); 579 gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size); 580 gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", maxChunkSizeInIndexedFreeLists()); 581 gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks); 582 if (free_blocks != 0) { 583 gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks); 584 } 585 } 586 587 size_t CompactibleFreeListSpace::numFreeBlocksInIndexedFreeLists() const { 588 size_t res = 0; 589 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 590 debug_only( 591 ssize_t recount = 0; 592 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 593 fc = fc->next()) { 594 recount += 1; 595 } 596 assert(recount == _indexedFreeList[i].count(), 597 "Incorrect count in list"); 598 ) 599 res += _indexedFreeList[i].count(); 600 } 601 return res; 602 } 603 604 size_t CompactibleFreeListSpace::maxChunkSizeInIndexedFreeLists() const { 605 for (size_t i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { 606 if (_indexedFreeList[i].head() != NULL) { 607 assert(_indexedFreeList[i].count() != 0, "Inconsistent FreeList"); 608 return (size_t)i; 609 } 610 } 611 return 0; 612 } 613 614 void CompactibleFreeListSpace::set_end(HeapWord* value) { 615 HeapWord* prevEnd = end(); 616 assert(prevEnd != value, "unnecessary set_end call"); 617 assert(prevEnd == NULL || !BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(), 618 "New end is below unallocated block"); 619 _end = value; 620 if (prevEnd != NULL) { 621 // Resize the underlying block offset table. 622 _bt.resize(pointer_delta(value, bottom())); 623 if (value <= prevEnd) { 624 assert(!BlockOffsetArrayUseUnallocatedBlock || value >= unallocated_block(), 625 "New end is below unallocated block"); 626 } else { 627 // Now, take this new chunk and add it to the free blocks. 628 // Note that the BOT has not yet been updated for this block. 629 size_t newFcSize = pointer_delta(value, prevEnd); 630 // XXX This is REALLY UGLY and should be fixed up. XXX 631 if (!_adaptive_freelists && _smallLinearAllocBlock._ptr == NULL) { 632 // Mark the boundary of the new block in BOT 633 _bt.mark_block(prevEnd, value); 634 // put it all in the linAB 635 if (ParallelGCThreads == 0) { 636 _smallLinearAllocBlock._ptr = prevEnd; 637 _smallLinearAllocBlock._word_size = newFcSize; 638 repairLinearAllocBlock(&_smallLinearAllocBlock); 639 } else { // ParallelGCThreads > 0 640 MutexLockerEx x(parDictionaryAllocLock(), 641 Mutex::_no_safepoint_check_flag); 642 _smallLinearAllocBlock._ptr = prevEnd; 643 _smallLinearAllocBlock._word_size = newFcSize; 644 repairLinearAllocBlock(&_smallLinearAllocBlock); 645 } 646 // Births of chunks put into a LinAB are not recorded. Births 647 // of chunks as they are allocated out of a LinAB are. 648 } else { 649 // Add the block to the free lists, if possible coalescing it 650 // with the last free block, and update the BOT and census data. 651 addChunkToFreeListsAtEndRecordingStats(prevEnd, newFcSize); 652 } 653 } 654 } 655 } 656 657 class FreeListSpace_DCTOC : public Filtering_DCTOC { 658 CompactibleFreeListSpace* _cfls; 659 CMSCollector* _collector; 660 protected: 661 // Override. 662 #define walk_mem_region_with_cl_DECL(ClosureType) \ 663 virtual void walk_mem_region_with_cl(MemRegion mr, \ 664 HeapWord* bottom, HeapWord* top, \ 665 ClosureType* cl); \ 666 void walk_mem_region_with_cl_par(MemRegion mr, \ 667 HeapWord* bottom, HeapWord* top, \ 668 ClosureType* cl); \ 669 void walk_mem_region_with_cl_nopar(MemRegion mr, \ 670 HeapWord* bottom, HeapWord* top, \ 671 ClosureType* cl) 672 walk_mem_region_with_cl_DECL(ExtendedOopClosure); 673 walk_mem_region_with_cl_DECL(FilteringClosure); 674 675 public: 676 FreeListSpace_DCTOC(CompactibleFreeListSpace* sp, 677 CMSCollector* collector, 678 ExtendedOopClosure* cl, 679 CardTableModRefBS::PrecisionStyle precision, 680 HeapWord* boundary) : 681 Filtering_DCTOC(sp, cl, precision, boundary), 682 _cfls(sp), _collector(collector) {} 683 }; 684 685 // We de-virtualize the block-related calls below, since we know that our 686 // space is a CompactibleFreeListSpace. 687 688 #define FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ClosureType) \ 689 void FreeListSpace_DCTOC::walk_mem_region_with_cl(MemRegion mr, \ 690 HeapWord* bottom, \ 691 HeapWord* top, \ 692 ClosureType* cl) { \ 693 bool is_par = SharedHeap::heap()->n_par_threads() > 0; \ 694 if (is_par) { \ 695 assert(SharedHeap::heap()->n_par_threads() == \ 696 SharedHeap::heap()->workers()->active_workers(), "Mismatch"); \ 697 walk_mem_region_with_cl_par(mr, bottom, top, cl); \ 698 } else { \ 699 walk_mem_region_with_cl_nopar(mr, bottom, top, cl); \ 700 } \ 701 } \ 702 void FreeListSpace_DCTOC::walk_mem_region_with_cl_par(MemRegion mr, \ 703 HeapWord* bottom, \ 704 HeapWord* top, \ 705 ClosureType* cl) { \ 706 /* Skip parts that are before "mr", in case "block_start" sent us \ 707 back too far. */ \ 708 HeapWord* mr_start = mr.start(); \ 709 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \ 710 HeapWord* next = bottom + bot_size; \ 711 while (next < mr_start) { \ 712 bottom = next; \ 713 bot_size = _cfls->CompactibleFreeListSpace::block_size(bottom); \ 714 next = bottom + bot_size; \ 715 } \ 716 \ 717 while (bottom < top) { \ 718 if (_cfls->CompactibleFreeListSpace::block_is_obj(bottom) && \ 719 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \ 720 oop(bottom)) && \ 721 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \ 722 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \ 723 bottom += _cfls->adjustObjectSize(word_sz); \ 724 } else { \ 725 bottom += _cfls->CompactibleFreeListSpace::block_size(bottom); \ 726 } \ 727 } \ 728 } \ 729 void FreeListSpace_DCTOC::walk_mem_region_with_cl_nopar(MemRegion mr, \ 730 HeapWord* bottom, \ 731 HeapWord* top, \ 732 ClosureType* cl) { \ 733 /* Skip parts that are before "mr", in case "block_start" sent us \ 734 back too far. */ \ 735 HeapWord* mr_start = mr.start(); \ 736 size_t bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 737 HeapWord* next = bottom + bot_size; \ 738 while (next < mr_start) { \ 739 bottom = next; \ 740 bot_size = _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 741 next = bottom + bot_size; \ 742 } \ 743 \ 744 while (bottom < top) { \ 745 if (_cfls->CompactibleFreeListSpace::block_is_obj_nopar(bottom) && \ 746 !_cfls->CompactibleFreeListSpace::obj_allocated_since_save_marks( \ 747 oop(bottom)) && \ 748 !_collector->CMSCollector::is_dead_obj(oop(bottom))) { \ 749 size_t word_sz = oop(bottom)->oop_iterate(cl, mr); \ 750 bottom += _cfls->adjustObjectSize(word_sz); \ 751 } else { \ 752 bottom += _cfls->CompactibleFreeListSpace::block_size_nopar(bottom); \ 753 } \ 754 } \ 755 } 756 757 // (There are only two of these, rather than N, because the split is due 758 // only to the introduction of the FilteringClosure, a local part of the 759 // impl of this abstraction.) 760 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(ExtendedOopClosure) 761 FreeListSpace_DCTOC__walk_mem_region_with_cl_DEFN(FilteringClosure) 762 763 DirtyCardToOopClosure* 764 CompactibleFreeListSpace::new_dcto_cl(ExtendedOopClosure* cl, 765 CardTableModRefBS::PrecisionStyle precision, 766 HeapWord* boundary) { 767 return new FreeListSpace_DCTOC(this, _collector, cl, precision, boundary); 768 } 769 770 771 // Note on locking for the space iteration functions: 772 // since the collector's iteration activities are concurrent with 773 // allocation activities by mutators, absent a suitable mutual exclusion 774 // mechanism the iterators may go awry. For instace a block being iterated 775 // may suddenly be allocated or divided up and part of it allocated and 776 // so on. 777 778 // Apply the given closure to each block in the space. 779 void CompactibleFreeListSpace::blk_iterate_careful(BlkClosureCareful* cl) { 780 assert_lock_strong(freelistLock()); 781 HeapWord *cur, *limit; 782 for (cur = bottom(), limit = end(); cur < limit; 783 cur += cl->do_blk_careful(cur)); 784 } 785 786 // Apply the given closure to each block in the space. 787 void CompactibleFreeListSpace::blk_iterate(BlkClosure* cl) { 788 assert_lock_strong(freelistLock()); 789 HeapWord *cur, *limit; 790 for (cur = bottom(), limit = end(); cur < limit; 791 cur += cl->do_blk(cur)); 792 } 793 794 // Apply the given closure to each oop in the space. 795 void CompactibleFreeListSpace::oop_iterate(ExtendedOopClosure* cl) { 796 assert_lock_strong(freelistLock()); 797 HeapWord *cur, *limit; 798 size_t curSize; 799 for (cur = bottom(), limit = end(); cur < limit; 800 cur += curSize) { 801 curSize = block_size(cur); 802 if (block_is_obj(cur)) { 803 oop(cur)->oop_iterate(cl); 804 } 805 } 806 } 807 808 // NOTE: In the following methods, in order to safely be able to 809 // apply the closure to an object, we need to be sure that the 810 // object has been initialized. We are guaranteed that an object 811 // is initialized if we are holding the Heap_lock with the 812 // world stopped. 813 void CompactibleFreeListSpace::verify_objects_initialized() const { 814 if (is_init_completed()) { 815 assert_locked_or_safepoint(Heap_lock); 816 if (Universe::is_fully_initialized()) { 817 guarantee(SafepointSynchronize::is_at_safepoint(), 818 "Required for objects to be initialized"); 819 } 820 } // else make a concession at vm start-up 821 } 822 823 // Apply the given closure to each object in the space 824 void CompactibleFreeListSpace::object_iterate(ObjectClosure* blk) { 825 assert_lock_strong(freelistLock()); 826 NOT_PRODUCT(verify_objects_initialized()); 827 HeapWord *cur, *limit; 828 size_t curSize; 829 for (cur = bottom(), limit = end(); cur < limit; 830 cur += curSize) { 831 curSize = block_size(cur); 832 if (block_is_obj(cur)) { 833 blk->do_object(oop(cur)); 834 } 835 } 836 } 837 838 // Apply the given closure to each live object in the space 839 // The usage of CompactibleFreeListSpace 840 // by the ConcurrentMarkSweepGeneration for concurrent GC's allows 841 // objects in the space with references to objects that are no longer 842 // valid. For example, an object may reference another object 843 // that has already been sweep up (collected). This method uses 844 // obj_is_alive() to determine whether it is safe to apply the closure to 845 // an object. See obj_is_alive() for details on how liveness of an 846 // object is decided. 847 848 void CompactibleFreeListSpace::safe_object_iterate(ObjectClosure* blk) { 849 assert_lock_strong(freelistLock()); 850 NOT_PRODUCT(verify_objects_initialized()); 851 HeapWord *cur, *limit; 852 size_t curSize; 853 for (cur = bottom(), limit = end(); cur < limit; 854 cur += curSize) { 855 curSize = block_size(cur); 856 if (block_is_obj(cur) && obj_is_alive(cur)) { 857 blk->do_object(oop(cur)); 858 } 859 } 860 } 861 862 void CompactibleFreeListSpace::object_iterate_mem(MemRegion mr, 863 UpwardsObjectClosure* cl) { 864 assert_locked(freelistLock()); 865 NOT_PRODUCT(verify_objects_initialized()); 866 assert(!mr.is_empty(), "Should be non-empty"); 867 // We use MemRegion(bottom(), end()) rather than used_region() below 868 // because the two are not necessarily equal for some kinds of 869 // spaces, in particular, certain kinds of free list spaces. 870 // We could use the more complicated but more precise: 871 // MemRegion(used_region().start(), round_to(used_region().end(), CardSize)) 872 // but the slight imprecision seems acceptable in the assertion check. 873 assert(MemRegion(bottom(), end()).contains(mr), 874 "Should be within used space"); 875 HeapWord* prev = cl->previous(); // max address from last time 876 if (prev >= mr.end()) { // nothing to do 877 return; 878 } 879 // This assert will not work when we go from cms space to perm 880 // space, and use same closure. Easy fix deferred for later. XXX YSR 881 // assert(prev == NULL || contains(prev), "Should be within space"); 882 883 bool last_was_obj_array = false; 884 HeapWord *blk_start_addr, *region_start_addr; 885 if (prev > mr.start()) { 886 region_start_addr = prev; 887 blk_start_addr = prev; 888 // The previous invocation may have pushed "prev" beyond the 889 // last allocated block yet there may be still be blocks 890 // in this region due to a particular coalescing policy. 891 // Relax the assertion so that the case where the unallocated 892 // block is maintained and "prev" is beyond the unallocated 893 // block does not cause the assertion to fire. 894 assert((BlockOffsetArrayUseUnallocatedBlock && 895 (!is_in(prev))) || 896 (blk_start_addr == block_start(region_start_addr)), "invariant"); 897 } else { 898 region_start_addr = mr.start(); 899 blk_start_addr = block_start(region_start_addr); 900 } 901 HeapWord* region_end_addr = mr.end(); 902 MemRegion derived_mr(region_start_addr, region_end_addr); 903 while (blk_start_addr < region_end_addr) { 904 const size_t size = block_size(blk_start_addr); 905 if (block_is_obj(blk_start_addr)) { 906 last_was_obj_array = cl->do_object_bm(oop(blk_start_addr), derived_mr); 907 } else { 908 last_was_obj_array = false; 909 } 910 blk_start_addr += size; 911 } 912 if (!last_was_obj_array) { 913 assert((bottom() <= blk_start_addr) && (blk_start_addr <= end()), 914 "Should be within (closed) used space"); 915 assert(blk_start_addr > prev, "Invariant"); 916 cl->set_previous(blk_start_addr); // min address for next time 917 } 918 } 919 920 921 // Callers of this iterator beware: The closure application should 922 // be robust in the face of uninitialized objects and should (always) 923 // return a correct size so that the next addr + size below gives us a 924 // valid block boundary. [See for instance, 925 // ScanMarkedObjectsAgainCarefullyClosure::do_object_careful() 926 // in ConcurrentMarkSweepGeneration.cpp.] 927 HeapWord* 928 CompactibleFreeListSpace::object_iterate_careful_m(MemRegion mr, 929 ObjectClosureCareful* cl) { 930 assert_lock_strong(freelistLock()); 931 // Can't use used_region() below because it may not necessarily 932 // be the same as [bottom(),end()); although we could 933 // use [used_region().start(),round_to(used_region().end(),CardSize)), 934 // that appears too cumbersome, so we just do the simpler check 935 // in the assertion below. 936 assert(!mr.is_empty() && MemRegion(bottom(),end()).contains(mr), 937 "mr should be non-empty and within used space"); 938 HeapWord *addr, *end; 939 size_t size; 940 for (addr = block_start_careful(mr.start()), end = mr.end(); 941 addr < end; addr += size) { 942 FreeChunk* fc = (FreeChunk*)addr; 943 if (fc->is_free()) { 944 // Since we hold the free list lock, which protects direct 945 // allocation in this generation by mutators, a free object 946 // will remain free throughout this iteration code. 947 size = fc->size(); 948 } else { 949 // Note that the object need not necessarily be initialized, 950 // because (for instance) the free list lock does NOT protect 951 // object initialization. The closure application below must 952 // therefore be correct in the face of uninitialized objects. 953 size = cl->do_object_careful_m(oop(addr), mr); 954 if (size == 0) { 955 // An unparsable object found. Signal early termination. 956 return addr; 957 } 958 } 959 } 960 return NULL; 961 } 962 963 964 HeapWord* CompactibleFreeListSpace::block_start_const(const void* p) const { 965 NOT_PRODUCT(verify_objects_initialized()); 966 return _bt.block_start(p); 967 } 968 969 HeapWord* CompactibleFreeListSpace::block_start_careful(const void* p) const { 970 return _bt.block_start_careful(p); 971 } 972 973 size_t CompactibleFreeListSpace::block_size(const HeapWord* p) const { 974 NOT_PRODUCT(verify_objects_initialized()); 975 // This must be volatile, or else there is a danger that the compiler 976 // will compile the code below into a sometimes-infinite loop, by keeping 977 // the value read the first time in a register. 978 while (true) { 979 // We must do this until we get a consistent view of the object. 980 if (FreeChunk::indicatesFreeChunk(p)) { 981 volatile FreeChunk* fc = (volatile FreeChunk*)p; 982 size_t res = fc->size(); 983 984 // Bugfix for systems with weak memory model (PPC64/IA64). The 985 // block's free bit was set and we have read the size of the 986 // block. Acquire and check the free bit again. If the block is 987 // still free, the read size is correct. 988 OrderAccess::acquire(); 989 990 // If the object is still a free chunk, return the size, else it 991 // has been allocated so try again. 992 if (FreeChunk::indicatesFreeChunk(p)) { 993 assert(res != 0, "Block size should not be 0"); 994 return res; 995 } 996 } else { 997 // must read from what 'p' points to in each loop. 998 Klass* k = ((volatile oopDesc*)p)->klass_or_null(); 999 if (k != NULL) { 1000 assert(k->is_klass(), "Should really be klass oop."); 1001 oop o = (oop)p; 1002 assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); 1003 1004 // Bugfix for systems with weak memory model (PPC64/IA64). 1005 // The object o may be an array. Acquire to make sure that the array 1006 // size (third word) is consistent. 1007 OrderAccess::acquire(); 1008 1009 size_t res = o->size_given_klass(k); 1010 res = adjustObjectSize(res); 1011 assert(res != 0, "Block size should not be 0"); 1012 return res; 1013 } 1014 } 1015 } 1016 } 1017 1018 // TODO: Now that is_parsable is gone, we should combine these two functions. 1019 // A variant of the above that uses the Printezis bits for 1020 // unparsable but allocated objects. This avoids any possible 1021 // stalls waiting for mutators to initialize objects, and is 1022 // thus potentially faster than the variant above. However, 1023 // this variant may return a zero size for a block that is 1024 // under mutation and for which a consistent size cannot be 1025 // inferred without stalling; see CMSCollector::block_size_if_printezis_bits(). 1026 size_t CompactibleFreeListSpace::block_size_no_stall(HeapWord* p, 1027 const CMSCollector* c) 1028 const { 1029 assert(MemRegion(bottom(), end()).contains(p), "p not in space"); 1030 // This must be volatile, or else there is a danger that the compiler 1031 // will compile the code below into a sometimes-infinite loop, by keeping 1032 // the value read the first time in a register. 1033 DEBUG_ONLY(uint loops = 0;) 1034 while (true) { 1035 // We must do this until we get a consistent view of the object. 1036 if (FreeChunk::indicatesFreeChunk(p)) { 1037 volatile FreeChunk* fc = (volatile FreeChunk*)p; 1038 size_t res = fc->size(); 1039 1040 // Bugfix for systems with weak memory model (PPC64/IA64). The 1041 // free bit of the block was set and we have read the size of 1042 // the block. Acquire and check the free bit again. If the 1043 // block is still free, the read size is correct. 1044 OrderAccess::acquire(); 1045 1046 if (FreeChunk::indicatesFreeChunk(p)) { 1047 assert(res != 0, "Block size should not be 0"); 1048 assert(loops == 0, "Should be 0"); 1049 return res; 1050 } 1051 } else { 1052 // must read from what 'p' points to in each loop. 1053 Klass* k = ((volatile oopDesc*)p)->klass_or_null(); 1054 // We trust the size of any object that has a non-NULL 1055 // klass and (for those in the perm gen) is parsable 1056 // -- irrespective of its conc_safe-ty. 1057 if (k != NULL) { 1058 assert(k->is_klass(), "Should really be klass oop."); 1059 oop o = (oop)p; 1060 assert(o->is_oop(), "Should be an oop"); 1061 1062 // Bugfix for systems with weak memory model (PPC64/IA64). 1063 // The object o may be an array. Acquire to make sure that the array 1064 // size (third word) is consistent. 1065 OrderAccess::acquire(); 1066 1067 size_t res = o->size_given_klass(k); 1068 res = adjustObjectSize(res); 1069 assert(res != 0, "Block size should not be 0"); 1070 return res; 1071 } else { 1072 // May return 0 if P-bits not present. 1073 return c->block_size_if_printezis_bits(p); 1074 } 1075 } 1076 assert(loops == 0, "Can loop at most once"); 1077 DEBUG_ONLY(loops++;) 1078 } 1079 } 1080 1081 size_t CompactibleFreeListSpace::block_size_nopar(const HeapWord* p) const { 1082 NOT_PRODUCT(verify_objects_initialized()); 1083 assert(MemRegion(bottom(), end()).contains(p), "p not in space"); 1084 FreeChunk* fc = (FreeChunk*)p; 1085 if (fc->is_free()) { 1086 return fc->size(); 1087 } else { 1088 // Ignore mark word because this may be a recently promoted 1089 // object whose mark word is used to chain together grey 1090 // objects (the last one would have a null value). 1091 assert(oop(p)->is_oop(true), "Should be an oop"); 1092 return adjustObjectSize(oop(p)->size()); 1093 } 1094 } 1095 1096 // This implementation assumes that the property of "being an object" is 1097 // stable. But being a free chunk may not be (because of parallel 1098 // promotion.) 1099 bool CompactibleFreeListSpace::block_is_obj(const HeapWord* p) const { 1100 FreeChunk* fc = (FreeChunk*)p; 1101 assert(is_in_reserved(p), "Should be in space"); 1102 // When doing a mark-sweep-compact of the CMS generation, this 1103 // assertion may fail because prepare_for_compaction() uses 1104 // space that is garbage to maintain information on ranges of 1105 // live objects so that these live ranges can be moved as a whole. 1106 // Comment out this assertion until that problem can be solved 1107 // (i.e., that the block start calculation may look at objects 1108 // at address below "p" in finding the object that contains "p" 1109 // and those objects (if garbage) may have been modified to hold 1110 // live range information. 1111 // assert(CollectedHeap::use_parallel_gc_threads() || _bt.block_start(p) == p, 1112 // "Should be a block boundary"); 1113 if (FreeChunk::indicatesFreeChunk(p)) return false; 1114 Klass* k = oop(p)->klass_or_null(); 1115 if (k != NULL) { 1116 // Ignore mark word because it may have been used to 1117 // chain together promoted objects (the last one 1118 // would have a null value). 1119 assert(oop(p)->is_oop(true), "Should be an oop"); 1120 return true; 1121 } else { 1122 return false; // Was not an object at the start of collection. 1123 } 1124 } 1125 1126 // Check if the object is alive. This fact is checked either by consulting 1127 // the main marking bitmap in the sweeping phase or, if it's a permanent 1128 // generation and we're not in the sweeping phase, by checking the 1129 // perm_gen_verify_bit_map where we store the "deadness" information if 1130 // we did not sweep the perm gen in the most recent previous GC cycle. 1131 bool CompactibleFreeListSpace::obj_is_alive(const HeapWord* p) const { 1132 assert(SafepointSynchronize::is_at_safepoint() || !is_init_completed(), 1133 "Else races are possible"); 1134 assert(block_is_obj(p), "The address should point to an object"); 1135 1136 // If we're sweeping, we use object liveness information from the main bit map 1137 // for both perm gen and old gen. 1138 // We don't need to lock the bitmap (live_map or dead_map below), because 1139 // EITHER we are in the middle of the sweeping phase, and the 1140 // main marking bit map (live_map below) is locked, 1141 // OR we're in other phases and perm_gen_verify_bit_map (dead_map below) 1142 // is stable, because it's mutated only in the sweeping phase. 1143 // NOTE: This method is also used by jmap where, if class unloading is 1144 // off, the results can return "false" for legitimate perm objects, 1145 // when we are not in the midst of a sweeping phase, which can result 1146 // in jmap not reporting certain perm gen objects. This will be moot 1147 // if/when the perm gen goes away in the future. 1148 if (_collector->abstract_state() == CMSCollector::Sweeping) { 1149 CMSBitMap* live_map = _collector->markBitMap(); 1150 return live_map->par_isMarked((HeapWord*) p); 1151 } 1152 return true; 1153 } 1154 1155 bool CompactibleFreeListSpace::block_is_obj_nopar(const HeapWord* p) const { 1156 FreeChunk* fc = (FreeChunk*)p; 1157 assert(is_in_reserved(p), "Should be in space"); 1158 assert(_bt.block_start(p) == p, "Should be a block boundary"); 1159 if (!fc->is_free()) { 1160 // Ignore mark word because it may have been used to 1161 // chain together promoted objects (the last one 1162 // would have a null value). 1163 assert(oop(p)->is_oop(true), "Should be an oop"); 1164 return true; 1165 } 1166 return false; 1167 } 1168 1169 // "MT-safe but not guaranteed MT-precise" (TM); you may get an 1170 // approximate answer if you don't hold the freelistlock when you call this. 1171 size_t CompactibleFreeListSpace::totalSizeInIndexedFreeLists() const { 1172 size_t size = 0; 1173 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 1174 debug_only( 1175 // We may be calling here without the lock in which case we 1176 // won't do this modest sanity check. 1177 if (freelistLock()->owned_by_self()) { 1178 size_t total_list_size = 0; 1179 for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; 1180 fc = fc->next()) { 1181 total_list_size += i; 1182 } 1183 assert(total_list_size == i * _indexedFreeList[i].count(), 1184 "Count in list is incorrect"); 1185 } 1186 ) 1187 size += i * _indexedFreeList[i].count(); 1188 } 1189 return size; 1190 } 1191 1192 HeapWord* CompactibleFreeListSpace::par_allocate(size_t size) { 1193 MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); 1194 return allocate(size); 1195 } 1196 1197 HeapWord* 1198 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlockRemainder(size_t size) { 1199 return getChunkFromLinearAllocBlockRemainder(&_smallLinearAllocBlock, size); 1200 } 1201 1202 HeapWord* CompactibleFreeListSpace::allocate(size_t size) { 1203 assert_lock_strong(freelistLock()); 1204 HeapWord* res = NULL; 1205 assert(size == adjustObjectSize(size), 1206 "use adjustObjectSize() before calling into allocate()"); 1207 1208 if (_adaptive_freelists) { 1209 res = allocate_adaptive_freelists(size); 1210 } else { // non-adaptive free lists 1211 res = allocate_non_adaptive_freelists(size); 1212 } 1213 1214 if (res != NULL) { 1215 // check that res does lie in this space! 1216 assert(is_in_reserved(res), "Not in this space!"); 1217 assert(is_aligned((void*)res), "alignment check"); 1218 1219 FreeChunk* fc = (FreeChunk*)res; 1220 fc->markNotFree(); 1221 assert(!fc->is_free(), "shouldn't be marked free"); 1222 assert(oop(fc)->klass_or_null() == NULL, "should look uninitialized"); 1223 // Verify that the block offset table shows this to 1224 // be a single block, but not one which is unallocated. 1225 _bt.verify_single_block(res, size); 1226 _bt.verify_not_unallocated(res, size); 1227 // mangle a just allocated object with a distinct pattern. 1228 debug_only(fc->mangleAllocated(size)); 1229 } 1230 1231 // During GC we do not need to recalculate the stable used value for 1232 // every allocation in old gen. It is done once at the end of GC instead 1233 // for performance reasons. 1234 if (!Universe::heap()->is_gc_active()) { 1235 recalculate_used_stable(); 1236 } 1237 1238 return res; 1239 } 1240 1241 HeapWord* CompactibleFreeListSpace::allocate_non_adaptive_freelists(size_t size) { 1242 HeapWord* res = NULL; 1243 // try and use linear allocation for smaller blocks 1244 if (size < _smallLinearAllocBlock._allocation_size_limit) { 1245 // if successful, the following also adjusts block offset table 1246 res = getChunkFromSmallLinearAllocBlock(size); 1247 } 1248 // Else triage to indexed lists for smaller sizes 1249 if (res == NULL) { 1250 if (size < SmallForDictionary) { 1251 res = (HeapWord*) getChunkFromIndexedFreeList(size); 1252 } else { 1253 // else get it from the big dictionary; if even this doesn't 1254 // work we are out of luck. 1255 res = (HeapWord*)getChunkFromDictionaryExact(size); 1256 } 1257 } 1258 1259 return res; 1260 } 1261 1262 HeapWord* CompactibleFreeListSpace::allocate_adaptive_freelists(size_t size) { 1263 assert_lock_strong(freelistLock()); 1264 HeapWord* res = NULL; 1265 assert(size == adjustObjectSize(size), 1266 "use adjustObjectSize() before calling into allocate()"); 1267 1268 // Strategy 1269 // if small 1270 // exact size from small object indexed list if small 1271 // small or large linear allocation block (linAB) as appropriate 1272 // take from lists of greater sized chunks 1273 // else 1274 // dictionary 1275 // small or large linear allocation block if it has the space 1276 // Try allocating exact size from indexTable first 1277 if (size < IndexSetSize) { 1278 res = (HeapWord*) getChunkFromIndexedFreeList(size); 1279 if(res != NULL) { 1280 assert(res != (HeapWord*)_indexedFreeList[size].head(), 1281 "Not removed from free list"); 1282 // no block offset table adjustment is necessary on blocks in 1283 // the indexed lists. 1284 1285 // Try allocating from the small LinAB 1286 } else if (size < _smallLinearAllocBlock._allocation_size_limit && 1287 (res = getChunkFromSmallLinearAllocBlock(size)) != NULL) { 1288 // if successful, the above also adjusts block offset table 1289 // Note that this call will refill the LinAB to 1290 // satisfy the request. This is different that 1291 // evm. 1292 // Don't record chunk off a LinAB? smallSplitBirth(size); 1293 } else { 1294 // Raid the exact free lists larger than size, even if they are not 1295 // overpopulated. 1296 res = (HeapWord*) getChunkFromGreater(size); 1297 } 1298 } else { 1299 // Big objects get allocated directly from the dictionary. 1300 res = (HeapWord*) getChunkFromDictionaryExact(size); 1301 if (res == NULL) { 1302 // Try hard not to fail since an allocation failure will likely 1303 // trigger a synchronous GC. Try to get the space from the 1304 // allocation blocks. 1305 res = getChunkFromSmallLinearAllocBlockRemainder(size); 1306 } 1307 } 1308 1309 return res; 1310 } 1311 1312 // A worst-case estimate of the space required (in HeapWords) to expand the heap 1313 // when promoting obj. 1314 size_t CompactibleFreeListSpace::expansionSpaceRequired(size_t obj_size) const { 1315 // Depending on the object size, expansion may require refilling either a 1316 // bigLAB or a smallLAB plus refilling a PromotionInfo object. MinChunkSize 1317 // is added because the dictionary may over-allocate to avoid fragmentation. 1318 size_t space = obj_size; 1319 if (!_adaptive_freelists) { 1320 space = MAX2(space, _smallLinearAllocBlock._refillSize); 1321 } 1322 space += _promoInfo.refillSize() + 2 * MinChunkSize; 1323 return space; 1324 } 1325 1326 FreeChunk* CompactibleFreeListSpace::getChunkFromGreater(size_t numWords) { 1327 FreeChunk* ret; 1328 1329 assert(numWords >= MinChunkSize, "Size is less than minimum"); 1330 assert(linearAllocationWouldFail() || bestFitFirst(), 1331 "Should not be here"); 1332 1333 size_t i; 1334 size_t currSize = numWords + MinChunkSize; 1335 assert(currSize % MinObjAlignment == 0, "currSize should be aligned"); 1336 for (i = currSize; i < IndexSetSize; i += IndexSetStride) { 1337 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; 1338 if (fl->head()) { 1339 ret = getFromListGreater(fl, numWords); 1340 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); 1341 return ret; 1342 } 1343 } 1344 1345 currSize = MAX2((size_t)SmallForDictionary, 1346 (size_t)(numWords + MinChunkSize)); 1347 1348 /* Try to get a chunk that satisfies request, while avoiding 1349 fragmentation that can't be handled. */ 1350 { 1351 ret = dictionary()->get_chunk(currSize); 1352 if (ret != NULL) { 1353 assert(ret->size() - numWords >= MinChunkSize, 1354 "Chunk is too small"); 1355 _bt.allocated((HeapWord*)ret, ret->size()); 1356 /* Carve returned chunk. */ 1357 (void) splitChunkAndReturnRemainder(ret, numWords); 1358 /* Label this as no longer a free chunk. */ 1359 assert(ret->is_free(), "This chunk should be free"); 1360 ret->link_prev(NULL); 1361 } 1362 assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); 1363 return ret; 1364 } 1365 ShouldNotReachHere(); 1366 } 1367 1368 bool CompactibleFreeListSpace::verifyChunkInIndexedFreeLists(FreeChunk* fc) const { 1369 assert(fc->size() < IndexSetSize, "Size of chunk is too large"); 1370 return _indexedFreeList[fc->size()].verify_chunk_in_free_list(fc); 1371 } 1372 1373 bool CompactibleFreeListSpace::verify_chunk_is_linear_alloc_block(FreeChunk* fc) const { 1374 assert((_smallLinearAllocBlock._ptr != (HeapWord*)fc) || 1375 (_smallLinearAllocBlock._word_size == fc->size()), 1376 "Linear allocation block shows incorrect size"); 1377 return ((_smallLinearAllocBlock._ptr == (HeapWord*)fc) && 1378 (_smallLinearAllocBlock._word_size == fc->size())); 1379 } 1380 1381 // Check if the purported free chunk is present either as a linear 1382 // allocation block, the size-indexed table of (smaller) free blocks, 1383 // or the larger free blocks kept in the binary tree dictionary. 1384 bool CompactibleFreeListSpace::verify_chunk_in_free_list(FreeChunk* fc) const { 1385 if (verify_chunk_is_linear_alloc_block(fc)) { 1386 return true; 1387 } else if (fc->size() < IndexSetSize) { 1388 return verifyChunkInIndexedFreeLists(fc); 1389 } else { 1390 return dictionary()->verify_chunk_in_free_list(fc); 1391 } 1392 } 1393 1394 #ifndef PRODUCT 1395 void CompactibleFreeListSpace::assert_locked() const { 1396 CMSLockVerifier::assert_locked(freelistLock(), parDictionaryAllocLock()); 1397 } 1398 1399 void CompactibleFreeListSpace::assert_locked(const Mutex* lock) const { 1400 CMSLockVerifier::assert_locked(lock); 1401 } 1402 #endif 1403 1404 FreeChunk* CompactibleFreeListSpace::allocateScratch(size_t size) { 1405 // In the parallel case, the main thread holds the free list lock 1406 // on behalf the parallel threads. 1407 FreeChunk* fc; 1408 { 1409 // If GC is parallel, this might be called by several threads. 1410 // This should be rare enough that the locking overhead won't affect 1411 // the sequential code. 1412 MutexLockerEx x(parDictionaryAllocLock(), 1413 Mutex::_no_safepoint_check_flag); 1414 fc = getChunkFromDictionary(size); 1415 } 1416 if (fc != NULL) { 1417 fc->dontCoalesce(); 1418 assert(fc->is_free(), "Should be free, but not coalescable"); 1419 // Verify that the block offset table shows this to 1420 // be a single block, but not one which is unallocated. 1421 _bt.verify_single_block((HeapWord*)fc, fc->size()); 1422 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 1423 } 1424 return fc; 1425 } 1426 1427 oop CompactibleFreeListSpace::promote(oop obj, size_t obj_size) { 1428 assert(obj_size == (size_t)obj->size(), "bad obj_size passed in"); 1429 assert_locked(); 1430 1431 // if we are tracking promotions, then first ensure space for 1432 // promotion (including spooling space for saving header if necessary). 1433 // then allocate and copy, then track promoted info if needed. 1434 // When tracking (see PromotionInfo::track()), the mark word may 1435 // be displaced and in this case restoration of the mark word 1436 // occurs in the (oop_since_save_marks_)iterate phase. 1437 if (_promoInfo.tracking() && !_promoInfo.ensure_spooling_space()) { 1438 return NULL; 1439 } 1440 // Call the allocate(size_t, bool) form directly to avoid the 1441 // additional call through the allocate(size_t) form. Having 1442 // the compile inline the call is problematic because allocate(size_t) 1443 // is a virtual method. 1444 HeapWord* res = allocate(adjustObjectSize(obj_size)); 1445 if (res != NULL) { 1446 Copy::aligned_disjoint_words((HeapWord*)obj, res, obj_size); 1447 // if we should be tracking promotions, do so. 1448 if (_promoInfo.tracking()) { 1449 _promoInfo.track((PromotedObject*)res); 1450 } 1451 } 1452 return oop(res); 1453 } 1454 1455 HeapWord* 1456 CompactibleFreeListSpace::getChunkFromSmallLinearAllocBlock(size_t size) { 1457 assert_locked(); 1458 assert(size >= MinChunkSize, "minimum chunk size"); 1459 assert(size < _smallLinearAllocBlock._allocation_size_limit, 1460 "maximum from smallLinearAllocBlock"); 1461 return getChunkFromLinearAllocBlock(&_smallLinearAllocBlock, size); 1462 } 1463 1464 HeapWord* 1465 CompactibleFreeListSpace::getChunkFromLinearAllocBlock(LinearAllocBlock *blk, 1466 size_t size) { 1467 assert_locked(); 1468 assert(size >= MinChunkSize, "too small"); 1469 HeapWord* res = NULL; 1470 // Try to do linear allocation from blk, making sure that 1471 if (blk->_word_size == 0) { 1472 // We have probably been unable to fill this either in the prologue or 1473 // when it was exhausted at the last linear allocation. Bail out until 1474 // next time. 1475 assert(blk->_ptr == NULL, "consistency check"); 1476 return NULL; 1477 } 1478 assert(blk->_word_size != 0 && blk->_ptr != NULL, "consistency check"); 1479 res = getChunkFromLinearAllocBlockRemainder(blk, size); 1480 if (res != NULL) return res; 1481 1482 // about to exhaust this linear allocation block 1483 if (blk->_word_size == size) { // exactly satisfied 1484 res = blk->_ptr; 1485 _bt.allocated(res, blk->_word_size); 1486 } else if (size + MinChunkSize <= blk->_refillSize) { 1487 size_t sz = blk->_word_size; 1488 // Update _unallocated_block if the size is such that chunk would be 1489 // returned to the indexed free list. All other chunks in the indexed 1490 // free lists are allocated from the dictionary so that _unallocated_block 1491 // has already been adjusted for them. Do it here so that the cost 1492 // for all chunks added back to the indexed free lists. 1493 if (sz < SmallForDictionary) { 1494 _bt.allocated(blk->_ptr, sz); 1495 } 1496 // Return the chunk that isn't big enough, and then refill below. 1497 addChunkToFreeLists(blk->_ptr, sz); 1498 split_birth(sz); 1499 // Don't keep statistics on adding back chunk from a LinAB. 1500 } else { 1501 // A refilled block would not satisfy the request. 1502 return NULL; 1503 } 1504 1505 blk->_ptr = NULL; blk->_word_size = 0; 1506 refillLinearAllocBlock(blk); 1507 assert(blk->_ptr == NULL || blk->_word_size >= size + MinChunkSize, 1508 "block was replenished"); 1509 if (res != NULL) { 1510 split_birth(size); 1511 repairLinearAllocBlock(blk); 1512 } else if (blk->_ptr != NULL) { 1513 res = blk->_ptr; 1514 size_t blk_size = blk->_word_size; 1515 blk->_word_size -= size; 1516 blk->_ptr += size; 1517 split_birth(size); 1518 repairLinearAllocBlock(blk); 1519 // Update BOT last so that other (parallel) GC threads see a consistent 1520 // view of the BOT and free blocks. 1521 // Above must occur before BOT is updated below. 1522 OrderAccess::storestore(); 1523 _bt.split_block(res, blk_size, size); // adjust block offset table 1524 } 1525 return res; 1526 } 1527 1528 HeapWord* CompactibleFreeListSpace::getChunkFromLinearAllocBlockRemainder( 1529 LinearAllocBlock* blk, 1530 size_t size) { 1531 assert_locked(); 1532 assert(size >= MinChunkSize, "too small"); 1533 1534 HeapWord* res = NULL; 1535 // This is the common case. Keep it simple. 1536 if (blk->_word_size >= size + MinChunkSize) { 1537 assert(blk->_ptr != NULL, "consistency check"); 1538 res = blk->_ptr; 1539 // Note that the BOT is up-to-date for the linAB before allocation. It 1540 // indicates the start of the linAB. The split_block() updates the 1541 // BOT for the linAB after the allocation (indicates the start of the 1542 // next chunk to be allocated). 1543 size_t blk_size = blk->_word_size; 1544 blk->_word_size -= size; 1545 blk->_ptr += size; 1546 split_birth(size); 1547 repairLinearAllocBlock(blk); 1548 // Update BOT last so that other (parallel) GC threads see a consistent 1549 // view of the BOT and free blocks. 1550 // Above must occur before BOT is updated below. 1551 OrderAccess::storestore(); 1552 _bt.split_block(res, blk_size, size); // adjust block offset table 1553 _bt.allocated(res, size); 1554 } 1555 return res; 1556 } 1557 1558 FreeChunk* 1559 CompactibleFreeListSpace::getChunkFromIndexedFreeList(size_t size) { 1560 assert_locked(); 1561 assert(size < SmallForDictionary, "just checking"); 1562 FreeChunk* res; 1563 res = _indexedFreeList[size].get_chunk_at_head(); 1564 if (res == NULL) { 1565 res = getChunkFromIndexedFreeListHelper(size); 1566 } 1567 _bt.verify_not_unallocated((HeapWord*) res, size); 1568 assert(res == NULL || res->size() == size, "Incorrect block size"); 1569 return res; 1570 } 1571 1572 FreeChunk* 1573 CompactibleFreeListSpace::getChunkFromIndexedFreeListHelper(size_t size, 1574 bool replenish) { 1575 assert_locked(); 1576 FreeChunk* fc = NULL; 1577 if (size < SmallForDictionary) { 1578 assert(_indexedFreeList[size].head() == NULL || 1579 _indexedFreeList[size].surplus() <= 0, 1580 "List for this size should be empty or under populated"); 1581 // Try best fit in exact lists before replenishing the list 1582 if (!bestFitFirst() || (fc = bestFitSmall(size)) == NULL) { 1583 // Replenish list. 1584 // 1585 // Things tried that failed. 1586 // Tried allocating out of the two LinAB's first before 1587 // replenishing lists. 1588 // Tried small linAB of size 256 (size in indexed list) 1589 // and replenishing indexed lists from the small linAB. 1590 // 1591 FreeChunk* newFc = NULL; 1592 const size_t replenish_size = CMSIndexedFreeListReplenish * size; 1593 if (replenish_size < SmallForDictionary) { 1594 // Do not replenish from an underpopulated size. 1595 if (_indexedFreeList[replenish_size].surplus() > 0 && 1596 _indexedFreeList[replenish_size].head() != NULL) { 1597 newFc = _indexedFreeList[replenish_size].get_chunk_at_head(); 1598 } else if (bestFitFirst()) { 1599 newFc = bestFitSmall(replenish_size); 1600 } 1601 } 1602 if (newFc == NULL && replenish_size > size) { 1603 assert(CMSIndexedFreeListReplenish > 1, "ctl pt invariant"); 1604 newFc = getChunkFromIndexedFreeListHelper(replenish_size, false); 1605 } 1606 // Note: The stats update re split-death of block obtained above 1607 // will be recorded below precisely when we know we are going to 1608 // be actually splitting it into more than one pieces below. 1609 if (newFc != NULL) { 1610 if (replenish || CMSReplenishIntermediate) { 1611 // Replenish this list and return one block to caller. 1612 size_t i; 1613 FreeChunk *curFc, *nextFc; 1614 size_t num_blk = newFc->size() / size; 1615 assert(num_blk >= 1, "Smaller than requested?"); 1616 assert(newFc->size() % size == 0, "Should be integral multiple of request"); 1617 if (num_blk > 1) { 1618 // we are sure we will be splitting the block just obtained 1619 // into multiple pieces; record the split-death of the original 1620 splitDeath(replenish_size); 1621 } 1622 // carve up and link blocks 0, ..., num_blk - 2 1623 // The last chunk is not added to the lists but is returned as the 1624 // free chunk. 1625 for (curFc = newFc, nextFc = (FreeChunk*)((HeapWord*)curFc + size), 1626 i = 0; 1627 i < (num_blk - 1); 1628 curFc = nextFc, nextFc = (FreeChunk*)((HeapWord*)nextFc + size), 1629 i++) { 1630 curFc->set_size(size); 1631 // Don't record this as a return in order to try and 1632 // determine the "returns" from a GC. 1633 _bt.verify_not_unallocated((HeapWord*) fc, size); 1634 _indexedFreeList[size].return_chunk_at_tail(curFc, false); 1635 _bt.mark_block((HeapWord*)curFc, size); 1636 split_birth(size); 1637 // Don't record the initial population of the indexed list 1638 // as a split birth. 1639 } 1640 1641 // check that the arithmetic was OK above 1642 assert((HeapWord*)nextFc == (HeapWord*)newFc + num_blk*size, 1643 "inconsistency in carving newFc"); 1644 curFc->set_size(size); 1645 _bt.mark_block((HeapWord*)curFc, size); 1646 split_birth(size); 1647 fc = curFc; 1648 } else { 1649 // Return entire block to caller 1650 fc = newFc; 1651 } 1652 } 1653 } 1654 } else { 1655 // Get a free chunk from the free chunk dictionary to be returned to 1656 // replenish the indexed free list. 1657 fc = getChunkFromDictionaryExact(size); 1658 } 1659 // assert(fc == NULL || fc->is_free(), "Should be returning a free chunk"); 1660 return fc; 1661 } 1662 1663 FreeChunk* 1664 CompactibleFreeListSpace::getChunkFromDictionary(size_t size) { 1665 assert_locked(); 1666 FreeChunk* fc = _dictionary->get_chunk(size, 1667 FreeBlockDictionary<FreeChunk>::atLeast); 1668 if (fc == NULL) { 1669 return NULL; 1670 } 1671 _bt.allocated((HeapWord*)fc, fc->size()); 1672 if (fc->size() >= size + MinChunkSize) { 1673 fc = splitChunkAndReturnRemainder(fc, size); 1674 } 1675 assert(fc->size() >= size, "chunk too small"); 1676 assert(fc->size() < size + MinChunkSize, "chunk too big"); 1677 _bt.verify_single_block((HeapWord*)fc, fc->size()); 1678 return fc; 1679 } 1680 1681 FreeChunk* 1682 CompactibleFreeListSpace::getChunkFromDictionaryExact(size_t size) { 1683 assert_locked(); 1684 FreeChunk* fc = _dictionary->get_chunk(size, 1685 FreeBlockDictionary<FreeChunk>::atLeast); 1686 if (fc == NULL) { 1687 return fc; 1688 } 1689 _bt.allocated((HeapWord*)fc, fc->size()); 1690 if (fc->size() == size) { 1691 _bt.verify_single_block((HeapWord*)fc, size); 1692 return fc; 1693 } 1694 assert(fc->size() > size, "get_chunk() guarantee"); 1695 if (fc->size() < size + MinChunkSize) { 1696 // Return the chunk to the dictionary and go get a bigger one. 1697 returnChunkToDictionary(fc); 1698 fc = _dictionary->get_chunk(size + MinChunkSize, 1699 FreeBlockDictionary<FreeChunk>::atLeast); 1700 if (fc == NULL) { 1701 return NULL; 1702 } 1703 _bt.allocated((HeapWord*)fc, fc->size()); 1704 } 1705 assert(fc->size() >= size + MinChunkSize, "tautology"); 1706 fc = splitChunkAndReturnRemainder(fc, size); 1707 assert(fc->size() == size, "chunk is wrong size"); 1708 _bt.verify_single_block((HeapWord*)fc, size); 1709 return fc; 1710 } 1711 1712 void 1713 CompactibleFreeListSpace::returnChunkToDictionary(FreeChunk* chunk) { 1714 assert_locked(); 1715 1716 size_t size = chunk->size(); 1717 _bt.verify_single_block((HeapWord*)chunk, size); 1718 // adjust _unallocated_block downward, as necessary 1719 _bt.freed((HeapWord*)chunk, size); 1720 _dictionary->return_chunk(chunk); 1721 #ifndef PRODUCT 1722 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { 1723 TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >* tc = TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::as_TreeChunk(chunk); 1724 TreeList<FreeChunk, AdaptiveFreeList<FreeChunk> >* tl = tc->list(); 1725 tl->verify_stats(); 1726 } 1727 #endif // PRODUCT 1728 } 1729 1730 void 1731 CompactibleFreeListSpace::returnChunkToFreeList(FreeChunk* fc) { 1732 assert_locked(); 1733 size_t size = fc->size(); 1734 _bt.verify_single_block((HeapWord*) fc, size); 1735 _bt.verify_not_unallocated((HeapWord*) fc, size); 1736 if (_adaptive_freelists) { 1737 _indexedFreeList[size].return_chunk_at_tail(fc); 1738 } else { 1739 _indexedFreeList[size].return_chunk_at_head(fc); 1740 } 1741 #ifndef PRODUCT 1742 if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { 1743 _indexedFreeList[size].verify_stats(); 1744 } 1745 #endif // PRODUCT 1746 } 1747 1748 // Add chunk to end of last block -- if it's the largest 1749 // block -- and update BOT and census data. We would 1750 // of course have preferred to coalesce it with the 1751 // last block, but it's currently less expensive to find the 1752 // largest block than it is to find the last. 1753 void 1754 CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats( 1755 HeapWord* chunk, size_t size) { 1756 // check that the chunk does lie in this space! 1757 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!"); 1758 // One of the parallel gc task threads may be here 1759 // whilst others are allocating. 1760 Mutex* lock = NULL; 1761 if (ParallelGCThreads != 0) { 1762 lock = &_parDictionaryAllocLock; 1763 } 1764 FreeChunk* ec; 1765 { 1766 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); 1767 ec = dictionary()->find_largest_dict(); // get largest block 1768 if (ec != NULL && ec->end() == (uintptr_t*) chunk) { 1769 // It's a coterminal block - we can coalesce. 1770 size_t old_size = ec->size(); 1771 coalDeath(old_size); 1772 removeChunkFromDictionary(ec); 1773 size += old_size; 1774 } else { 1775 ec = (FreeChunk*)chunk; 1776 } 1777 } 1778 ec->set_size(size); 1779 debug_only(ec->mangleFreed(size)); 1780 if (size < SmallForDictionary && ParallelGCThreads != 0) { 1781 lock = _indexedFreeListParLocks[size]; 1782 } 1783 MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); 1784 addChunkAndRepairOffsetTable((HeapWord*)ec, size, true); 1785 // record the birth under the lock since the recording involves 1786 // manipulation of the list on which the chunk lives and 1787 // if the chunk is allocated and is the last on the list, 1788 // the list can go away. 1789 coalBirth(size); 1790 } 1791 1792 void 1793 CompactibleFreeListSpace::addChunkToFreeLists(HeapWord* chunk, 1794 size_t size) { 1795 // check that the chunk does lie in this space! 1796 assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!"); 1797 assert_locked(); 1798 _bt.verify_single_block(chunk, size); 1799 1800 FreeChunk* fc = (FreeChunk*) chunk; 1801 fc->set_size(size); 1802 debug_only(fc->mangleFreed(size)); 1803 if (size < SmallForDictionary) { 1804 returnChunkToFreeList(fc); 1805 } else { 1806 returnChunkToDictionary(fc); 1807 } 1808 } 1809 1810 void 1811 CompactibleFreeListSpace::addChunkAndRepairOffsetTable(HeapWord* chunk, 1812 size_t size, bool coalesced) { 1813 assert_locked(); 1814 assert(chunk != NULL, "null chunk"); 1815 if (coalesced) { 1816 // repair BOT 1817 _bt.single_block(chunk, size); 1818 } 1819 addChunkToFreeLists(chunk, size); 1820 } 1821 1822 // We _must_ find the purported chunk on our free lists; 1823 // we assert if we don't. 1824 void 1825 CompactibleFreeListSpace::removeFreeChunkFromFreeLists(FreeChunk* fc) { 1826 size_t size = fc->size(); 1827 assert_locked(); 1828 debug_only(verifyFreeLists()); 1829 if (size < SmallForDictionary) { 1830 removeChunkFromIndexedFreeList(fc); 1831 } else { 1832 removeChunkFromDictionary(fc); 1833 } 1834 _bt.verify_single_block((HeapWord*)fc, size); 1835 debug_only(verifyFreeLists()); 1836 } 1837 1838 void 1839 CompactibleFreeListSpace::removeChunkFromDictionary(FreeChunk* fc) { 1840 size_t size = fc->size(); 1841 assert_locked(); 1842 assert(fc != NULL, "null chunk"); 1843 _bt.verify_single_block((HeapWord*)fc, size); 1844 _dictionary->remove_chunk(fc); 1845 // adjust _unallocated_block upward, as necessary 1846 _bt.allocated((HeapWord*)fc, size); 1847 } 1848 1849 void 1850 CompactibleFreeListSpace::removeChunkFromIndexedFreeList(FreeChunk* fc) { 1851 assert_locked(); 1852 size_t size = fc->size(); 1853 _bt.verify_single_block((HeapWord*)fc, size); 1854 NOT_PRODUCT( 1855 if (FLSVerifyIndexTable) { 1856 verifyIndexedFreeList(size); 1857 } 1858 ) 1859 _indexedFreeList[size].remove_chunk(fc); 1860 NOT_PRODUCT( 1861 if (FLSVerifyIndexTable) { 1862 verifyIndexedFreeList(size); 1863 } 1864 ) 1865 } 1866 1867 FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { 1868 /* A hint is the next larger size that has a surplus. 1869 Start search at a size large enough to guarantee that 1870 the excess is >= MIN_CHUNK. */ 1871 size_t start = align_object_size(numWords + MinChunkSize); 1872 if (start < IndexSetSize) { 1873 AdaptiveFreeList<FreeChunk>* it = _indexedFreeList; 1874 size_t hint = _indexedFreeList[start].hint(); 1875 while (hint < IndexSetSize) { 1876 assert(hint % MinObjAlignment == 0, "hint should be aligned"); 1877 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[hint]; 1878 if (fl->surplus() > 0 && fl->head() != NULL) { 1879 // Found a list with surplus, reset original hint 1880 // and split out a free chunk which is returned. 1881 _indexedFreeList[start].set_hint(hint); 1882 FreeChunk* res = getFromListGreater(fl, numWords); 1883 assert(res == NULL || res->is_free(), 1884 "Should be returning a free chunk"); 1885 return res; 1886 } 1887 hint = fl->hint(); /* keep looking */ 1888 } 1889 /* None found. */ 1890 it[start].set_hint(IndexSetSize); 1891 } 1892 return NULL; 1893 } 1894 1895 /* Requires fl->size >= numWords + MinChunkSize */ 1896 FreeChunk* CompactibleFreeListSpace::getFromListGreater(AdaptiveFreeList<FreeChunk>* fl, 1897 size_t numWords) { 1898 FreeChunk *curr = fl->head(); 1899 size_t oldNumWords = curr->size(); 1900 assert(numWords >= MinChunkSize, "Word size is too small"); 1901 assert(curr != NULL, "List is empty"); 1902 assert(oldNumWords >= numWords + MinChunkSize, 1903 "Size of chunks in the list is too small"); 1904 1905 fl->remove_chunk(curr); 1906 // recorded indirectly by splitChunkAndReturnRemainder - 1907 // smallSplit(oldNumWords, numWords); 1908 FreeChunk* new_chunk = splitChunkAndReturnRemainder(curr, numWords); 1909 // Does anything have to be done for the remainder in terms of 1910 // fixing the card table? 1911 assert(new_chunk == NULL || new_chunk->is_free(), 1912 "Should be returning a free chunk"); 1913 return new_chunk; 1914 } 1915 1916 FreeChunk* 1917 CompactibleFreeListSpace::splitChunkAndReturnRemainder(FreeChunk* chunk, 1918 size_t new_size) { 1919 assert_locked(); 1920 size_t size = chunk->size(); 1921 assert(size > new_size, "Split from a smaller block?"); 1922 assert(is_aligned(chunk), "alignment problem"); 1923 assert(size == adjustObjectSize(size), "alignment problem"); 1924 size_t rem_size = size - new_size; 1925 assert(rem_size == adjustObjectSize(rem_size), "alignment problem"); 1926 assert(rem_size >= MinChunkSize, "Free chunk smaller than minimum"); 1927 FreeChunk* ffc = (FreeChunk*)((HeapWord*)chunk + new_size); 1928 assert(is_aligned(ffc), "alignment problem"); 1929 ffc->set_size(rem_size); 1930 ffc->link_next(NULL); 1931 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 1932 // Above must occur before BOT is updated below. 1933 // adjust block offset table 1934 OrderAccess::storestore(); 1935 assert(chunk->is_free() && ffc->is_free(), "Error"); 1936 _bt.split_block((HeapWord*)chunk, chunk->size(), new_size); 1937 if (rem_size < SmallForDictionary) { 1938 bool is_par = (SharedHeap::heap()->n_par_threads() > 0); 1939 if (is_par) _indexedFreeListParLocks[rem_size]->lock(); 1940 assert(!is_par || 1941 (SharedHeap::heap()->n_par_threads() == 1942 SharedHeap::heap()->workers()->active_workers()), "Mismatch"); 1943 returnChunkToFreeList(ffc); 1944 split(size, rem_size); 1945 if (is_par) _indexedFreeListParLocks[rem_size]->unlock(); 1946 } else { 1947 returnChunkToDictionary(ffc); 1948 split(size ,rem_size); 1949 } 1950 chunk->set_size(new_size); 1951 return chunk; 1952 } 1953 1954 void 1955 CompactibleFreeListSpace::sweep_completed() { 1956 // Now that space is probably plentiful, refill linear 1957 // allocation blocks as needed. 1958 refillLinearAllocBlocksIfNeeded(); 1959 } 1960 1961 void 1962 CompactibleFreeListSpace::gc_prologue() { 1963 assert_locked(); 1964 if (PrintFLSStatistics != 0) { 1965 gclog_or_tty->print("Before GC:\n"); 1966 reportFreeListStatistics(); 1967 } 1968 refillLinearAllocBlocksIfNeeded(); 1969 } 1970 1971 void 1972 CompactibleFreeListSpace::gc_epilogue() { 1973 assert_locked(); 1974 if (PrintGCDetails && Verbose && !_adaptive_freelists) { 1975 if (_smallLinearAllocBlock._word_size == 0) 1976 warning("CompactibleFreeListSpace(epilogue):: Linear allocation failure"); 1977 } 1978 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); 1979 _promoInfo.stopTrackingPromotions(); 1980 repairLinearAllocationBlocks(); 1981 // Print Space's stats 1982 if (PrintFLSStatistics != 0) { 1983 gclog_or_tty->print("After GC:\n"); 1984 reportFreeListStatistics(); 1985 } 1986 } 1987 1988 // Iteration support, mostly delegated from a CMS generation 1989 1990 void CompactibleFreeListSpace::save_marks() { 1991 assert(Thread::current()->is_VM_thread(), 1992 "Global variable should only be set when single-threaded"); 1993 // Mark the "end" of the used space at the time of this call; 1994 // note, however, that promoted objects from this point 1995 // on are tracked in the _promoInfo below. 1996 set_saved_mark_word(unallocated_block()); 1997 #ifdef ASSERT 1998 // Check the sanity of save_marks() etc. 1999 MemRegion ur = used_region(); 2000 MemRegion urasm = used_region_at_save_marks(); 2001 assert(ur.contains(urasm), 2002 err_msg(" Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")" 2003 " should contain [" PTR_FORMAT "," PTR_FORMAT ")", 2004 p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end()))); 2005 #endif 2006 // inform allocator that promotions should be tracked. 2007 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); 2008 _promoInfo.startTrackingPromotions(); 2009 } 2010 2011 bool CompactibleFreeListSpace::no_allocs_since_save_marks() { 2012 assert(_promoInfo.tracking(), "No preceding save_marks?"); 2013 assert(SharedHeap::heap()->n_par_threads() == 0, 2014 "Shouldn't be called if using parallel gc."); 2015 return _promoInfo.noPromotions(); 2016 } 2017 2018 #define CFLS_OOP_SINCE_SAVE_MARKS_DEFN(OopClosureType, nv_suffix) \ 2019 \ 2020 void CompactibleFreeListSpace:: \ 2021 oop_since_save_marks_iterate##nv_suffix(OopClosureType* blk) { \ 2022 assert(SharedHeap::heap()->n_par_threads() == 0, \ 2023 "Shouldn't be called (yet) during parallel part of gc."); \ 2024 _promoInfo.promoted_oops_iterate##nv_suffix(blk); \ 2025 /* \ 2026 * This also restores any displaced headers and removes the elements from \ 2027 * the iteration set as they are processed, so that we have a clean slate \ 2028 * at the end of the iteration. Note, thus, that if new objects are \ 2029 * promoted as a result of the iteration they are iterated over as well. \ 2030 */ \ 2031 assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); \ 2032 } 2033 2034 ALL_SINCE_SAVE_MARKS_CLOSURES(CFLS_OOP_SINCE_SAVE_MARKS_DEFN) 2035 2036 bool CompactibleFreeListSpace::linearAllocationWouldFail() const { 2037 return _smallLinearAllocBlock._word_size == 0; 2038 } 2039 2040 void CompactibleFreeListSpace::repairLinearAllocationBlocks() { 2041 // Fix up linear allocation blocks to look like free blocks 2042 repairLinearAllocBlock(&_smallLinearAllocBlock); 2043 } 2044 2045 void CompactibleFreeListSpace::repairLinearAllocBlock(LinearAllocBlock* blk) { 2046 assert_locked(); 2047 if (blk->_ptr != NULL) { 2048 assert(blk->_word_size != 0 && blk->_word_size >= MinChunkSize, 2049 "Minimum block size requirement"); 2050 FreeChunk* fc = (FreeChunk*)(blk->_ptr); 2051 fc->set_size(blk->_word_size); 2052 fc->link_prev(NULL); // mark as free 2053 fc->dontCoalesce(); 2054 assert(fc->is_free(), "just marked it free"); 2055 assert(fc->cantCoalesce(), "just marked it uncoalescable"); 2056 } 2057 } 2058 2059 void CompactibleFreeListSpace::refillLinearAllocBlocksIfNeeded() { 2060 assert_locked(); 2061 if (_smallLinearAllocBlock._ptr == NULL) { 2062 assert(_smallLinearAllocBlock._word_size == 0, 2063 "Size of linAB should be zero if the ptr is NULL"); 2064 // Reset the linAB refill and allocation size limit. 2065 _smallLinearAllocBlock.set(0, 0, 1024*SmallForLinearAlloc, SmallForLinearAlloc); 2066 } 2067 refillLinearAllocBlockIfNeeded(&_smallLinearAllocBlock); 2068 } 2069 2070 void 2071 CompactibleFreeListSpace::refillLinearAllocBlockIfNeeded(LinearAllocBlock* blk) { 2072 assert_locked(); 2073 assert((blk->_ptr == NULL && blk->_word_size == 0) || 2074 (blk->_ptr != NULL && blk->_word_size >= MinChunkSize), 2075 "blk invariant"); 2076 if (blk->_ptr == NULL) { 2077 refillLinearAllocBlock(blk); 2078 } 2079 if (PrintMiscellaneous && Verbose) { 2080 if (blk->_word_size == 0) { 2081 warning("CompactibleFreeListSpace(prologue):: Linear allocation failure"); 2082 } 2083 } 2084 } 2085 2086 void 2087 CompactibleFreeListSpace::refillLinearAllocBlock(LinearAllocBlock* blk) { 2088 assert_locked(); 2089 assert(blk->_word_size == 0 && blk->_ptr == NULL, 2090 "linear allocation block should be empty"); 2091 FreeChunk* fc; 2092 if (blk->_refillSize < SmallForDictionary && 2093 (fc = getChunkFromIndexedFreeList(blk->_refillSize)) != NULL) { 2094 // A linAB's strategy might be to use small sizes to reduce 2095 // fragmentation but still get the benefits of allocation from a 2096 // linAB. 2097 } else { 2098 fc = getChunkFromDictionary(blk->_refillSize); 2099 } 2100 if (fc != NULL) { 2101 blk->_ptr = (HeapWord*)fc; 2102 blk->_word_size = fc->size(); 2103 fc->dontCoalesce(); // to prevent sweeper from sweeping us up 2104 } 2105 } 2106 2107 // Support for concurrent collection policy decisions. 2108 bool CompactibleFreeListSpace::should_concurrent_collect() const { 2109 // In the future we might want to add in frgamentation stats -- 2110 // including erosion of the "mountain" into this decision as well. 2111 return !adaptive_freelists() && linearAllocationWouldFail(); 2112 } 2113 2114 // Support for compaction 2115 2116 void CompactibleFreeListSpace::prepare_for_compaction(CompactPoint* cp) { 2117 SCAN_AND_FORWARD(cp,end,block_is_obj,block_size); 2118 // prepare_for_compaction() uses the space between live objects 2119 // so that later phase can skip dead space quickly. So verification 2120 // of the free lists doesn't work after. 2121 } 2122 2123 #define obj_size(q) adjustObjectSize(oop(q)->size()) 2124 #define adjust_obj_size(s) adjustObjectSize(s) 2125 2126 void CompactibleFreeListSpace::adjust_pointers() { 2127 // In other versions of adjust_pointers(), a bail out 2128 // based on the amount of live data in the generation 2129 // (i.e., if 0, bail out) may be used. 2130 // Cannot test used() == 0 here because the free lists have already 2131 // been mangled by the compaction. 2132 2133 SCAN_AND_ADJUST_POINTERS(adjust_obj_size); 2134 // See note about verification in prepare_for_compaction(). 2135 } 2136 2137 void CompactibleFreeListSpace::compact() { 2138 SCAN_AND_COMPACT(obj_size); 2139 } 2140 2141 // fragmentation_metric = 1 - [sum of (fbs**2) / (sum of fbs)**2] 2142 // where fbs is free block sizes 2143 double CompactibleFreeListSpace::flsFrag() const { 2144 size_t itabFree = totalSizeInIndexedFreeLists(); 2145 double frag = 0.0; 2146 size_t i; 2147 2148 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2149 double sz = i; 2150 frag += _indexedFreeList[i].count() * (sz * sz); 2151 } 2152 2153 double totFree = itabFree + 2154 _dictionary->total_chunk_size(DEBUG_ONLY(freelistLock())); 2155 if (totFree > 0) { 2156 frag = ((frag + _dictionary->sum_of_squared_block_sizes()) / 2157 (totFree * totFree)); 2158 frag = (double)1.0 - frag; 2159 } else { 2160 assert(frag == 0.0, "Follows from totFree == 0"); 2161 } 2162 return frag; 2163 } 2164 2165 void CompactibleFreeListSpace::beginSweepFLCensus( 2166 float inter_sweep_current, 2167 float inter_sweep_estimate, 2168 float intra_sweep_estimate) { 2169 assert_locked(); 2170 size_t i; 2171 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2172 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[i]; 2173 if (PrintFLSStatistics > 1) { 2174 gclog_or_tty->print("size[" SIZE_FORMAT "] : ", i); 2175 } 2176 fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); 2177 fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent)); 2178 fl->set_before_sweep(fl->count()); 2179 fl->set_bfr_surp(fl->surplus()); 2180 } 2181 _dictionary->begin_sweep_dict_census(CMSLargeCoalSurplusPercent, 2182 inter_sweep_current, 2183 inter_sweep_estimate, 2184 intra_sweep_estimate); 2185 } 2186 2187 void CompactibleFreeListSpace::setFLSurplus() { 2188 assert_locked(); 2189 size_t i; 2190 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2191 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2192 fl->set_surplus(fl->count() - 2193 (ssize_t)((double)fl->desired() * CMSSmallSplitSurplusPercent)); 2194 } 2195 } 2196 2197 void CompactibleFreeListSpace::setFLHints() { 2198 assert_locked(); 2199 size_t i; 2200 size_t h = IndexSetSize; 2201 for (i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { 2202 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2203 fl->set_hint(h); 2204 if (fl->surplus() > 0) { 2205 h = i; 2206 } 2207 } 2208 } 2209 2210 void CompactibleFreeListSpace::clearFLCensus() { 2211 assert_locked(); 2212 size_t i; 2213 for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2214 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2215 fl->set_prev_sweep(fl->count()); 2216 fl->set_coal_births(0); 2217 fl->set_coal_deaths(0); 2218 fl->set_split_births(0); 2219 fl->set_split_deaths(0); 2220 } 2221 } 2222 2223 void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { 2224 if (PrintFLSStatistics > 0) { 2225 HeapWord* largestAddr = (HeapWord*) dictionary()->find_largest_dict(); 2226 gclog_or_tty->print_cr("CMS: Large block " PTR_FORMAT, 2227 p2i(largestAddr)); 2228 } 2229 setFLSurplus(); 2230 setFLHints(); 2231 if (PrintGC && PrintFLSCensus > 0) { 2232 printFLCensus(sweep_count); 2233 } 2234 clearFLCensus(); 2235 assert_locked(); 2236 _dictionary->end_sweep_dict_census(CMSLargeSplitSurplusPercent); 2237 } 2238 2239 bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { 2240 if (size < SmallForDictionary) { 2241 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2242 return (fl->coal_desired() < 0) || 2243 ((int)fl->count() > fl->coal_desired()); 2244 } else { 2245 return dictionary()->coal_dict_over_populated(size); 2246 } 2247 } 2248 2249 void CompactibleFreeListSpace::smallCoalBirth(size_t size) { 2250 assert(size < SmallForDictionary, "Size too large for indexed list"); 2251 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2252 fl->increment_coal_births(); 2253 fl->increment_surplus(); 2254 } 2255 2256 void CompactibleFreeListSpace::smallCoalDeath(size_t size) { 2257 assert(size < SmallForDictionary, "Size too large for indexed list"); 2258 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2259 fl->increment_coal_deaths(); 2260 fl->decrement_surplus(); 2261 } 2262 2263 void CompactibleFreeListSpace::coalBirth(size_t size) { 2264 if (size < SmallForDictionary) { 2265 smallCoalBirth(size); 2266 } else { 2267 dictionary()->dict_census_update(size, 2268 false /* split */, 2269 true /* birth */); 2270 } 2271 } 2272 2273 void CompactibleFreeListSpace::coalDeath(size_t size) { 2274 if(size < SmallForDictionary) { 2275 smallCoalDeath(size); 2276 } else { 2277 dictionary()->dict_census_update(size, 2278 false /* split */, 2279 false /* birth */); 2280 } 2281 } 2282 2283 void CompactibleFreeListSpace::smallSplitBirth(size_t size) { 2284 assert(size < SmallForDictionary, "Size too large for indexed list"); 2285 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2286 fl->increment_split_births(); 2287 fl->increment_surplus(); 2288 } 2289 2290 void CompactibleFreeListSpace::smallSplitDeath(size_t size) { 2291 assert(size < SmallForDictionary, "Size too large for indexed list"); 2292 AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[size]; 2293 fl->increment_split_deaths(); 2294 fl->decrement_surplus(); 2295 } 2296 2297 void CompactibleFreeListSpace::split_birth(size_t size) { 2298 if (size < SmallForDictionary) { 2299 smallSplitBirth(size); 2300 } else { 2301 dictionary()->dict_census_update(size, 2302 true /* split */, 2303 true /* birth */); 2304 } 2305 } 2306 2307 void CompactibleFreeListSpace::splitDeath(size_t size) { 2308 if (size < SmallForDictionary) { 2309 smallSplitDeath(size); 2310 } else { 2311 dictionary()->dict_census_update(size, 2312 true /* split */, 2313 false /* birth */); 2314 } 2315 } 2316 2317 void CompactibleFreeListSpace::split(size_t from, size_t to1) { 2318 size_t to2 = from - to1; 2319 splitDeath(from); 2320 split_birth(to1); 2321 split_birth(to2); 2322 } 2323 2324 void CompactibleFreeListSpace::print() const { 2325 print_on(tty); 2326 } 2327 2328 void CompactibleFreeListSpace::prepare_for_verify() { 2329 assert_locked(); 2330 repairLinearAllocationBlocks(); 2331 // Verify that the SpoolBlocks look like free blocks of 2332 // appropriate sizes... To be done ... 2333 } 2334 2335 class VerifyAllBlksClosure: public BlkClosure { 2336 private: 2337 const CompactibleFreeListSpace* _sp; 2338 const MemRegion _span; 2339 HeapWord* _last_addr; 2340 size_t _last_size; 2341 bool _last_was_obj; 2342 bool _last_was_live; 2343 2344 public: 2345 VerifyAllBlksClosure(const CompactibleFreeListSpace* sp, 2346 MemRegion span) : _sp(sp), _span(span), 2347 _last_addr(NULL), _last_size(0), 2348 _last_was_obj(false), _last_was_live(false) { } 2349 2350 virtual size_t do_blk(HeapWord* addr) { 2351 size_t res; 2352 bool was_obj = false; 2353 bool was_live = false; 2354 if (_sp->block_is_obj(addr)) { 2355 was_obj = true; 2356 oop p = oop(addr); 2357 guarantee(p->is_oop(), "Should be an oop"); 2358 res = _sp->adjustObjectSize(p->size()); 2359 if (_sp->obj_is_alive(addr)) { 2360 was_live = true; 2361 p->verify(); 2362 } 2363 } else { 2364 FreeChunk* fc = (FreeChunk*)addr; 2365 res = fc->size(); 2366 if (FLSVerifyLists && !fc->cantCoalesce()) { 2367 guarantee(_sp->verify_chunk_in_free_list(fc), 2368 "Chunk should be on a free list"); 2369 } 2370 } 2371 if (res == 0) { 2372 gclog_or_tty->print_cr("Livelock: no rank reduction!"); 2373 gclog_or_tty->print_cr( 2374 " Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n" 2375 " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n", 2376 p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false", 2377 p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); 2378 _sp->print_on(gclog_or_tty); 2379 guarantee(false, "Seppuku!"); 2380 } 2381 _last_addr = addr; 2382 _last_size = res; 2383 _last_was_obj = was_obj; 2384 _last_was_live = was_live; 2385 return res; 2386 } 2387 }; 2388 2389 class VerifyAllOopsClosure: public OopClosure { 2390 private: 2391 const CMSCollector* _collector; 2392 const CompactibleFreeListSpace* _sp; 2393 const MemRegion _span; 2394 const bool _past_remark; 2395 const CMSBitMap* _bit_map; 2396 2397 protected: 2398 void do_oop(void* p, oop obj) { 2399 if (_span.contains(obj)) { // the interior oop points into CMS heap 2400 if (!_span.contains(p)) { // reference from outside CMS heap 2401 // Should be a valid object; the first disjunct below allows 2402 // us to sidestep an assertion in block_is_obj() that insists 2403 // that p be in _sp. Note that several generations (and spaces) 2404 // are spanned by _span (CMS heap) above. 2405 guarantee(!_sp->is_in_reserved(obj) || 2406 _sp->block_is_obj((HeapWord*)obj), 2407 "Should be an object"); 2408 guarantee(obj->is_oop(), "Should be an oop"); 2409 obj->verify(); 2410 if (_past_remark) { 2411 // Remark has been completed, the object should be marked 2412 _bit_map->isMarked((HeapWord*)obj); 2413 } 2414 } else { // reference within CMS heap 2415 if (_past_remark) { 2416 // Remark has been completed -- so the referent should have 2417 // been marked, if referring object is. 2418 if (_bit_map->isMarked(_collector->block_start(p))) { 2419 guarantee(_bit_map->isMarked((HeapWord*)obj), "Marking error?"); 2420 } 2421 } 2422 } 2423 } else if (_sp->is_in_reserved(p)) { 2424 // the reference is from FLS, and points out of FLS 2425 guarantee(obj->is_oop(), "Should be an oop"); 2426 obj->verify(); 2427 } 2428 } 2429 2430 template <class T> void do_oop_work(T* p) { 2431 T heap_oop = oopDesc::load_heap_oop(p); 2432 if (!oopDesc::is_null(heap_oop)) { 2433 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 2434 do_oop(p, obj); 2435 } 2436 } 2437 2438 public: 2439 VerifyAllOopsClosure(const CMSCollector* collector, 2440 const CompactibleFreeListSpace* sp, MemRegion span, 2441 bool past_remark, CMSBitMap* bit_map) : 2442 _collector(collector), _sp(sp), _span(span), 2443 _past_remark(past_remark), _bit_map(bit_map) { } 2444 2445 virtual void do_oop(oop* p) { VerifyAllOopsClosure::do_oop_work(p); } 2446 virtual void do_oop(narrowOop* p) { VerifyAllOopsClosure::do_oop_work(p); } 2447 }; 2448 2449 void CompactibleFreeListSpace::verify() const { 2450 assert_lock_strong(&_freelistLock); 2451 verify_objects_initialized(); 2452 MemRegion span = _collector->_span; 2453 bool past_remark = (_collector->abstract_state() == 2454 CMSCollector::Sweeping); 2455 2456 ResourceMark rm; 2457 HandleMark hm; 2458 2459 // Check integrity of CFL data structures 2460 _promoInfo.verify(); 2461 _dictionary->verify(); 2462 if (FLSVerifyIndexTable) { 2463 verifyIndexedFreeLists(); 2464 } 2465 // Check integrity of all objects and free blocks in space 2466 { 2467 VerifyAllBlksClosure cl(this, span); 2468 ((CompactibleFreeListSpace*)this)->blk_iterate(&cl); // cast off const 2469 } 2470 // Check that all references in the heap to FLS 2471 // are to valid objects in FLS or that references in 2472 // FLS are to valid objects elsewhere in the heap 2473 if (FLSVerifyAllHeapReferences) 2474 { 2475 VerifyAllOopsClosure cl(_collector, this, span, past_remark, 2476 _collector->markBitMap()); 2477 CollectedHeap* ch = Universe::heap(); 2478 2479 // Iterate over all oops in the heap. Uses the _no_header version 2480 // since we are not interested in following the klass pointers. 2481 ch->oop_iterate_no_header(&cl); 2482 } 2483 2484 if (VerifyObjectStartArray) { 2485 // Verify the block offset table 2486 _bt.verify(); 2487 } 2488 } 2489 2490 #ifndef PRODUCT 2491 void CompactibleFreeListSpace::verifyFreeLists() const { 2492 if (FLSVerifyLists) { 2493 _dictionary->verify(); 2494 verifyIndexedFreeLists(); 2495 } else { 2496 if (FLSVerifyDictionary) { 2497 _dictionary->verify(); 2498 } 2499 if (FLSVerifyIndexTable) { 2500 verifyIndexedFreeLists(); 2501 } 2502 } 2503 } 2504 #endif 2505 2506 void CompactibleFreeListSpace::verifyIndexedFreeLists() const { 2507 size_t i = 0; 2508 for (; i < IndexSetStart; i++) { 2509 guarantee(_indexedFreeList[i].head() == NULL, "should be NULL"); 2510 } 2511 for (; i < IndexSetSize; i++) { 2512 verifyIndexedFreeList(i); 2513 } 2514 } 2515 2516 void CompactibleFreeListSpace::verifyIndexedFreeList(size_t size) const { 2517 FreeChunk* fc = _indexedFreeList[size].head(); 2518 FreeChunk* tail = _indexedFreeList[size].tail(); 2519 size_t num = _indexedFreeList[size].count(); 2520 size_t n = 0; 2521 guarantee(((size >= IndexSetStart) && (size % IndexSetStride == 0)) || fc == NULL, 2522 "Slot should have been empty"); 2523 for (; fc != NULL; fc = fc->next(), n++) { 2524 guarantee(fc->size() == size, "Size inconsistency"); 2525 guarantee(fc->is_free(), "!free?"); 2526 guarantee(fc->next() == NULL || fc->next()->prev() == fc, "Broken list"); 2527 guarantee((fc->next() == NULL) == (fc == tail), "Incorrect tail"); 2528 } 2529 guarantee(n == num, "Incorrect count"); 2530 } 2531 2532 #ifndef PRODUCT 2533 void CompactibleFreeListSpace::check_free_list_consistency() const { 2534 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size() <= IndexSetSize), 2535 "Some sizes can't be allocated without recourse to" 2536 " linear allocation buffers"); 2537 assert((TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >::min_size()*HeapWordSize == sizeof(TreeChunk<FreeChunk, AdaptiveFreeList<FreeChunk> >)), 2538 "else MIN_TREE_CHUNK_SIZE is wrong"); 2539 assert(IndexSetStart != 0, "IndexSetStart not initialized"); 2540 assert(IndexSetStride != 0, "IndexSetStride not initialized"); 2541 } 2542 #endif 2543 2544 void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { 2545 assert_lock_strong(&_freelistLock); 2546 AdaptiveFreeList<FreeChunk> total; 2547 gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count); 2548 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); 2549 size_t total_free = 0; 2550 for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { 2551 const AdaptiveFreeList<FreeChunk> *fl = &_indexedFreeList[i]; 2552 total_free += fl->count() * fl->size(); 2553 if (i % (40*IndexSetStride) == 0) { 2554 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size"); 2555 } 2556 fl->print_on(gclog_or_tty); 2557 total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); 2558 total.set_surplus( total.surplus() + fl->surplus() ); 2559 total.set_desired( total.desired() + fl->desired() ); 2560 total.set_prev_sweep( total.prev_sweep() + fl->prev_sweep() ); 2561 total.set_before_sweep(total.before_sweep() + fl->before_sweep()); 2562 total.set_count( total.count() + fl->count() ); 2563 total.set_coal_births( total.coal_births() + fl->coal_births() ); 2564 total.set_coal_deaths( total.coal_deaths() + fl->coal_deaths() ); 2565 total.set_split_births(total.split_births() + fl->split_births()); 2566 total.set_split_deaths(total.split_deaths() + fl->split_deaths()); 2567 } 2568 total.print_on(gclog_or_tty, "TOTAL"); 2569 gclog_or_tty->print_cr("Total free in indexed lists " 2570 SIZE_FORMAT " words", total_free); 2571 gclog_or_tty->print("growth: %8.5f deficit: %8.5f\n", 2572 (double)(total.split_births()+total.coal_births()-total.split_deaths()-total.coal_deaths())/ 2573 (total.prev_sweep() != 0 ? (double)total.prev_sweep() : 1.0), 2574 (double)(total.desired() - total.count())/(total.desired() != 0 ? (double)total.desired() : 1.0)); 2575 _dictionary->print_dict_census(); 2576 } 2577 2578 /////////////////////////////////////////////////////////////////////////// 2579 // CFLS_LAB 2580 /////////////////////////////////////////////////////////////////////////// 2581 2582 #define VECTOR_257(x) \ 2583 /* 1 2 3 4 5 6 7 8 9 1x 11 12 13 14 15 16 17 18 19 2x 21 22 23 24 25 26 27 28 29 3x 31 32 */ \ 2584 { x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2585 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2586 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2587 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2588 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2589 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2590 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2591 x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, \ 2592 x } 2593 2594 // Initialize with default setting of CMSParPromoteBlocksToClaim, _not_ 2595 // OldPLABSize, whose static default is different; if overridden at the 2596 // command-line, this will get reinitialized via a call to 2597 // modify_initialization() below. 2598 AdaptiveWeightedAverage CFLS_LAB::_blocks_to_claim[] = 2599 VECTOR_257(AdaptiveWeightedAverage(OldPLABWeight, (float)CMSParPromoteBlocksToClaim)); 2600 size_t CFLS_LAB::_global_num_blocks[] = VECTOR_257(0); 2601 uint CFLS_LAB::_global_num_workers[] = VECTOR_257(0); 2602 2603 CFLS_LAB::CFLS_LAB(CompactibleFreeListSpace* cfls) : 2604 _cfls(cfls) 2605 { 2606 assert(CompactibleFreeListSpace::IndexSetSize == 257, "Modify VECTOR_257() macro above"); 2607 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2608 i < CompactibleFreeListSpace::IndexSetSize; 2609 i += CompactibleFreeListSpace::IndexSetStride) { 2610 _indexedFreeList[i].set_size(i); 2611 _num_blocks[i] = 0; 2612 } 2613 } 2614 2615 static bool _CFLS_LAB_modified = false; 2616 2617 void CFLS_LAB::modify_initialization(size_t n, unsigned wt) { 2618 assert(!_CFLS_LAB_modified, "Call only once"); 2619 _CFLS_LAB_modified = true; 2620 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2621 i < CompactibleFreeListSpace::IndexSetSize; 2622 i += CompactibleFreeListSpace::IndexSetStride) { 2623 _blocks_to_claim[i].modify(n, wt, true /* force */); 2624 } 2625 } 2626 2627 HeapWord* CFLS_LAB::alloc(size_t word_sz) { 2628 FreeChunk* res; 2629 assert(word_sz == _cfls->adjustObjectSize(word_sz), "Error"); 2630 if (word_sz >= CompactibleFreeListSpace::IndexSetSize) { 2631 // This locking manages sync with other large object allocations. 2632 MutexLockerEx x(_cfls->parDictionaryAllocLock(), 2633 Mutex::_no_safepoint_check_flag); 2634 res = _cfls->getChunkFromDictionaryExact(word_sz); 2635 if (res == NULL) return NULL; 2636 } else { 2637 AdaptiveFreeList<FreeChunk>* fl = &_indexedFreeList[word_sz]; 2638 if (fl->count() == 0) { 2639 // Attempt to refill this local free list. 2640 get_from_global_pool(word_sz, fl); 2641 // If it didn't work, give up. 2642 if (fl->count() == 0) return NULL; 2643 } 2644 res = fl->get_chunk_at_head(); 2645 assert(res != NULL, "Why was count non-zero?"); 2646 } 2647 res->markNotFree(); 2648 assert(!res->is_free(), "shouldn't be marked free"); 2649 assert(oop(res)->klass_or_null() == NULL, "should look uninitialized"); 2650 // mangle a just allocated object with a distinct pattern. 2651 debug_only(res->mangleAllocated(word_sz)); 2652 return (HeapWord*)res; 2653 } 2654 2655 // Get a chunk of blocks of the right size and update related 2656 // book-keeping stats 2657 void CFLS_LAB::get_from_global_pool(size_t word_sz, AdaptiveFreeList<FreeChunk>* fl) { 2658 // Get the #blocks we want to claim 2659 size_t n_blks = (size_t)_blocks_to_claim[word_sz].average(); 2660 assert(n_blks > 0, "Error"); 2661 assert(ResizeOldPLAB || n_blks == OldPLABSize, "Error"); 2662 // In some cases, when the application has a phase change, 2663 // there may be a sudden and sharp shift in the object survival 2664 // profile, and updating the counts at the end of a scavenge 2665 // may not be quick enough, giving rise to large scavenge pauses 2666 // during these phase changes. It is beneficial to detect such 2667 // changes on-the-fly during a scavenge and avoid such a phase-change 2668 // pothole. The following code is a heuristic attempt to do that. 2669 // It is protected by a product flag until we have gained 2670 // enough experience with this heuristic and fine-tuned its behaviour. 2671 // WARNING: This might increase fragmentation if we overreact to 2672 // small spikes, so some kind of historical smoothing based on 2673 // previous experience with the greater reactivity might be useful. 2674 // Lacking sufficient experience, CMSOldPLABResizeQuicker is disabled by 2675 // default. 2676 if (ResizeOldPLAB && CMSOldPLABResizeQuicker) { 2677 size_t multiple = _num_blocks[word_sz]/(CMSOldPLABToleranceFactor*CMSOldPLABNumRefills*n_blks); 2678 n_blks += CMSOldPLABReactivityFactor*multiple*n_blks; 2679 n_blks = MIN2(n_blks, CMSOldPLABMax); 2680 } 2681 assert(n_blks > 0, "Error"); 2682 _cfls->par_get_chunk_of_blocks(word_sz, n_blks, fl); 2683 // Update stats table entry for this block size 2684 _num_blocks[word_sz] += fl->count(); 2685 } 2686 2687 void CFLS_LAB::compute_desired_plab_size() { 2688 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2689 i < CompactibleFreeListSpace::IndexSetSize; 2690 i += CompactibleFreeListSpace::IndexSetStride) { 2691 assert((_global_num_workers[i] == 0) == (_global_num_blocks[i] == 0), 2692 "Counter inconsistency"); 2693 if (_global_num_workers[i] > 0) { 2694 // Need to smooth wrt historical average 2695 if (ResizeOldPLAB) { 2696 _blocks_to_claim[i].sample( 2697 MAX2((size_t)CMSOldPLABMin, 2698 MIN2((size_t)CMSOldPLABMax, 2699 _global_num_blocks[i]/(_global_num_workers[i]*CMSOldPLABNumRefills)))); 2700 } 2701 // Reset counters for next round 2702 _global_num_workers[i] = 0; 2703 _global_num_blocks[i] = 0; 2704 if (PrintOldPLAB) { 2705 gclog_or_tty->print_cr("[" SIZE_FORMAT "]: " SIZE_FORMAT, i, (size_t)_blocks_to_claim[i].average()); 2706 } 2707 } 2708 } 2709 } 2710 2711 // If this is changed in the future to allow parallel 2712 // access, one would need to take the FL locks and, 2713 // depending on how it is used, stagger access from 2714 // parallel threads to reduce contention. 2715 void CFLS_LAB::retire(int tid) { 2716 // We run this single threaded with the world stopped; 2717 // so no need for locks and such. 2718 NOT_PRODUCT(Thread* t = Thread::current();) 2719 assert(Thread::current()->is_VM_thread(), "Error"); 2720 for (size_t i = CompactibleFreeListSpace::IndexSetStart; 2721 i < CompactibleFreeListSpace::IndexSetSize; 2722 i += CompactibleFreeListSpace::IndexSetStride) { 2723 assert(_num_blocks[i] >= (size_t)_indexedFreeList[i].count(), 2724 "Can't retire more than what we obtained"); 2725 if (_num_blocks[i] > 0) { 2726 size_t num_retire = _indexedFreeList[i].count(); 2727 assert(_num_blocks[i] > num_retire, "Should have used at least one"); 2728 { 2729 // MutexLockerEx x(_cfls->_indexedFreeListParLocks[i], 2730 // Mutex::_no_safepoint_check_flag); 2731 2732 // Update globals stats for num_blocks used 2733 _global_num_blocks[i] += (_num_blocks[i] - num_retire); 2734 _global_num_workers[i]++; 2735 assert(_global_num_workers[i] <= ParallelGCThreads, "Too big"); 2736 if (num_retire > 0) { 2737 _cfls->_indexedFreeList[i].prepend(&_indexedFreeList[i]); 2738 // Reset this list. 2739 _indexedFreeList[i] = AdaptiveFreeList<FreeChunk>(); 2740 _indexedFreeList[i].set_size(i); 2741 } 2742 } 2743 if (PrintOldPLAB) { 2744 gclog_or_tty->print_cr("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT, 2745 tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average()); 2746 } 2747 // Reset stats for next round 2748 _num_blocks[i] = 0; 2749 } 2750 } 2751 } 2752 2753 // Used by par_get_chunk_of_blocks() for the chunks from the 2754 // indexed_free_lists. Looks for a chunk with size that is a multiple 2755 // of "word_sz" and if found, splits it into "word_sz" chunks and add 2756 // to the free list "fl". "n" is the maximum number of chunks to 2757 // be added to "fl". 2758 bool CompactibleFreeListSpace:: par_get_chunk_of_blocks_IFL(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl) { 2759 2760 // We'll try all multiples of word_sz in the indexed set, starting with 2761 // word_sz itself and, if CMSSplitIndexedFreeListBlocks, try larger multiples, 2762 // then try getting a big chunk and splitting it. 2763 { 2764 bool found; 2765 int k; 2766 size_t cur_sz; 2767 for (k = 1, cur_sz = k * word_sz, found = false; 2768 (cur_sz < CompactibleFreeListSpace::IndexSetSize) && 2769 (CMSSplitIndexedFreeListBlocks || k <= 1); 2770 k++, cur_sz = k * word_sz) { 2771 AdaptiveFreeList<FreeChunk> fl_for_cur_sz; // Empty. 2772 fl_for_cur_sz.set_size(cur_sz); 2773 { 2774 MutexLockerEx x(_indexedFreeListParLocks[cur_sz], 2775 Mutex::_no_safepoint_check_flag); 2776 AdaptiveFreeList<FreeChunk>* gfl = &_indexedFreeList[cur_sz]; 2777 if (gfl->count() != 0) { 2778 // nn is the number of chunks of size cur_sz that 2779 // we'd need to split k-ways each, in order to create 2780 // "n" chunks of size word_sz each. 2781 const size_t nn = MAX2(n/k, (size_t)1); 2782 gfl->getFirstNChunksFromList(nn, &fl_for_cur_sz); 2783 found = true; 2784 if (k > 1) { 2785 // Update split death stats for the cur_sz-size blocks list: 2786 // we increment the split death count by the number of blocks 2787 // we just took from the cur_sz-size blocks list and which 2788 // we will be splitting below. 2789 ssize_t deaths = gfl->split_deaths() + 2790 fl_for_cur_sz.count(); 2791 gfl->set_split_deaths(deaths); 2792 } 2793 } 2794 } 2795 // Now transfer fl_for_cur_sz to fl. Common case, we hope, is k = 1. 2796 if (found) { 2797 if (k == 1) { 2798 fl->prepend(&fl_for_cur_sz); 2799 } else { 2800 // Divide each block on fl_for_cur_sz up k ways. 2801 FreeChunk* fc; 2802 while ((fc = fl_for_cur_sz.get_chunk_at_head()) != NULL) { 2803 // Must do this in reverse order, so that anybody attempting to 2804 // access the main chunk sees it as a single free block until we 2805 // change it. 2806 size_t fc_size = fc->size(); 2807 assert(fc->is_free(), "Error"); 2808 for (int i = k-1; i >= 0; i--) { 2809 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz); 2810 assert((i != 0) || 2811 ((fc == ffc) && ffc->is_free() && 2812 (ffc->size() == k*word_sz) && (fc_size == word_sz)), 2813 "Counting error"); 2814 ffc->set_size(word_sz); 2815 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2816 ffc->link_next(NULL); 2817 // Above must occur before BOT is updated below. 2818 OrderAccess::storestore(); 2819 // splitting from the right, fc_size == i * word_sz 2820 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */); 2821 fc_size -= word_sz; 2822 assert(fc_size == i*word_sz, "Error"); 2823 _bt.verify_not_unallocated((HeapWord*)ffc, word_sz); 2824 _bt.verify_single_block((HeapWord*)fc, fc_size); 2825 _bt.verify_single_block((HeapWord*)ffc, word_sz); 2826 // Push this on "fl". 2827 fl->return_chunk_at_head(ffc); 2828 } 2829 // TRAP 2830 assert(fl->tail()->next() == NULL, "List invariant."); 2831 } 2832 } 2833 // Update birth stats for this block size. 2834 size_t num = fl->count(); 2835 MutexLockerEx x(_indexedFreeListParLocks[word_sz], 2836 Mutex::_no_safepoint_check_flag); 2837 ssize_t births = _indexedFreeList[word_sz].split_births() + num; 2838 _indexedFreeList[word_sz].set_split_births(births); 2839 return true; 2840 } 2841 } 2842 return found; 2843 } 2844 } 2845 2846 FreeChunk* CompactibleFreeListSpace::get_n_way_chunk_to_split(size_t word_sz, size_t n) { 2847 2848 FreeChunk* fc = NULL; 2849 FreeChunk* rem_fc = NULL; 2850 size_t rem; 2851 { 2852 MutexLockerEx x(parDictionaryAllocLock(), 2853 Mutex::_no_safepoint_check_flag); 2854 while (n > 0) { 2855 fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()), 2856 FreeBlockDictionary<FreeChunk>::atLeast); 2857 if (fc != NULL) { 2858 break; 2859 } else { 2860 n--; 2861 } 2862 } 2863 if (fc == NULL) return NULL; 2864 // Otherwise, split up that block. 2865 assert((ssize_t)n >= 1, "Control point invariant"); 2866 assert(fc->is_free(), "Error: should be a free block"); 2867 _bt.verify_single_block((HeapWord*)fc, fc->size()); 2868 const size_t nn = fc->size() / word_sz; 2869 n = MIN2(nn, n); 2870 assert((ssize_t)n >= 1, "Control point invariant"); 2871 rem = fc->size() - n * word_sz; 2872 // If there is a remainder, and it's too small, allocate one fewer. 2873 if (rem > 0 && rem < MinChunkSize) { 2874 n--; rem += word_sz; 2875 } 2876 // Note that at this point we may have n == 0. 2877 assert((ssize_t)n >= 0, "Control point invariant"); 2878 2879 // If n is 0, the chunk fc that was found is not large 2880 // enough to leave a viable remainder. We are unable to 2881 // allocate even one block. Return fc to the 2882 // dictionary and return, leaving "fl" empty. 2883 if (n == 0) { 2884 returnChunkToDictionary(fc); 2885 return NULL; 2886 } 2887 2888 _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk 2889 dictionary()->dict_census_update(fc->size(), 2890 true /*split*/, 2891 false /*birth*/); 2892 2893 // First return the remainder, if any. 2894 // Note that we hold the lock until we decide if we're going to give 2895 // back the remainder to the dictionary, since a concurrent allocation 2896 // may otherwise see the heap as empty. (We're willing to take that 2897 // hit if the block is a small block.) 2898 if (rem > 0) { 2899 size_t prefix_size = n * word_sz; 2900 rem_fc = (FreeChunk*)((HeapWord*)fc + prefix_size); 2901 rem_fc->set_size(rem); 2902 rem_fc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2903 rem_fc->link_next(NULL); 2904 // Above must occur before BOT is updated below. 2905 assert((ssize_t)n > 0 && prefix_size > 0 && rem_fc > fc, "Error"); 2906 OrderAccess::storestore(); 2907 _bt.split_block((HeapWord*)fc, fc->size(), prefix_size); 2908 assert(fc->is_free(), "Error"); 2909 fc->set_size(prefix_size); 2910 if (rem >= IndexSetSize) { 2911 returnChunkToDictionary(rem_fc); 2912 dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/); 2913 rem_fc = NULL; 2914 } 2915 // Otherwise, return it to the small list below. 2916 } 2917 } 2918 if (rem_fc != NULL) { 2919 MutexLockerEx x(_indexedFreeListParLocks[rem], 2920 Mutex::_no_safepoint_check_flag); 2921 _bt.verify_not_unallocated((HeapWord*)rem_fc, rem_fc->size()); 2922 _indexedFreeList[rem].return_chunk_at_head(rem_fc); 2923 smallSplitBirth(rem); 2924 } 2925 assert(n * word_sz == fc->size(), 2926 err_msg("Chunk size " SIZE_FORMAT " is not exactly splittable by " 2927 SIZE_FORMAT " sized chunks of size " SIZE_FORMAT, 2928 fc->size(), n, word_sz)); 2929 return fc; 2930 } 2931 2932 void CompactibleFreeListSpace:: par_get_chunk_of_blocks_dictionary(size_t word_sz, size_t targetted_number_of_chunks, AdaptiveFreeList<FreeChunk>* fl) { 2933 2934 FreeChunk* fc = get_n_way_chunk_to_split(word_sz, targetted_number_of_chunks); 2935 2936 if (fc == NULL) { 2937 return; 2938 } 2939 2940 size_t n = fc->size() / word_sz; 2941 2942 assert((ssize_t)n > 0, "Consistency"); 2943 // Now do the splitting up. 2944 // Must do this in reverse order, so that anybody attempting to 2945 // access the main chunk sees it as a single free block until we 2946 // change it. 2947 size_t fc_size = n * word_sz; 2948 // All but first chunk in this loop 2949 for (ssize_t i = n-1; i > 0; i--) { 2950 FreeChunk* ffc = (FreeChunk*)((HeapWord*)fc + i * word_sz); 2951 ffc->set_size(word_sz); 2952 ffc->link_prev(NULL); // Mark as a free block for other (parallel) GC threads. 2953 ffc->link_next(NULL); 2954 // Above must occur before BOT is updated below. 2955 OrderAccess::storestore(); 2956 // splitting from the right, fc_size == (n - i + 1) * wordsize 2957 _bt.mark_block((HeapWord*)ffc, word_sz, true /* reducing */); 2958 fc_size -= word_sz; 2959 _bt.verify_not_unallocated((HeapWord*)ffc, ffc->size()); 2960 _bt.verify_single_block((HeapWord*)ffc, ffc->size()); 2961 _bt.verify_single_block((HeapWord*)fc, fc_size); 2962 // Push this on "fl". 2963 fl->return_chunk_at_head(ffc); 2964 } 2965 // First chunk 2966 assert(fc->is_free() && fc->size() == n*word_sz, "Error: should still be a free block"); 2967 // The blocks above should show their new sizes before the first block below 2968 fc->set_size(word_sz); 2969 fc->link_prev(NULL); // idempotent wrt free-ness, see assert above 2970 fc->link_next(NULL); 2971 _bt.verify_not_unallocated((HeapWord*)fc, fc->size()); 2972 _bt.verify_single_block((HeapWord*)fc, fc->size()); 2973 fl->return_chunk_at_head(fc); 2974 2975 assert((ssize_t)n > 0 && (ssize_t)n == fl->count(), "Incorrect number of blocks"); 2976 { 2977 // Update the stats for this block size. 2978 MutexLockerEx x(_indexedFreeListParLocks[word_sz], 2979 Mutex::_no_safepoint_check_flag); 2980 const ssize_t births = _indexedFreeList[word_sz].split_births() + n; 2981 _indexedFreeList[word_sz].set_split_births(births); 2982 // ssize_t new_surplus = _indexedFreeList[word_sz].surplus() + n; 2983 // _indexedFreeList[word_sz].set_surplus(new_surplus); 2984 } 2985 2986 // TRAP 2987 assert(fl->tail()->next() == NULL, "List invariant."); 2988 } 2989 2990 void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList<FreeChunk>* fl) { 2991 assert(fl->count() == 0, "Precondition."); 2992 assert(word_sz < CompactibleFreeListSpace::IndexSetSize, 2993 "Precondition"); 2994 2995 if (par_get_chunk_of_blocks_IFL(word_sz, n, fl)) { 2996 // Got it 2997 return; 2998 } 2999 3000 // Otherwise, we'll split a block from the dictionary. 3001 par_get_chunk_of_blocks_dictionary(word_sz, n, fl); 3002 } 3003 3004 // Set up the space's par_seq_tasks structure for work claiming 3005 // for parallel rescan. See CMSParRemarkTask where this is currently used. 3006 // XXX Need to suitably abstract and generalize this and the next 3007 // method into one. 3008 void 3009 CompactibleFreeListSpace:: 3010 initialize_sequential_subtasks_for_rescan(int n_threads) { 3011 // The "size" of each task is fixed according to rescan_task_size. 3012 assert(n_threads > 0, "Unexpected n_threads argument"); 3013 const size_t task_size = rescan_task_size(); 3014 size_t n_tasks = (used_region().word_size() + task_size - 1)/task_size; 3015 assert((n_tasks == 0) == used_region().is_empty(), "n_tasks incorrect"); 3016 assert(n_tasks == 0 || 3017 ((used_region().start() + (n_tasks - 1)*task_size < used_region().end()) && 3018 (used_region().start() + n_tasks*task_size >= used_region().end())), 3019 "n_tasks calculation incorrect"); 3020 SequentialSubTasksDone* pst = conc_par_seq_tasks(); 3021 assert(!pst->valid(), "Clobbering existing data?"); 3022 // Sets the condition for completion of the subtask (how many threads 3023 // need to finish in order to be done). 3024 pst->set_n_threads(n_threads); 3025 pst->set_n_tasks((int)n_tasks); 3026 } 3027 3028 // Set up the space's par_seq_tasks structure for work claiming 3029 // for parallel concurrent marking. See CMSConcMarkTask where this is currently used. 3030 void 3031 CompactibleFreeListSpace:: 3032 initialize_sequential_subtasks_for_marking(int n_threads, 3033 HeapWord* low) { 3034 // The "size" of each task is fixed according to rescan_task_size. 3035 assert(n_threads > 0, "Unexpected n_threads argument"); 3036 const size_t task_size = marking_task_size(); 3037 assert(task_size > CardTableModRefBS::card_size_in_words && 3038 (task_size % CardTableModRefBS::card_size_in_words == 0), 3039 "Otherwise arithmetic below would be incorrect"); 3040 MemRegion span = _gen->reserved(); 3041 if (low != NULL) { 3042 if (span.contains(low)) { 3043 // Align low down to a card boundary so that 3044 // we can use block_offset_careful() on span boundaries. 3045 HeapWord* aligned_low = (HeapWord*)align_size_down((uintptr_t)low, 3046 CardTableModRefBS::card_size); 3047 // Clip span prefix at aligned_low 3048 span = span.intersection(MemRegion(aligned_low, span.end())); 3049 } else if (low > span.end()) { 3050 span = MemRegion(low, low); // Null region 3051 } // else use entire span 3052 } 3053 assert(span.is_empty() || 3054 ((uintptr_t)span.start() % CardTableModRefBS::card_size == 0), 3055 "span should start at a card boundary"); 3056 size_t n_tasks = (span.word_size() + task_size - 1)/task_size; 3057 assert((n_tasks == 0) == span.is_empty(), "Inconsistency"); 3058 assert(n_tasks == 0 || 3059 ((span.start() + (n_tasks - 1)*task_size < span.end()) && 3060 (span.start() + n_tasks*task_size >= span.end())), 3061 "n_tasks calculation incorrect"); 3062 SequentialSubTasksDone* pst = conc_par_seq_tasks(); 3063 assert(!pst->valid(), "Clobbering existing data?"); 3064 // Sets the condition for completion of the subtask (how many threads 3065 // need to finish in order to be done). 3066 pst->set_n_threads(n_threads); 3067 pst->set_n_tasks((int)n_tasks); 3068 }